diff --git a/.htaccess b/.htaccess index a0d1710a8aa55721fbdae884b0018c1a9d254c95..1636ce4bc50cb2467a042043dea042ce99ad1e4f 100644 --- a/.htaccess +++ b/.htaccess @@ -58,6 +58,32 @@ </IfModule> +<IfModule mod_php7.c> + +############################################ +## adjust memory limit + + php_value memory_limit 768M + php_value max_execution_time 18000 + +############################################ +## disable automatic session start +## before autoload was initialized + + php_flag session.auto_start off + +############################################ +## enable resulting html compression + + #php_flag zlib.output_compression on + +########################################### +## disable user agent verification to not break multiple image upload + + php_flag suhosin.session.cryptua off + +</IfModule> + <IfModule mod_security.c> ########################################### ## disable POST processing to not break multiple image upload diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/AjaxMarkAsRead.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/AjaxMarkAsRead.php index 793cbe2252531cd6f554f3d4d16b99d8b93ae9d5..53f8a7fc3ae44811e1262a266851c37a5d8ffd8a 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/AjaxMarkAsRead.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/AjaxMarkAsRead.php @@ -13,7 +13,7 @@ class AjaxMarkAsRead extends \Magento\AdminNotification\Controller\Adminhtml\Not * * @return void */ - public function execute() + public function executeInternal() { if (!$this->getRequest()->getPostValue()) { return; diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Index.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Index.php index 15b88e4c2b6eeb75745da7aeab6e28a0fbcf7c99..df4b3465ad9e85c6992883678dc9a6856931b626 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Index.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\AdminNotification\Controller\Adminhtml\Notification /** * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu( diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php index bcf66825edf6bdc85f27680298c2129b2cb46d02..fe11c65da690e2d0c92d71710d285b0bd495fef8 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php @@ -11,7 +11,7 @@ class MarkAsRead extends \Magento\AdminNotification\Controller\Adminhtml\Notific /** * @return void */ - public function execute() + public function executeInternal() { $notificationId = (int)$this->getRequest()->getParam('id'); if ($notificationId) { diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php index 78090163aa6a2a7f1a8637026c19aa70ffdc5b5b..3f923e05797a3ffe49af9ab5405420aad5a29f9f 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php @@ -11,7 +11,7 @@ class MassMarkAsRead extends \Magento\AdminNotification\Controller\Adminhtml\Not /** * @return void */ - public function execute() + public function executeInternal() { $ids = $this->getRequest()->getParam('notification'); if (!is_array($ids)) { diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php index 4b0068520ba3e0c4f69116dc9d04de411cc0783f..fd73d3cece48da321c906e62b52e7b54f01205d2 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php @@ -11,7 +11,7 @@ class MassRemove extends \Magento\AdminNotification\Controller\Adminhtml\Notific /** * @return void */ - public function execute() + public function executeInternal() { $ids = $this->getRequest()->getParam('notification'); if (!is_array($ids)) { diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php index b4fe7e0e29596d2bd81fae0ec3430e1a3f545e77..81a62e76134837d7fe35e6616041cd5a13c6e54e 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php @@ -11,7 +11,7 @@ class Remove extends \Magento\AdminNotification\Controller\Adminhtml\Notificatio /** * @return void */ - public function execute() + public function executeInternal() { if ($id = $this->getRequest()->getParam('id')) { $model = $this->_objectManager->create('Magento\AdminNotification\Model\Inbox')->load($id); diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php index 4bf51c2df29028bc4db7247efa59dcad9840897c..e173f1df1022d53ae6d2607c1bffe5c8fee373f3 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message/ListAction.php @@ -38,7 +38,7 @@ class ListAction extends \Magento\Backend\App\AbstractAction /** * @return void */ - public function execute() + public function executeInternal() { $severity = $this->getRequest()->getParam('severity'); if ($severity) { diff --git a/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/Media/Synchronization/SuccessTest.php b/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/Media/Synchronization/SuccessTest.php deleted file mode 100644 index a33e8800f2eceb6c9f86c5e6c134721fc39e7234..0000000000000000000000000000000000000000 --- a/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/Media/Synchronization/SuccessTest.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\AdminNotification\Test\Unit\Model\System\Message\Media\Synchronization; - -class SuccessTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_syncFlagMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_fileStorage; - - /** - * @var \Magento\AdminNotification\Model\System\Message\Media\Synchronization\Success - */ - protected $_model; - - protected function setUp() - { - $this->_syncFlagMock = $this->getMock( - 'Magento\MediaStorage\Model\File\Storage\Flag', - ['getState', 'getFlagData', 'setState', '__sleep', '__wakeup', 'save'], - [], - '', - false - ); - - $this->_fileStorage = $this->getMock('Magento\MediaStorage\Model\File\Storage\Flag', [], [], '', false); - $this->_fileStorage->expects($this->any())->method('loadSelf')->will($this->returnValue($this->_syncFlagMock)); - - $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $arguments = ['fileStorage' => $this->_fileStorage]; - $this->_model = $objectManagerHelper->getObject( - 'Magento\AdminNotification\Model\System\Message\Media\Synchronization\Success', - $arguments - ); - } - - public function testGetText() - { - $messageText = 'Synchronization of media storages has been completed'; - - $this->assertContains($messageText, (string)$this->_model->getText()); - } - - /** - * @param bool $expectedFirstRun - * @param array $data - * @param int|bool $state - * @return void - * @dataProvider isDisplayedDataProvider - */ - public function testIsDisplayed($expectedFirstRun, $data, $state) - { - $arguments = ['fileStorage' => $this->_fileStorage]; - $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - - $this->_syncFlagMock->expects($this->any())->method('getState')->will($this->returnValue($state)); - $this->_syncFlagMock->expects($this->any())->method('getFlagData')->will($this->returnValue($data)); - - // create new instance to ensure that it hasn't been displayed yet (var $this->_isDisplayed is unset) - /** @var $model \Magento\AdminNotification\Model\System\Message\Media\Synchronization\Success */ - $model = $objectManagerHelper->getObject( - 'Magento\AdminNotification\Model\System\Message\Media\Synchronization\Success', - $arguments - ); - //check first call - $this->assertEquals($expectedFirstRun, $model->isDisplayed()); - //check second call - $this->assertEquals($expectedFirstRun, $model->isDisplayed()); - } - - public function isDisplayedDataProvider() - { - return [ - [false, ['has_errors' => 1], \Magento\MediaStorage\Model\File\Storage\Flag::STATE_FINISHED], - [false, ['has_errors' => true], false], - [true, [], \Magento\MediaStorage\Model\File\Storage\Flag::STATE_FINISHED], - [false, ['has_errors' => 0], \Magento\MediaStorage\Model\File\Storage\Flag::STATE_RUNNING], - [true, ['has_errors' => 0], \Magento\MediaStorage\Model\File\Storage\Flag::STATE_FINISHED] - ]; - } - - public function testGetIdentity() - { - $this->assertEquals('MEDIA_SYNCHRONIZATION_SUCCESS', $this->_model->getIdentity()); - } - - public function testGetSeverity() - { - $severity = \Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR; - $this->assertEquals($severity, $this->_model->getSeverity()); - } -} diff --git a/app/code/Magento/AdvancedPricingImportExport/Controller/Adminhtml/Export/GetFilter.php b/app/code/Magento/AdvancedPricingImportExport/Controller/Adminhtml/Export/GetFilter.php index 945c25b67b96133640a6cd4cb4b2259b118480f2..d41f9c69c2a52d9be7a2bc05c077bc7e822e5389 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Controller/Adminhtml/Export/GetFilter.php +++ b/app/code/Magento/AdvancedPricingImportExport/Controller/Adminhtml/Export/GetFilter.php @@ -17,7 +17,7 @@ class GetFilter extends ExportController * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getParams(); if ($this->getRequest()->isXmlHttpRequest() && $data) { diff --git a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Place.php b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Place.php index 3da7f100f75b5e95460a30a5c2ab744e49a05eb5..2934f7a00ccd84f5f06734dbc45793e28fc16c6d 100644 --- a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Place.php +++ b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Place.php @@ -51,7 +51,7 @@ class Place extends \Magento\Sales\Controller\Adminhtml\Order\Create * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ - public function execute() + public function executeInternal() { $paymentParam = $this->getRequest()->getParam('payment'); $controller = $this->getRequest()->getParam('controller'); diff --git a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Redirect.php b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Redirect.php index d147c3d91e1ff1b829d9e4cee9160e59ac0d61ec..2387a1bf5b7c14f35c60341e7f1e3d238a1bcf4e 100644 --- a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Redirect.php +++ b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/Redirect.php @@ -90,7 +90,7 @@ class Redirect extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $redirectParams = $this->getRequest()->getParams(); $params = []; diff --git a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/ReturnQuote.php b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/ReturnQuote.php index 7ac7153fecf4b9530677dc01627bb916ac912b5c..ae85af3ad689b39d1d89b3570062ed8504507337 100644 --- a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/ReturnQuote.php +++ b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/ReturnQuote.php @@ -31,7 +31,7 @@ class ReturnQuote extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return void */ - public function execute() + public function executeInternal() { $this->_returnQuote(); $this->getResponse()->representJson( diff --git a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/BackendResponse.php b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/BackendResponse.php index 6f0696fbf9d1e883f39a129c8a47b6d2fd007615..5dc96c39a91e95e99d283a803ce61e4e08ad0a60 100644 --- a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/BackendResponse.php +++ b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/BackendResponse.php @@ -14,7 +14,7 @@ class BackendResponse extends \Magento\Authorizenet\Controller\Directpost\Paymen * * @return void */ - public function execute() + public function executeInternal() { $this->_responseAction('adminhtml'); } diff --git a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Place.php b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Place.php index 2cb3ea542105450eb75085c56ec6972f4a0dc0cb..7a13d0ba6c0a80d90bf4a4957c851479cb16fbc2 100644 --- a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Place.php +++ b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Place.php @@ -71,7 +71,7 @@ class Place extends Payment * * @return string */ - public function execute() + public function executeInternal() { $paymentParam = $this->getRequest()->getParam('payment'); $controller = $this->getRequest()->getParam('controller'); diff --git a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Redirect.php b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Redirect.php index 0a0fc1a99066842bd1f581897718898058bacd89..421e4f04fe13eee2fd92b56e6d55011a87b278a5 100644 --- a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Redirect.php +++ b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Redirect.php @@ -15,7 +15,7 @@ class Redirect extends \Magento\Authorizenet\Controller\Directpost\Payment * * @return void */ - public function execute() + public function executeInternal() { $helper = $this->dataFactory->create('frontend'); diff --git a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Response.php b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Response.php index 7a25db11b46f627a6119add42650d8d3c887b503..541571db6d9cc3232aa74f576f7b1e521a941ba6 100644 --- a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Response.php +++ b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/Response.php @@ -14,7 +14,7 @@ class Response extends \Magento\Authorizenet\Controller\Directpost\Payment * * @return void */ - public function execute() + public function executeInternal() { $this->_responseAction('frontend'); } diff --git a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/ReturnQuote.php b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/ReturnQuote.php index 1cef3b032864d0a2a5b7caa61b61940b62cec0b2..b90112bca7f932212d57816fb319c9890cf78942 100644 --- a/app/code/Magento/Authorizenet/Controller/Directpost/Payment/ReturnQuote.php +++ b/app/code/Magento/Authorizenet/Controller/Directpost/Payment/ReturnQuote.php @@ -13,7 +13,7 @@ class ReturnQuote extends \Magento\Authorizenet\Controller\Directpost\Payment * * @return void */ - public function execute() + public function executeInternal() { $this->_returnCustomerQuote(); $this->getResponse()->representJson( diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet.php b/app/code/Magento/Authorizenet/Model/Authorizenet.php index b35e4f4c39911df89d553ef98ad77eba768ccf3c..4ad08d89cc495556bd4b5b794417fb7185817d92 100644 --- a/app/code/Magento/Authorizenet/Model/Authorizenet.php +++ b/app/code/Magento/Authorizenet/Model/Authorizenet.php @@ -6,6 +6,7 @@ namespace Magento\Authorizenet\Model; use Magento\Authorizenet\Model\TransactionService; +use Magento\Framework\HTTP\ZendClientFactory; /** * @SuppressWarnings(PHPMD.TooManyFields) @@ -97,6 +98,11 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc */ protected $_debugReplacePrivateDataKeys = ['merchantAuthentication', 'x_login']; + /** + * @var \Magento\Framework\HTTP\ZendClientFactory + */ + protected $httpClientFactory; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -111,6 +117,7 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc * @param \Magento\Authorizenet\Model\Request\Factory $requestFactory * @param \Magento\Authorizenet\Model\Response\Factory $responseFactory * @param \Magento\Authorizenet\Model\TransactionService $transactionService + * @param \Magento\Framework\HTTP\ZendClientFactory $httpClientFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data @@ -130,6 +137,7 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc \Magento\Authorizenet\Model\Request\Factory $requestFactory, \Magento\Authorizenet\Model\Response\Factory $responseFactory, TransactionService $transactionService, + ZendClientFactory $httpClientFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] @@ -138,6 +146,7 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc $this->requestFactory = $requestFactory; $this->responseFactory = $responseFactory; $this->transactionService = $transactionService; + $this->httpClientFactory = $httpClientFactory; parent::__construct( $context, @@ -370,7 +379,8 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc protected function postRequest(\Magento\Authorizenet\Model\Request $request) { $result = $this->responseFactory->create(); - $client = new \Magento\Framework\HTTP\ZendClient(); + /** @var \Magento\Framework\HTTP\ZendClient $client */ + $client = $this->httpClientFactory->create(); $url = $this->getConfigData('cgi_url') ?: self::CGI_URL; $debugData = ['url' => $url, 'request' => $request->getData()]; $client->setUri($url); diff --git a/app/code/Magento/Authorizenet/Model/Directpost.php b/app/code/Magento/Authorizenet/Model/Directpost.php index bbfcd0f7d6e128fb7d0e5d0740223ef42282c469..68fd630f21f4593740fed6288e3821b87677d7db 100644 --- a/app/code/Magento/Authorizenet/Model/Directpost.php +++ b/app/code/Magento/Authorizenet/Model/Directpost.php @@ -6,6 +6,7 @@ namespace Magento\Authorizenet\Model; use Magento\Authorizenet\Model\TransactionService; +use Magento\Framework\HTTP\ZendClientFactory; use Magento\Payment\Model\Method\ConfigInterface; use Magento\Payment\Model\Method\TransparentInterface; use Magento\Sales\Model\Order\Email\Sender\OrderSender; @@ -132,6 +133,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra * @param Directpost\Request\Factory $requestFactory * @param Directpost\Response\Factory $responseFactory * @param \Magento\Authorizenet\Model\TransactionService $transactionService + * @param \Magento\Framework\HTTP\ZendClientFactory $httpClientFactory * @param \Magento\Sales\Model\OrderFactory $orderFactory * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Quote\Model\QuoteRepository $quoteRepository @@ -156,6 +158,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra \Magento\Authorizenet\Model\Directpost\Request\Factory $requestFactory, \Magento\Authorizenet\Model\Directpost\Response\Factory $responseFactory, TransactionService $transactionService, + ZendClientFactory $httpClientFactory, \Magento\Sales\Model\OrderFactory $orderFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Quote\Model\QuoteRepository $quoteRepository, @@ -187,6 +190,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra $requestFactory, $responseFactory, $transactionService, + $httpClientFactory, $resource, $resourceCollection, $data @@ -404,9 +408,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra if ($result->getXTransId() != $payment->getParentTransactionId()) { $payment->setTransactionId($result->getXTransId()); } - $shouldCloseCaptureTransaction = $payment->getOrder()->canCreditmemo() ? 0 : 1; - $payment->setIsTransactionClosed(1) - ->setShouldCloseParentTransaction($shouldCloseCaptureTransaction) + $payment->setIsTransactionClosed(true) ->setTransactionAdditionalInfo(self::REAL_TRANSACTION_ID_KEY, $result->getXTransId()); return $this; } diff --git a/app/code/Magento/Authorizenet/Test/Unit/Controller/Adminhtml/Authorizenet/Directpost/Payment/RedirectTest.php b/app/code/Magento/Authorizenet/Test/Unit/Controller/Adminhtml/Authorizenet/Directpost/Payment/RedirectTest.php index ad7bb7b5c0245be5122b03c3a9c68eca22afc715..ff31be443710cec29c1608b1cd3609ca37148254 100644 --- a/app/code/Magento/Authorizenet/Test/Unit/Controller/Adminhtml/Authorizenet/Directpost/Payment/RedirectTest.php +++ b/app/code/Magento/Authorizenet/Test/Unit/Controller/Adminhtml/Authorizenet/Directpost/Payment/RedirectTest.php @@ -96,6 +96,11 @@ class RedirectTest extends \PHPUnit_Framework_TestCase */ protected $helperMock; + /** + * @var Redirect|\PHPUnit_Framework_MockObject_MockObject + */ + protected $controller; + protected function setUp() { $this->directpostSessionMock = $this->getMockBuilder('Magento\Authorizenet\Model\Directpost\Session') @@ -196,7 +201,7 @@ class RedirectTest extends \PHPUnit_Framework_TestCase ); } - public function testExecuteErrorMsgWithoutCancelOrder() + public function testExecuteInternalErrorMsgWithoutCancelOrder() { $params = ['success' => 0, 'error_msg' => 'Error message']; $incrementId = 1; @@ -238,10 +243,10 @@ class RedirectTest extends \PHPUnit_Framework_TestCase ->method('register') ->with(Iframe::REGISTRY_KEY); - $this->assertInstanceOf('\Magento\Framework\View\Result\Layout', $this->controller->execute()); + $this->assertInstanceOf('\Magento\Framework\View\Result\Layout', $this->controller->executeInternal()); } - public function testExecuteErrorMsgWithCancelOrder() + public function testExecuteInternalErrorMsgWithCancelOrder() { $params = ['success' => 0, 'error_msg' => 'Error message', 'x_invoice_num' => 1]; $incrementId = 1; @@ -273,10 +278,10 @@ class RedirectTest extends \PHPUnit_Framework_TestCase ->method('register') ->with(Iframe::REGISTRY_KEY); - $this->assertInstanceOf('\Magento\Framework\View\Result\Layout', $this->controller->execute()); + $this->assertInstanceOf('\Magento\Framework\View\Result\Layout', $this->controller->executeInternal()); } - public function testExecuteSuccess() + public function testExecuteInternalSuccess() { $params = ['success' => 1, 'controller_action_name' => 'action', 'x_invoice_num' => 1]; $this->requestMock->expects($this->once()) @@ -307,6 +312,6 @@ class RedirectTest extends \PHPUnit_Framework_TestCase ->method('register') ->with(Iframe::REGISTRY_KEY); - $this->assertInstanceOf('\Magento\Framework\View\Result\Layout', $this->controller->execute()); + $this->assertInstanceOf('\Magento\Framework\View\Result\Layout', $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Authorizenet/Test/Unit/Controller/Directpost/Payment/PlaceTest.php b/app/code/Magento/Authorizenet/Test/Unit/Controller/Directpost/Payment/PlaceTest.php index 517b9e41f7db78c7293fc805d45049191dc2f72f..a80b7b41420efe99bdefbcfe50cac8a1455ecb9a 100644 --- a/app/code/Magento/Authorizenet/Test/Unit/Controller/Directpost/Payment/PlaceTest.php +++ b/app/code/Magento/Authorizenet/Test/Unit/Controller/Directpost/Payment/PlaceTest.php @@ -205,7 +205,7 @@ class PlaceTest extends \PHPUnit_Framework_TestCase ->method('jsonEncode') ->with($result); - $this->placeOrderController->execute(); + $this->placeOrderController->executeInternal(); } /** @@ -243,7 +243,7 @@ class PlaceTest extends \PHPUnit_Framework_TestCase ->method('jsonEncode') ->with($result); - $this->placeOrderController->execute(); + $this->placeOrderController->executeInternal(); } /** diff --git a/app/code/Magento/Authorizenet/Test/Unit/Model/DirectpostTest.php b/app/code/Magento/Authorizenet/Test/Unit/Model/DirectpostTest.php index 3247ed2cb9329f86e0efda4e07aeae938515f05b..3726d4e5108ae84b6076a8e39b4e8b628620a7f9 100644 --- a/app/code/Magento/Authorizenet/Test/Unit/Model/DirectpostTest.php +++ b/app/code/Magento/Authorizenet/Test/Unit/Model/DirectpostTest.php @@ -9,13 +9,21 @@ use Magento\Framework\Simplexml\Element; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; use Magento\Authorizenet\Model\Directpost; use Magento\Authorizenet\Model\TransactionService; +use Magento\Authorizenet\Model\Request; +use Magento\Authorizenet\Model\Directpost\Request\Factory; +use Magento\Sales\Model\Order; use Magento\Sales\Model\Order\Payment\Transaction\Repository as TransactionRepository; /** * Class DirectpostTest + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class DirectpostTest extends \PHPUnit_Framework_TestCase { + const TOTAL_AMOUNT = 100.02; + const INVOICE_NUM = '00000001'; + const TRANSACTION_ID = '41a23x34fd124'; + /** * @var \Magento\Authorizenet\Model\Directpost */ @@ -56,6 +64,16 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase */ protected $transactionServiceMock; + /** + * @var \Magento\Framework\HTTP\ZendClient|\PHPUnit_Framework_MockObject_MockObject + */ + protected $httpClientMock; + + /** + * @var \Magento\Authorizenet\Model\Directpost\Request\Factory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $requestFactory; + protected function setUp() { $this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') @@ -64,7 +82,8 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->setMethods([ 'getOrder', 'getId', 'setAdditionalInformation', 'getAdditionalInformation', - 'setIsTransactionDenied', 'setIsTransactionClosed' + 'setIsTransactionDenied', 'setIsTransactionClosed', 'decrypt', 'getCcLast4', + 'getParentTransactionId', 'getPoNumber' ]) ->getMock(); $this->dataHelperMock = $this->getMockBuilder('Magento\Authorizenet\Helper\Data') @@ -85,15 +104,20 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase ->setMethods(['getTransactionDetails']) ->getMock(); + $this->requestFactory = $this->getRequestFactoryMock(); + $httpClientFactoryMock = $this->getHttpClientFactoryMock(); + $helper = new ObjectManagerHelper($this); $this->directpost = $helper->getObject( 'Magento\Authorizenet\Model\Directpost', [ 'scopeConfig' => $this->scopeConfigMock, 'dataHelper' => $this->dataHelperMock, + 'requestFactory' => $this->requestFactory, 'responseFactory' => $this->responseFactoryMock, 'transactionRepository' => $this->transactionRepositoryMock, - 'transactionService' => $this->transactionServiceMock + 'transactionService' => $this->transactionServiceMock, + 'httpClientFactory' => $httpClientFactoryMock ] ); } @@ -376,7 +400,7 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Authorizenet\Model\Directpost::fetchTransactionInfo + * @covers \Magento\Authorizenet\Model\Directpost::fetchTransactionInfo * * @param $transactionId * @param $resultStatus @@ -440,6 +464,72 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase $this->directpost->fetchTransactionInfo($this->paymentMock, $transactionId); } + /** + * @covers \Magento\Authorizenet\Model\Directpost::refund() + * @return void + */ + public function testSuccessRefund() + { + $card = 1111; + + $this->paymentMock->expects(static::exactly(2)) + ->method('getCcLast4') + ->willReturn($card); + $this->paymentMock->expects(static::once()) + ->method('decrypt') + ->willReturn($card); + $this->paymentMock->expects(static::exactly(3)) + ->method('getParentTransactionId') + ->willReturn(self::TRANSACTION_ID . '-capture'); + $this->paymentMock->expects(static::once()) + ->method('getPoNumber') + ->willReturn(self::INVOICE_NUM); + $this->paymentMock->expects(static::once()) + ->method('setIsTransactionClosed') + ->with(true) + ->willReturnSelf(); + + $orderMock = $this->getOrderMock(); + + $this->paymentMock->expects(static::exactly(2)) + ->method('getOrder') + ->willReturn($orderMock); + + $transactionMock = $this->getMockBuilder(Order\Payment\Transaction::class) + ->disableOriginalConstructor() + ->setMethods(['getAdditionalInformation']) + ->getMock(); + $transactionMock->expects(static::once()) + ->method('getAdditionalInformation') + ->with(Directpost::REAL_TRANSACTION_ID_KEY) + ->willReturn(self::TRANSACTION_ID); + + $this->transactionRepositoryMock->expects(static::once()) + ->method('getByTransactionId') + ->willReturn($transactionMock); + + $response = $this->getRefundResponseBody( + Directpost::RESPONSE_CODE_APPROVED, + Directpost::RESPONSE_REASON_CODE_APPROVED, + 'Successful' + ); + $this->httpClientMock->expects(static::once()) + ->method('getBody') + ->willReturn($response); + + $this->responseMock->expects(static::once()) + ->method('getXResponseCode') + ->willReturn(Directpost::RESPONSE_CODE_APPROVED); + $this->responseMock->expects(static::once()) + ->method('getXResponseReasonCode') + ->willReturn(Directpost::RESPONSE_REASON_CODE_APPROVED); + + $this->dataHelperMock->expects(static::never()) + ->method('wrapGatewayError'); + + $this->directpost->refund($this->paymentMock, self::TOTAL_AMOUNT); + } + /** * Get data for tests * @return array @@ -468,14 +558,48 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase $this->responseMock = $this->getMockBuilder('Magento\Authorizenet\Model\Directpost\Response') ->setMethods( [ - 'setData', 'isValidHash', 'getXTransId', - 'getXResponseCode', 'getXResponseReasonText', - 'getXAmount' + 'isValidHash', + 'getXTransId', 'getXResponseCode', 'getXResponseReasonCode', 'getXResponseReasonText', 'getXAmount', + 'setXResponseCode', 'setXResponseReasonCode', 'setXAvsCode', 'setXResponseReasonText', + 'setXTransId', 'setXInvoiceNum', 'setXAmount', 'setXMethod', 'setXType', 'setData', + 'setXAccountNumber', + '__wakeup' ] ) ->disableOriginalConstructor() ->getMock(); + $this->responseMock->expects(static::any()) + ->method('setXResponseCode') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXResponseReasonCode') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXResponseReasonText') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXAvsCode') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXTransId') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXInvoiceNum') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXAmount') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXMethod') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setXType') + ->willReturnSelf(); + $this->responseMock->expects(static::any()) + ->method('setData') + ->willReturnSelf(); + $this->responseFactoryMock->expects($this->any()) ->method('create') ->willReturn($this->responseMock); @@ -530,4 +654,105 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase libxml_use_internal_errors(false); return $document; } + + /** + * Get mock for authorize.net request factory + * @return \PHPUnit_Framework_MockObject_MockBuilder + */ + private function getRequestFactoryMock() + { + $requestFactory = $this->getMockBuilder(Factory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $request = $this->getMockBuilder(Request::class) + ->disableOriginalConstructor() + ->setMethods(['__wakeup']) + ->getMock(); + $requestFactory->expects(static::any()) + ->method('create') + ->willReturn($request); + return $requestFactory; + } + + /** + * Get mock for order + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function getOrderMock() + { + $orderMock = $this->getMockBuilder(Order::class) + ->disableOriginalConstructor() + ->setMethods([ + 'getId', 'getIncrementId', 'getStoreId', 'getBillingAddress', 'getShippingAddress', + 'getBaseCurrencyCode', 'getBaseTaxAmount', '__wakeup' + ]) + ->getMock(); + + $orderMock->expects(static::once()) + ->method('getId') + ->willReturn(1); + + $orderMock->expects(static::exactly(2)) + ->method('getIncrementId') + ->willReturn(self::INVOICE_NUM); + + $orderMock->expects(static::once()) + ->method('getStoreId') + ->willReturn(1); + + $orderMock->expects(static::once()) + ->method('getBaseCurrencyCode') + ->willReturn('USD'); + return $orderMock; + } + + /** + * Create and return mock for http client factory + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function getHttpClientFactoryMock() + { + $this->httpClientMock = $this->getMockBuilder(\Magento\Framework\HTTP\ZendClient::class) + ->disableOriginalConstructor() + ->setMethods(['request', 'getBody', '__wakeup']) + ->getMock(); + + $this->httpClientMock->expects(static::any()) + ->method('request') + ->willReturnSelf(); + + $httpClientFactoryMock = $this->getMockBuilder(\Magento\Framework\HTTP\ZendClientFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $httpClientFactoryMock->expects(static::any()) + ->method('create') + ->willReturn($this->httpClientMock); + return $httpClientFactoryMock; + } + + /** + * Get mocked response for refund transaction + * @param $code + * @param $reasonCode + * @param $reasonText + * @return string + */ + private function getRefundResponseBody($code, $reasonCode, $reasonText) + { + $result = array_fill(0, 50, ''); + $result[0] = $code; // XResponseCode + $result[2] = $reasonCode; // XResponseReasonCode + $result[3] = $reasonText; // XResponseReasonText + $result[6] = self::TRANSACTION_ID; // XTransId + $result[7] = self::INVOICE_NUM; // XInvoiceNum + $result[9] = self::TOTAL_AMOUNT; // XAmount + $result[10] = Directpost::REQUEST_METHOD_CC; // XMethod + $result[11] = Directpost::REQUEST_TYPE_CREDIT; // XType + $result[37] = md5(self::TRANSACTION_ID); // x_MD5_Hash + $result[50] = '48329483921'; // setXAccountNumber + return implode(Directpost::RESPONSE_DELIM_CHAR, $result); + } } diff --git a/app/code/Magento/Authorizenet/view/adminhtml/templates/directpost/info.phtml b/app/code/Magento/Authorizenet/view/adminhtml/templates/directpost/info.phtml index 6c02076b5a7dbe55d9a81b7114599221c6c9f14e..9251ad16e7258cfb7938591fe66c9a1a2d353f50 100644 --- a/app/code/Magento/Authorizenet/view/adminhtml/templates/directpost/info.phtml +++ b/app/code/Magento/Authorizenet/view/adminhtml/templates/directpost/info.phtml @@ -9,7 +9,7 @@ * @var \Magento\Authorizenet\Block\Transparent\Iframe $block * @see \Magento\Authorizenet\Block\Transparent\Iframe */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); $method = $block->getMethod(); $controller = $block->escapeHtml($block->getRequest()->getControllerName()); $orderUrl = $block->escapeUrl($this->helper('Magento\Authorizenet\Helper\Backend\Data')->getPlaceOrderAdminUrl()); @@ -20,12 +20,12 @@ $ccExpYear = $block->getInfoData('cc_exp_year'); <!-- IFRAME for request to our server --> <iframe id="order-directpost-iframe" allowtransparency="true" frameborder="0" name="iframeSubmitOrder" style="display:none;width:100%;background-color:transparent" - src="<?php /* @noEscape */ echo $block->getViewFileUrl('blank.html'); ?>"> + src="<?php echo $block->escapeUrl($block->getViewFileUrl('blank.html')); ?>"> </iframe> <!-- IFRAME for request to Authorize.net --> <iframe id="directpost-iframe" allowtransparency="true" frameborder="0" name="iframeDirectPost" style="display:none;width:100%;background-color:transparent" - src="<?php /* @noEscape */ echo $block->getViewFileUrl('blank.html'); ?>"> + src="<?php echo $block->escapeUrl($block->getViewFileUrl('blank.html')); ?>"> </iframe> <fieldset class="admin__fieldset payment-method" id="payment_form_<?php /* @noEscape */ echo $code; ?>" style="display:none;"> @@ -124,9 +124,9 @@ $ccExpYear = $block->getInfoData('cc_exp_year'); '<?php /* @noEscape */ echo $controller; ?>', '<?php /* @noEscape */ echo $orderUrl; ?>', '<?php echo $block->escapeUrl($method->getCgiUrl()); ?>', - '<?php /* @noEscape */ echo $block->getUrl('*/*/save', [ + '<?php echo $block->escapeUrl($block->getUrl('*/*/save', [ '_secure' => $block->getRequest()->isSecure() - ]);?>'); + ]));?>'); <?php if (!$block->isAjaxRequest()): ?> }); diff --git a/app/code/Magento/Backend/App/AbstractAction.php b/app/code/Magento/Backend/App/AbstractAction.php index c41338591d3449d6826e14a0c9eb8a409522765b..e84bee226d2ab5fdc9eff6161b8c8adafe9e03ef 100644 --- a/app/code/Magento/Backend/App/AbstractAction.php +++ b/app/code/Magento/Backend/App/AbstractAction.php @@ -200,10 +200,10 @@ abstract class AbstractAction extends \Magento\Framework\App\Action\Action * @param \Magento\Framework\App\RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(\Magento\Framework\App\RequestInterface $request) + public function execute(\Magento\Framework\App\RequestInterface $request) { if (!$this->_processUrlKeys()) { - return parent::dispatch($request); + return parent::execute($request); } if ($request->isDispatched() && $request->getActionName() !== 'denied' && !$this->_isAllowed()) { @@ -223,7 +223,7 @@ abstract class AbstractAction extends \Magento\Framework\App\Action\Action $this->_processLocaleSettings(); - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Backend/App/Action/Plugin/Authentication.php b/app/code/Magento/Backend/App/Action/Plugin/Authentication.php index bf8d90b931ef9b379404d8f36fd8e063678a9fc9..02cc404d4fc818adf6978b2ed3320bbbc809909d 100644 --- a/app/code/Magento/Backend/App/Action/Plugin/Authentication.php +++ b/app/code/Magento/Backend/App/Action/Plugin/Authentication.php @@ -101,7 +101,7 @@ class Authentication * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundDispatch( + public function aroundExecute( \Magento\Backend\App\AbstractAction $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/app/code/Magento/Backend/App/Action/Plugin/MassactionKey.php b/app/code/Magento/Backend/App/Action/Plugin/MassactionKey.php index 767163afc6d30d498ef8ce0a70fe51fb110e480e..9e1f5c713ea10f3d286010ec99cc8cd0d9dcf73a 100644 --- a/app/code/Magento/Backend/App/Action/Plugin/MassactionKey.php +++ b/app/code/Magento/Backend/App/Action/Plugin/MassactionKey.php @@ -19,7 +19,7 @@ class MassactionKey * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundDispatch( + public function aroundExecute( \Magento\Backend\App\AbstractAction $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/app/code/Magento/Backend/Block/Page/Locale.php b/app/code/Magento/Backend/Block/Page/Locale.php deleted file mode 100644 index d6d279ac760f4684973c8d687b329383c7fe2dad..0000000000000000000000000000000000000000 --- a/app/code/Magento/Backend/Block/Page/Locale.php +++ /dev/null @@ -1,94 +0,0 @@ -<?php -/** - * Backend locale switcher block - * - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Backend\Block\Page; - -use Magento\Framework\App\ActionInterface; - -class Locale extends \Magento\Backend\Block\Template -{ - /** - * Path to template file in theme - * - * @var string - */ - protected $_template = 'page/locale.phtml'; - - /** - * @var \Magento\Framework\Locale\ListsInterface - */ - protected $_localeLists; - - /** - * @var \Magento\Framework\Locale\ResolverInterface - */ - protected $_localeResolver; - - /** - * @var \Magento\Framework\Url\Helper\Data - */ - protected $_urlHelper; - - /** - * @param \Magento\Backend\Block\Template\Context $context - * @param \Magento\Framework\Locale\ListsInterface $localeLists - * @param \Magento\Framework\Locale\ResolverInterface $localeResolver - * @param \Magento\Framework\Url\Helper\Data $urlHelper - * @param array $data - */ - public function __construct( - \Magento\Backend\Block\Template\Context $context, - \Magento\Framework\Locale\ListsInterface $localeLists, - \Magento\Framework\Locale\ResolverInterface $localeResolver, - \Magento\Framework\Url\Helper\Data $urlHelper, - array $data = [] - ) { - $this->_localeLists = $localeLists; - $this->_localeResolver = $localeResolver; - $this->_urlHelper = $urlHelper; - parent::__construct($context, $data); - } - - /** - * Prepare URL for change locale - * - * @return string - */ - public function getChangeLocaleUrl() - { - return $this->getUrl('adminhtml/index/changeLocale'); - } - - /** - * Prepare current URL for referer - * - * @return string - */ - public function getUrlForReferer() - { - return ActionInterface::PARAM_NAME_URL_ENCODED . '/' . $this->_urlHelper->getEncodedUrl(); - } - - /** - * Retrieve locale select element - * - * @return string - */ - public function getLocaleSelect() - { - $html = $this->getLayout()->createBlock('Magento\Framework\View\Element\Html\Select') - ->setName('locale') - ->setId('footer_interface_locale') - ->setTitle(__('Interface Language')) - ->setClass('admin__control-select') - ->setValue($this->_localeResolver->getLocale()) - ->setOptions($this->_localeLists->getTranslatedOptionLocales()) - ->getHtml(); - - return $html; - } -} diff --git a/app/code/Magento/Backend/Block/Widget/Button/Item.php b/app/code/Magento/Backend/Block/Widget/Button/Item.php index a500f836312fb3edacd942cc80e24e0582d2094e..73ed2c5f50e6993e5ebbff026d0b89194abcc52b 100644 --- a/app/code/Magento/Backend/Block/Widget/Button/Item.php +++ b/app/code/Magento/Backend/Block/Widget/Button/Item.php @@ -7,12 +7,12 @@ namespace Magento\Backend\Block\Widget\Button; /** - * @method string getButtonKey - * @method string getRegion - * @method string getName - * @method int getLevel - * @method int getSortOrder - * @method string getTitle + * @method string getButtonKey() + * @method string getRegion() + * @method string getName() + * @method int getLevel() + * @method int getSortOrder() + * @method string getTitle() */ class Item extends \Magento\Framework\DataObject { diff --git a/app/code/Magento/Backend/Block/Widget/Button/Toolbar/Container.php b/app/code/Magento/Backend/Block/Widget/Button/Toolbar/Container.php index e7c199cf4787ff9aedca6aa13061fddfafe5d20c..959ef806acfa15571046dbaf9e8b6b3055ef6d0b 100644 --- a/app/code/Magento/Backend/Block/Widget/Button/Toolbar/Container.php +++ b/app/code/Magento/Backend/Block/Widget/Button/Toolbar/Container.php @@ -9,8 +9,8 @@ namespace Magento\Backend\Block\Widget\Button\Toolbar; use Magento\Backend\Block\Widget\Button\ContextInterface; /** - * @method \Magento\Backend\Block\Widget\Button\Item getButtonItem - * @method ContextInterface getContext + * @method \Magento\Backend\Block\Widget\Button\Item getButtonItem() + * @method ContextInterface getContext() * @method ContextInterface setContext(ContextInterface $context) */ class Container extends \Magento\Framework\View\Element\AbstractBlock diff --git a/app/code/Magento/Backend/Block/Widget/Form.php b/app/code/Magento/Backend/Block/Widget/Form.php index 02ef3b1135009ebace6542173bfbf6a6ce6f701f..3f258a48ca38361aa96e4c7bf6ce4219d319079c 100644 --- a/app/code/Magento/Backend/Block/Widget/Form.php +++ b/app/code/Magento/Backend/Block/Widget/Form.php @@ -187,7 +187,7 @@ class Form extends \Magento\Backend\Block\Widget $fieldType, [ 'name' => $attribute->getAttributeCode(), - 'label' => $attribute->getFrontend()->getLabel(), + 'label' => $attribute->getFrontend()->getLocalizedLabel(), 'class' => $attribute->getFrontend()->getClass(), 'required' => $attribute->getIsRequired(), 'note' => $attribute->getNote() diff --git a/app/code/Magento/Backend/Block/Widget/Tabs.php b/app/code/Magento/Backend/Block/Widget/Tabs.php index e7b21aa01abdc15cb5c8e6e30310c0376af11955..0354554e3e2fbfe56a4db40aea7d5e32d017051c 100644 --- a/app/code/Magento/Backend/Block/Widget/Tabs.php +++ b/app/code/Magento/Backend/Block/Widget/Tabs.php @@ -111,6 +111,9 @@ class Tabs extends \Magento\Backend\Block\Widget */ public function addTab($tabId, $tab) { + if (empty($tabId)) { + throw new \Exception(__('Please correct the tab configuration and try again. Tab Id should be not empry')); + } if (is_array($tab)) { $this->_tabs[$tabId] = new \Magento\Framework\DataObject($tab); } elseif ($tab instanceof \Magento\Framework\DataObject) { diff --git a/app/code/Magento/Backend/Console/Command/AbstractCacheTypeManageCommand.php b/app/code/Magento/Backend/Console/Command/AbstractCacheTypeManageCommand.php index 5974798f74be4355cff4926d0bd4e65b48f583f9..56970004795e1b93758432657da8bf4db3e06af8 100644 --- a/app/code/Magento/Backend/Console/Command/AbstractCacheTypeManageCommand.php +++ b/app/code/Magento/Backend/Console/Command/AbstractCacheTypeManageCommand.php @@ -6,11 +6,28 @@ namespace Magento\Backend\Console\Command; +use Magento\Framework\Event\ManagerInterface as EventManagerInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Magento\Framework\App\Cache\Manager; abstract class AbstractCacheTypeManageCommand extends AbstractCacheManageCommand { + /** @var EventManagerInterface */ + protected $eventManager; + + /** + * @param Manager $cacheManager + * @param EventManagerInterface $eventManager + */ + public function __construct( + Manager $cacheManager, + EventManagerInterface $eventManager + ) { + $this->eventManager = $eventManager; + parent::__construct($cacheManager); + } + /** * Perform a cache management action on cache types * diff --git a/app/code/Magento/Backend/Console/Command/CacheCleanCommand.php b/app/code/Magento/Backend/Console/Command/CacheCleanCommand.php index ab57f0ff7b578611ee3a64402650aa07ba52219e..49aeb17839e2ae54fd39c86865c8b2e4e36b2941 100644 --- a/app/code/Magento/Backend/Console/Command/CacheCleanCommand.php +++ b/app/code/Magento/Backend/Console/Command/CacheCleanCommand.php @@ -29,6 +29,7 @@ class CacheCleanCommand extends AbstractCacheTypeManageCommand */ protected function performAction(array $cacheTypes) { + $this->eventManager->dispatch('adminhtml_cache_flush_system'); $this->cacheManager->clean($cacheTypes); } diff --git a/app/code/Magento/Backend/Console/Command/CacheFlushCommand.php b/app/code/Magento/Backend/Console/Command/CacheFlushCommand.php index c847204de9043e84ded25607e890273441ec0e4e..7572fb21cba6dc3e8fb6a7d785ed3d7bbf32e97d 100644 --- a/app/code/Magento/Backend/Console/Command/CacheFlushCommand.php +++ b/app/code/Magento/Backend/Console/Command/CacheFlushCommand.php @@ -29,6 +29,7 @@ class CacheFlushCommand extends AbstractCacheTypeManageCommand */ protected function performAction(array $cacheTypes) { + $this->eventManager->dispatch('adminhtml_cache_flush_all'); $this->cacheManager->flush($cacheTypes); } diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Ajax/Translate.php b/app/code/Magento/Backend/Controller/Adminhtml/Ajax/Translate.php index 143b12d06c3c933884219888577c3e06e856869c..c8e72073581b45f003c3daa03bb25a9faba25853 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Ajax/Translate.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Ajax/Translate.php @@ -40,7 +40,7 @@ class Translate extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $translate = (array)$this->getRequest()->getPost('translate'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedIframe.php b/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedIframe.php index 08f81426145a3ef429755bfa12dfa9d9ee68e3fb..42836b603d0aabe3a6e28772dae5035539136bd9 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedIframe.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedIframe.php @@ -41,7 +41,7 @@ class DeniedIframe extends \Magento\Backend\Controller\Adminhtml\Auth * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */ $resultRaw = $this->resultRawFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedJson.php b/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedJson.php index 43062aa6908a3bf411201bee43ecf28852e14d19..bd2d215007638eb3b5fc3a9ab49e8a06f386974c 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedJson.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Auth/DeniedJson.php @@ -43,7 +43,7 @@ class DeniedJson extends \Magento\Backend\Controller\Adminhtml\Auth * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultJsonFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Auth/Login.php b/app/code/Magento/Backend/Controller/Adminhtml/Auth/Login.php index 6aed5e22c5282ed4e72790170da1323c3fbce78d..e29183357ea74f77621ede6fdcc067e14320af8f 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Auth/Login.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Auth/Login.php @@ -32,7 +32,7 @@ class Login extends \Magento\Backend\Controller\Adminhtml\Auth * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { if ($this->_auth->isLoggedIn()) { if ($this->_auth->getAuthStorage()->isFirstPageAfterLogin()) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Auth/Logout.php b/app/code/Magento/Backend/Controller/Adminhtml/Auth/Logout.php index 098022bed0a8d7c764c9cf5fc66409f222bc6369..a8b3973595e4fbd1dfdf1e90f952095df9eb819e 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Auth/Logout.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Auth/Logout.php @@ -13,7 +13,7 @@ class Logout extends \Magento\Backend\Controller\Adminhtml\Auth * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $this->_auth->logout(); $this->messageManager->addSuccess(__('You have logged out.')); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/BackendApp/Redirect.php b/app/code/Magento/Backend/Controller/Adminhtml/BackendApp/Redirect.php index f622e39e4917e6eab56cd3cd18ae6ab6779fb889..6ac1f14d193cbef1b8964a693930a6416f835f1a 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/BackendApp/Redirect.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/BackendApp/Redirect.php @@ -39,7 +39,7 @@ class Redirect extends AbstractAction /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); if ($this->getRequest()->getParam('app')) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanImages.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanImages.php index 2cb699549bd124201a086b5dc9d5e0efb38645ce..75ea9ccaa84a3538eb13a9c09fbf650002087e3c 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanImages.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanImages.php @@ -16,7 +16,7 @@ class CleanImages extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $this->_objectManager->create('Magento\Catalog\Model\Product\Image')->clearCache(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanMedia.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanMedia.php index 41174c3c1f2f9d4f0c49b148b96e2fbcd089ef4f..553e22810c1db0022f8bdf689efd8b127c5caf1c 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanMedia.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanMedia.php @@ -16,7 +16,7 @@ class CleanMedia extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $this->_objectManager->get('Magento\Framework\View\Asset\MergeService')->cleanMergedJsCss(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanStaticFiles.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanStaticFiles.php index 4ca025b3ec57fabc68dfa4814de74f68afc38608..29529085927401f515263784ebe01342123db9ea 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanStaticFiles.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/CleanStaticFiles.php @@ -15,7 +15,7 @@ class CleanStaticFiles extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $this->_objectManager->get('Magento\Framework\App\State\CleanupFiles')->clearMaterializedViewFiles(); $this->_eventManager->dispatch('clean_static_files_cache_after'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushAll.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushAll.php index 049f5fa3cb3062f7d2eaccd83c2cbdfa0e44f642..2bdddc1048c8d46047632dee63d302352554d9db 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushAll.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushAll.php @@ -13,7 +13,7 @@ class FlushAll extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $this->_eventManager->dispatch('adminhtml_cache_flush_all'); /** @var $cacheFrontend \Magento\Framework\Cache\FrontendInterface */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushSystem.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushSystem.php index bdd099206ed5205b8df8d467f20fbef1bab6ce8e..35885a93ee963605f093d073b0b854639d472ae4 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushSystem.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/FlushSystem.php @@ -13,7 +13,7 @@ class FlushSystem extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var $cacheFrontend \Magento\Framework\Cache\FrontendInterface */ foreach ($this->_cacheFrontendPool as $cacheFrontend) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/Index.php index 1078cdf7201bed08c3b32961a741aab2f37bcef1..2d0fd902112788acf3659ef7eb2575d52fd63772 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php index 98703f0bfa1394c117e644bd0902de25353c0e41..5ed4d74b9e68d60fadf52ca2d2aaaec304de70b4 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassDisable.php @@ -16,7 +16,7 @@ class MassDisable extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $types = $this->getRequest()->getParam('types'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php index 3fd92bc70775c41517a2f88700eaf686cebdabc7..361e4c12a7eb1a2c76f742dde03c5250e07b67e1 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassEnable.php @@ -16,7 +16,7 @@ class MassEnable extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $types = $this->getRequest()->getParam('types'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassRefresh.php b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassRefresh.php index 420d8757e5bb28ef796b24cbac0eea2b9ea69657..d44b99964296a12211975818a33b3dba927b8e3c 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassRefresh.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Cache/MassRefresh.php @@ -16,7 +16,7 @@ class MassRefresh extends \Magento\Backend\Controller\Adminhtml\Cache * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $types = $this->getRequest()->getParam('types'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/AjaxBlock.php b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/AjaxBlock.php index e51999e6fc961e6fe230fab188e271a220037e9c..b5823437cd868ce38dcd49c85f3606f905115fa0 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/AjaxBlock.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/AjaxBlock.php @@ -36,7 +36,7 @@ class AjaxBlock extends \Magento\Backend\Controller\Adminhtml\Dashboard /** * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $output = ''; $blockTab = $this->getRequest()->getParam('block'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersMost.php b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersMost.php index 16f345f31fd93f6336568845323d6e2ae08d13ef..6a942ca15f0d380e4a0c1c79412f6a9b93699a17 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersMost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersMost.php @@ -13,7 +13,7 @@ class CustomersMost extends AjaxBlock * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $output = $this->layoutFactory->create() ->createBlock('Magento\Backend\Block\Dashboard\Tab\Customers\Most') diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersNewest.php b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersNewest.php index d1d460971fb2e11bcb2c1f1c0d73d4b9e352386e..1e531683a7499d8ed9e2548a2716ecee0fc6205e 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersNewest.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/CustomersNewest.php @@ -13,7 +13,7 @@ class CustomersNewest extends AjaxBlock * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $output = $this->layoutFactory->create() ->createBlock('Magento\Backend\Block\Dashboard\Tab\Customers\Newest') diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Index.php index 4b6474bfee4b34ab683473651bf78701e63e677a..1c3098e82bca73ae220a48375b3bf99ec8a6fb0f 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Index.php @@ -28,7 +28,7 @@ class Index extends \Magento\Backend\Controller\Adminhtml\Dashboard /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewed.php b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewed.php index 8d5862fcc22e3b6f31c6cc8bc88c07136b0292b9..1931f7284d406ebae5428325e0c414aa1982763a 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewed.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewed.php @@ -13,7 +13,7 @@ class ProductsViewed extends AjaxBlock * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $output = $this->layoutFactory->create() ->createBlock('Magento\Backend\Block\Dashboard\Tab\Products\Viewed') diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/RefreshStatistics.php b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/RefreshStatistics.php index e9e51cd3f1daf81060a600bc5f81cdab04a2fcbc..943e8e0d2f6c45a0af1e48d394963599b9963969 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/RefreshStatistics.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/RefreshStatistics.php @@ -27,7 +27,7 @@ class RefreshStatistics extends \Magento\Reports\Controller\Adminhtml\Report\Sta /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $collectionsNames = array_values($this->reportTypes); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Tunnel.php b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Tunnel.php index f738be1e83a31a0d23ebc8ed05a6213b061515a1..b4e624b09435aee7c847c9cd347dc5db07a56ec7 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Tunnel.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Dashboard/Tunnel.php @@ -36,7 +36,7 @@ class Tunnel extends \Magento\Backend\Controller\Adminhtml\Dashboard * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $error = __('invalid request'); $httpCode = 400; diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Denied.php b/app/code/Magento/Backend/Controller/Adminhtml/Denied.php index c77bb09fb00548f52a0ad58f72c62acdb16d520b..478cfa7bca0912f015d785b969212bd4acae1194 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Denied.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Denied.php @@ -28,7 +28,7 @@ class Denied extends \Magento\Backend\App\Action /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { if (!$this->_auth->isLoggedIn()) { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Index/ChangeLocale.php b/app/code/Magento/Backend/Controller/Adminhtml/Index/ChangeLocale.php index 9505f4b1d6d2f33094558dfc448f664b201a3046..cdb9fa361c3811c2ec72660166326f8d5348c530 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Index/ChangeLocale.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Index/ChangeLocale.php @@ -13,7 +13,7 @@ class ChangeLocale extends \Magento\Backend\Controller\Adminhtml\Index * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $redirectResult = $this->resultRedirectFactory->create(); $redirectResult->setRefererUrl(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Index/GlobalSearch.php b/app/code/Magento/Backend/Controller/Adminhtml/Index/GlobalSearch.php index afa3019cfd67c03376d34c4a4d38e3f6ec6baf84..8e69d2bc6a2ceb1a84f4c32558eae0cf4c714864 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Index/GlobalSearch.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Index/GlobalSearch.php @@ -40,7 +40,7 @@ class GlobalSearch extends \Magento\Backend\Controller\Adminhtml\Index * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $items = []; diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Index/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/Index/Index.php index 0298a2b9d36b7c8dd7110cb24b34a8b71c17abfc..0fc32f759c1fa814f877d6d6fb662c0d255fa05b 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Index/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Index/Index.php @@ -14,7 +14,7 @@ class Index extends \Magento\Backend\Controller\Adminhtml\Index * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/Noroute/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/Noroute/Index.php index a11957e1b7d3749f94bbc4a7c5819e9d32dc6e1f..6f8101396f7155aa455b1a77fbbd7c664511dd6a 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/Noroute/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/Noroute/Index.php @@ -30,7 +30,7 @@ class Index extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Index.php index 950b72df2df489940f45d0ac36dac41f2bd125cd..4c63db63ef395f405ad7539e96ecd5661431b269 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Index.php @@ -28,7 +28,7 @@ class Index extends \Magento\Backend\Controller\Adminhtml\System\Account /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->resultPageFactory->create(); $resultPage->getConfig()->getTitle()->prepend(__('My Account')); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php index 4607cd6127401989c6552d9318601d5b4a8d4089..31f60ebc84d5f2e5edb1343fe7c71db2c5f35efa 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php @@ -18,7 +18,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Account * @return \Magento\Backend\Model\View\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { $userId = $this->_objectManager->get('Magento\Backend\Model\Auth\Session')->getUser()->getId(); $password = (string)$this->getRequest()->getParam('password'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php index cec54abf608784ceea036b2493ecfd3904d7917e..a1cdb07d9f5e70001e45adb28a8bb016be2473c6 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php @@ -11,7 +11,7 @@ class Delete extends \Magento\Backend\Controller\Adminhtml\System\Design /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); if ($id) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Edit.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Edit.php index 7d3445f51d1366ccdda98c0e0041c3c7bf844eda..afac63a56c6e2c7d8424bf9ca258e413b8bc6fa5 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Edit.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Edit.php @@ -11,7 +11,7 @@ class Edit extends \Magento\Backend\Controller\Adminhtml\System\Design /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Grid.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Grid.php index 1c8dca8b4254bdb15ebc45d4f346e5aecdbb755b..b0d9594e04a10f17947135d81cb00cad5c914341 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Grid.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Grid.php @@ -11,7 +11,7 @@ class Grid extends \Magento\Backend\Controller\Adminhtml\System\Design /** * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { return $this->resultLayoutFactory->create(); } diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Index.php index b153800392604099571b9c0904c16cede6dd1cc2..0df909829220f8f332ce065540ceaa68fabd0dc8 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\Backend\Controller\Adminhtml\System\Design /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/NewAction.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/NewAction.php index 3734ef53d733f12522550619d82049e93d54f0ff..6521aa114f72043b060ad879cea53337a494e646 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/NewAction.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/NewAction.php @@ -11,7 +11,7 @@ class NewAction extends \Magento\Backend\Controller\Adminhtml\System\Design /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Save.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Save.php index 1d6cc8c6c23fb8be1a10765700f0b0a701bbc6b5..7e52e57ecadcd576b43aa2f0de0bdc6463297f11 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Save.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Save.php @@ -28,7 +28,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Design /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Index.php index 4af63776d2482a21511034721220790fa805a459..0203351b8882986bc73aff2714f2bf2bc5968ee8 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Index.php @@ -28,7 +28,7 @@ class Index extends \Magento\Backend\Controller\Adminhtml\System /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/SetStore.php b/app/code/Magento/Backend/Controller/Adminhtml/System/SetStore.php index a53452ec15893fcf271d5c56a4cd5a08921edd58..962a4b882d9183324b8a2c6e4b7903e37e433add 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/SetStore.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/SetStore.php @@ -11,7 +11,7 @@ class SetStore extends \Magento\Backend\Controller\Adminhtml\System /** * @return void */ - public function execute() + public function executeInternal() { $storeId = (int)$this->getRequest()->getParam('store'); if ($storeId) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php index 3604948ee6bf0a021904e6a346adbb8c0b35c37e..e6066ce3d2a40c72de4486b6e76365cd4d74c783 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php @@ -11,7 +11,7 @@ class DeleteGroup extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $itemId = $this->getRequest()->getParam('item_id', null); if (!($model = $this->_objectManager->create('Magento\Store\Model\Group')->load($itemId))) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php index fe67adeca9055e33ad77871332ffeea20b6f37aa..28557917199f12a67700890beeca32d998647f40 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php @@ -13,7 +13,7 @@ class DeleteGroupPost extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $itemId = $this->getRequest()->getParam('item_id'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php index 826f8493fa0723926b8e3a81275275ac138f6a32..824866867528b20a132cff33ee2fe4b399f7bfaf 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php @@ -11,7 +11,7 @@ class DeleteStore extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $itemId = $this->getRequest()->getParam('item_id', null); if (!($model = $this->_objectManager->create('Magento\Store\Model\Store')->load($itemId))) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php index c7764a1b20489c19f8689809ebf5808ce004986f..589be3238e50c54001156a29ff23028f6056508c 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php @@ -15,7 +15,7 @@ class DeleteStorePost extends \Magento\Backend\Controller\Adminhtml\System\Store * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $itemId = $this->getRequest()->getParam('item_id'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php index ea67a101763020bf9ba931b68f3e14fc2446eb73..b2c88101d370a165b7a5c0718e51710064fde095 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php @@ -11,7 +11,7 @@ class DeleteWebsite extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $itemId = $this->getRequest()->getParam('item_id', null); if (!($model = $this->_objectManager->create('Magento\Store\Model\Website')->load($itemId))) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php index 6951bc3b3a9af1eef09520b35d79a33bc74ea719..dc705339dddf92a1ae214cfbc6b4af92c3b9fadd 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php @@ -13,7 +13,7 @@ class DeleteWebsitePost extends \Magento\Backend\Controller\Adminhtml\System\Sto /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $itemId = $this->getRequest()->getParam('item_id'); $model = $this->_objectManager->create('Magento\Store\Model\Website'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditGroup.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditGroup.php index f7403c9eaa20d64731a62f9198d6fdc3452789ef..4e591b0b106d7c049b7abd752735c42bc94e7354 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditGroup.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditGroup.php @@ -11,7 +11,7 @@ class EditGroup extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->_coreRegistry->register('store_type', 'group'); /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php index f6521a418f4bd2559e21b0f968ac30c604997a4d..0d9465c4b8d3f3ea5cf4dbb3e1b572fdfc9de594 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php @@ -13,7 +13,7 @@ class EditStore extends \Magento\Backend\Controller\Adminhtml\System\Store * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { if ($this->_getSession()->getPostData()) { $this->_coreRegistry->register('store_post_data', $this->_getSession()->getPostData()); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditWebsite.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditWebsite.php index 1fe94f981734df467b600c91cbf57da32949ada9..b26692e6f544827269e541a2b93f6bcdce1fbb1c 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditWebsite.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditWebsite.php @@ -11,7 +11,7 @@ class EditWebsite extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->_coreRegistry->register('store_type', 'website'); /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Index.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Index.php index b1f9cf6730948baa7cee8012e3787de267eeccd8..a91d61bfb20b1978c3c0d6ec07156d8016a9309a 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Index.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->resultPageFactory->create(); $resultPage->getConfig()->getTitle()->prepend(__('Stores')); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewGroup.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewGroup.php index 70f9d8b726b072e1ffa16b02c5369e483dd05b1f..f020762e613c2a19336773afcb8b9a07289a53c0 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewGroup.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewGroup.php @@ -11,7 +11,7 @@ class NewGroup extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->_coreRegistry->register('store_type', 'group'); /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewStore.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewStore.php index 817c67c8be9bd6aa4964234dd7cb5e24d630e9db..b59df090433f8aa0468a6a7c272fdaaa19aa5117 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewStore.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewStore.php @@ -11,7 +11,7 @@ class NewStore extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { if (!$this->_coreRegistry->registry('store_type')) { $this->_coreRegistry->register('store_type', 'store'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewWebsite.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewWebsite.php index 65bdd1ee1ede13feafd6b8496266969764f94606..cf514c49d02b0c7ccbabe4f53d4f910e80c5d295 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewWebsite.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/NewWebsite.php @@ -11,7 +11,7 @@ class NewWebsite extends \Magento\Backend\Controller\Adminhtml\System\Store /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->_coreRegistry->register('store_type', 'website'); /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php index 7f2152e1e89c81c5789c93f01886753537e9f127..de1d131eaf8e4130ef05d0f9775bdf1c1f1adab3 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php @@ -13,7 +13,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Store * @return \Magento\Backend\Model\View\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ $redirectResult = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/AuthenticationTest.php b/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/AuthenticationTest.php index 476f6ca0310e19d9416ba75923a58d65ec55a032..052db1d9ae9887f428308ad83a28a8c7690991bf 100644 --- a/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/AuthenticationTest.php +++ b/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/AuthenticationTest.php @@ -45,7 +45,7 @@ class AuthenticationTest extends \PHPUnit_Framework_TestCase $this->plugin = null; } - public function testAroundDispatchProlongStorage() + public function testAroundExecuteProlongStorage() { $subject = $this->getMock('Magento\Backend\Controller\Adminhtml\Index', [], [], '', false); $request = $this->getMock('\Magento\Framework\App\Request\Http', ['getActionName'], [], '', false); @@ -82,11 +82,11 @@ class AuthenticationTest extends \PHPUnit_Framework_TestCase return $expectedResult; }; - $this->assertEquals($expectedResult, $this->plugin->aroundDispatch($subject, $proceed, $request)); + $this->assertEquals($expectedResult, $this->plugin->aroundExecute($subject, $proceed, $request)); } /** - * Calls aroundDispatch to access protected method _processNotLoggedInUser + * Calls aroundExecute to access protected method _processNotLoggedInUser * * Data provider supplies different possibilities of request parameters and properties * @dataProvider processNotLoggedInUserDataProvider @@ -103,7 +103,7 @@ class AuthenticationTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - // Stubs to control the flow of execution in aroundDispatch + // Stubs to control the flow of execution in aroundExecute $this->auth->expects($this->any())->method('getAuthStorage')->will($this->returnValue($storage)); $request->expects($this->once())->method('getActionName')->will($this->returnValue('non/open/action/name')); $this->auth->expects($this->any())->method('getUser')->willReturn(false); @@ -146,7 +146,7 @@ class AuthenticationTest extends \PHPUnit_Framework_TestCase $proceed = function ($request) use ($expectedResult) { return $expectedResult; }; - $this->assertEquals($expectedResult, $this->plugin->aroundDispatch($subject, $proceed, $request)); + $this->assertEquals($expectedResult, $this->plugin->aroundExecute($subject, $proceed, $request)); } public function processNotLoggedInUserDataProvider() diff --git a/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/MassactionKeyTest.php b/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/MassactionKeyTest.php index 87dad8b6edd4152ab5fba42b1ef5a06986c59e78..48ec3a9a592c3b582d79d534a1e7e6aa0d9a6b83 100644 --- a/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/MassactionKeyTest.php +++ b/app/code/Magento/Backend/Test/Unit/App/Action/Plugin/MassactionKeyTest.php @@ -49,13 +49,13 @@ class MassactionKeyTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Backend\App\Action\Plugin\MassactionKey::aroundDispatch + * @covers \Magento\Backend\App\Action\Plugin\MassactionKey::aroundExecute * * @param $postData array|string * @param array $convertedData - * @dataProvider aroundDispatchDataProvider + * @dataProvider aroundExecuteDataProvider */ - public function testAroundDispatchWhenMassactionPrepareKeyRequestExists($postData, $convertedData) + public function testAroundExecuteWhenMassactionPrepareKeyRequestExists($postData, $convertedData) { $this->requestMock->expects($this->at(0)) ->method('getPost') @@ -71,11 +71,11 @@ class MassactionKeyTest extends \PHPUnit_Framework_TestCase $this->assertEquals( 'Expected', - $this->plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock) + $this->plugin->aroundExecute($this->subjectMock, $this->closureMock, $this->requestMock) ); } - public function aroundDispatchDataProvider() + public function aroundExecuteDataProvider() { return [ 'post_data_is_array' => [['key'], ['key']], @@ -84,9 +84,9 @@ class MassactionKeyTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Backend\App\Action\Plugin\MassactionKey::aroundDispatch + * @covers \Magento\Backend\App\Action\Plugin\MassactionKey::aroundExecute */ - public function testAroundDispatchWhenMassactionPrepareKeyRequestNotExists() + public function testAroundExecuteWhenMassactionPrepareKeyRequestNotExists() { $this->requestMock->expects($this->once()) ->method('getPost') @@ -97,7 +97,7 @@ class MassactionKeyTest extends \PHPUnit_Framework_TestCase $this->assertEquals( 'Expected', - $this->plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock) + $this->plugin->aroundExecute($this->subjectMock, $this->closureMock, $this->requestMock) ); } } diff --git a/app/code/Magento/Backend/Test/Unit/App/Action/Stub/ActionStub.php b/app/code/Magento/Backend/Test/Unit/App/Action/Stub/ActionStub.php index fa8eb043b33a063c2bee51c2c262c84b828d6d28..d8a8df5bc17120cdac6349ff50b2f2ec5674386b 100644 --- a/app/code/Magento/Backend/Test/Unit/App/Action/Stub/ActionStub.php +++ b/app/code/Magento/Backend/Test/Unit/App/Action/Stub/ActionStub.php @@ -8,7 +8,7 @@ namespace Magento\Backend\Test\Unit\App\Action\Stub; class ActionStub extends \Magento\Backend\App\Action { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheCommandTest.php b/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheCommandTest.php index 33bce6388fb71d5a8765c86e2c078916858b1741..b7ecddf4d23610b94cee2519c597a907cb4effe5 100644 --- a/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheCommandTest.php +++ b/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheCommandTest.php @@ -13,7 +13,7 @@ abstract class AbstractCacheCommandTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\App\Cache\Manager|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheManager; + protected $cacheManagerMock; /** * @var AbstractCacheManageCommand @@ -22,7 +22,7 @@ abstract class AbstractCacheCommandTest extends \PHPUnit_Framework_TestCase public function setUp() { - $this->cacheManager = $this->getMock('Magento\Framework\App\Cache\Manager', [], [], '', false); + $this->cacheManagerMock = $this->getMock('Magento\Framework\App\Cache\Manager', [], [], '', false); } /** diff --git a/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheManageCommandTest.php b/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheManageCommandTest.php index 53ed624db47685ea3b72ed92b8b466dbeca363bb..97d1f57ad1c1f67eb2af82640bc3e81f679c9199 100644 --- a/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheManageCommandTest.php +++ b/app/code/Magento/Backend/Test/Unit/Console/Command/AbstractCacheManageCommandTest.php @@ -10,6 +10,20 @@ use Symfony\Component\Console\Tester\CommandTester; abstract class AbstractCacheManageCommandTest extends AbstractCacheCommandTest { + /** @var string */ + protected $cacheEventName; + + /** @var \Magento\Framework\Event\ManagerInterface | \PHPUnit_Framework_MockObject_MockObject */ + protected $eventManagerMock; + + public function setUp() + { + $this->eventManagerMock = $this->getMockBuilder('\Magento\Framework\Event\ManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + parent::setUp(); + } + /** * @return array */ @@ -35,7 +49,7 @@ abstract class AbstractCacheManageCommandTest extends AbstractCacheCommandTest */ public function testExecuteInvalidCacheType() { - $this->cacheManager->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); + $this->cacheManagerMock->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); $param = ['types' => ['A', 'D']]; $commandTester = new CommandTester($this->command); $commandTester->execute($param); diff --git a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheCleanCommandTest.php b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheCleanCommandTest.php index a51fa92c1addf7dfca4f654a6d5e72079cc9d3ca..fe812c1a93daa190f555e189f9fc95aa26471b05 100644 --- a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheCleanCommandTest.php +++ b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheCleanCommandTest.php @@ -13,8 +13,9 @@ class CacheCleanCommandTest extends AbstractCacheManageCommandTest { public function setUp() { + $this->cacheEventName = 'adminhtml_cache_flush_system'; parent::setUp(); - $this->command = new CacheCleanCommand($this->cacheManager); + $this->command = new CacheCleanCommand($this->cacheManagerMock, $this->eventManagerMock); } /** @@ -25,8 +26,9 @@ class CacheCleanCommandTest extends AbstractCacheManageCommandTest */ public function testExecute($param, $types, $output) { - $this->cacheManager->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); - $this->cacheManager->expects($this->once())->method('clean')->with($types); + $this->cacheManagerMock->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); + $this->cacheManagerMock->expects($this->once())->method('clean')->with($types); + $this->eventManagerMock->expects($this->once())->method('dispatch')->with($this->cacheEventName); $commandTester = new CommandTester($this->command); $commandTester->execute($param); diff --git a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheDisableCommandTest.php b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheDisableCommandTest.php index 1eb4cffd23fd64cda13e2cc49c7ac4dd557dc374..4446b1b992e03b44bb3602adbab2c16cda301106 100644 --- a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheDisableCommandTest.php +++ b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheDisableCommandTest.php @@ -14,7 +14,7 @@ class CacheDisableCommandTest extends AbstractCacheSetCommandTest public function setUp() { parent::setUp(); - $this->command = new CacheDisableCommand($this->cacheManager); + $this->command = new CacheDisableCommand($this->cacheManagerMock); } /** @@ -26,8 +26,13 @@ class CacheDisableCommandTest extends AbstractCacheSetCommandTest */ public function testExecute($param, $enable, $result, $output) { - $this->cacheManager->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); - $this->cacheManager->expects($this->once())->method('setEnabled')->with($enable, false)->willReturn($result); + $this->cacheManagerMock->expects($this->once()) + ->method('getAvailableTypes') + ->willReturn(['A', 'B', 'C']); + $this->cacheManagerMock->expects($this->once()) + ->method('setEnabled') + ->with($enable, false) + ->willReturn($result); $commandTester = new CommandTester($this->command); $commandTester->execute($param); diff --git a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheEnableCommandTest.php b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheEnableCommandTest.php index e20978e81e7d759e23e18f1fc1bdd5277cebed8a..e44b71d06f9fdc9a624959b50a32521c2db479eb 100644 --- a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheEnableCommandTest.php +++ b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheEnableCommandTest.php @@ -14,7 +14,7 @@ class CacheEnableCommandTest extends AbstractCacheSetCommandTest public function setUp() { parent::setUp(); - $this->command = new CacheEnableCommand($this->cacheManager); + $this->command = new CacheEnableCommand($this->cacheManagerMock); } /** @@ -26,9 +26,15 @@ class CacheEnableCommandTest extends AbstractCacheSetCommandTest */ public function testExecute($param, $enable, $result, $output) { - $this->cacheManager->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); - $this->cacheManager->expects($this->once())->method('setEnabled')->with($enable, true)->willReturn($result); - $this->cacheManager->expects($result === [] ? $this->never() : $this->once())->method('clean')->with($enable); + $this->cacheManagerMock->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); + $this->cacheManagerMock->expects($this->once()) + ->method('setEnabled') + ->with($enable, true) + ->willReturn($result); + $cleanInvocationCount = $result === [] ? 0 : 1; + $this->cacheManagerMock->expects($this->exactly($cleanInvocationCount)) + ->method('clean') + ->with($enable); $commandTester = new CommandTester($this->command); $commandTester->execute($param); diff --git a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheFlushCommandTest.php b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheFlushCommandTest.php index 53032fe55ae049267f802b85b3e6127a02def5d7..07828c6627d5d440e9c10fcd28716ed7b280c067 100644 --- a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheFlushCommandTest.php +++ b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheFlushCommandTest.php @@ -13,8 +13,9 @@ class CacheFlushCommandTest extends AbstractCacheManageCommandTest { public function setUp() { + $this->cacheEventName = 'adminhtml_cache_flush_all'; parent::setUp(); - $this->command = new CacheFlushCommand($this->cacheManager); + $this->command = new CacheFlushCommand($this->cacheManagerMock, $this->eventManagerMock); } /** @@ -25,8 +26,9 @@ class CacheFlushCommandTest extends AbstractCacheManageCommandTest */ public function testExecute($param, $types, $output) { - $this->cacheManager->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); - $this->cacheManager->expects($this->once())->method('flush')->with($types); + $this->cacheManagerMock->expects($this->once())->method('getAvailableTypes')->willReturn(['A', 'B', 'C']); + $this->cacheManagerMock->expects($this->once())->method('flush')->with($types); + $this->eventManagerMock->expects($this->once())->method('dispatch')->with($this->cacheEventName); $commandTester = new CommandTester($this->command); $commandTester->execute($param); diff --git a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheStatusCommandTest.php b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheStatusCommandTest.php index 4c792a4548dd1833d33334c6005ea4b2953f52e3..a8ee48491fbb7523f23cdc3d230092f86a967293 100644 --- a/app/code/Magento/Backend/Test/Unit/Console/Command/CacheStatusCommandTest.php +++ b/app/code/Magento/Backend/Test/Unit/Console/Command/CacheStatusCommandTest.php @@ -14,13 +14,13 @@ class CacheStatusCommandTest extends AbstractCacheCommandTest public function setUp() { parent::setUp(); - $this->command = new CacheStatusCommand($this->cacheManager); + $this->command = new CacheStatusCommand($this->cacheManagerMock); } public function testExecute() { $cacheTypes = ['A' => 0, 'B' => 1, 'C' => 1]; - $this->cacheManager->expects($this->once())->method('getStatus')->willReturn($cacheTypes); + $this->cacheManagerMock->expects($this->once())->method('getStatus')->willReturn($cacheTypes); $commandTester = new CommandTester($this->command); $commandTester->execute([]); diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanMediaTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanMediaTest.php index 36db725f9a90709cd88fd3db044721d664b10e08..1e6619c6f8df721aeaeb891fda29d0b09993fcf9 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanMediaTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanMediaTest.php @@ -10,7 +10,7 @@ namespace Magento\Backend\Test\Unit\Controller\Adminhtml\Cache; class CleanMediaTest extends \PHPUnit_Framework_TestCase { - public function testExecute() + public function testExecuteInternal() { // Wire object with mocks $response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false); @@ -62,6 +62,7 @@ class CleanMediaTest extends \PHPUnit_Framework_TestCase $context->expects($this->once())->method('getMessageManager')->willReturn($messageManager); $context->expects($this->once())->method('getResultFactory')->willReturn($resultFactory); + /** @var \Magento\Backend\Controller\Adminhtml\Cache\CleanMedia $controller */ $controller = $helper->getObject( 'Magento\Backend\Controller\Adminhtml\Cache\CleanMedia', [ @@ -90,6 +91,6 @@ class CleanMediaTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); // Run - $controller->execute(); + $controller->executeInternal(); } } diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanStaticFilesTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanStaticFilesTest.php index 0e78f533c85256eb48534c6ac877a4c31fd7e967..dfc5059ec47633efe82ef92d6866f5cdb655c34f 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanStaticFilesTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Cache/CleanStaticFilesTest.php @@ -94,6 +94,6 @@ class CleanStaticFilesTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); // Run - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/AbstractTestCase.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/AbstractTestCase.php index 986658d715336eb9a3dd6f8d542638b8f0ed45f5..3e67b8311628e7d66194c3426b1b5aa77142a9fa 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/AbstractTestCase.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/AbstractTestCase.php @@ -19,7 +19,7 @@ class AbstractTestCase extends \PHPUnit_Framework_TestCase * @param $controllerName * @param $blockName */ - protected function assertExecute($controllerName, $blockName) + protected function assertExecuteInternal($controllerName, $blockName) { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $outPut = "data"; @@ -47,7 +47,7 @@ class AbstractTestCase extends \PHPUnit_Framework_TestCase 'layoutFactory' => $layoutFactoryMock ] ); - $result = $controller->execute(); + $result = $controller->executeInternal(); $this->assertInstanceOf('Magento\Framework\Controller\Result\Raw', $result); } } diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersMostTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersMostTest.php index bb7cb6ff15ed48a13e6c240d61e8fb923ea30221..f60a0fc93072cb4fc827ffad9b679beaeb5c0c94 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersMostTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersMostTest.php @@ -15,7 +15,7 @@ class CustomersMostTest extends AbstractTestCase { public function testExecute() { - $this->assertExecute( + $this->assertExecuteInternal( 'Magento\Backend\Controller\Adminhtml\Dashboard\CustomersMost', 'Magento\Backend\Block\Dashboard\Tab\Customers\Most' ); diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersNewestTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersNewestTest.php index d9fdd7366ef0d64f81d1f2ae5ded8d796da847b3..6d229559e588b1aac30b05ba9b902d3a85cdf9d0 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersNewestTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/CustomersNewestTest.php @@ -15,7 +15,7 @@ class CustomersNewestTest extends AbstractTestCase { public function testExecute() { - $this->assertExecute( + $this->assertExecuteInternal( 'Magento\Backend\Controller\Adminhtml\Dashboard\CustomersNewest', 'Magento\Backend\Block\Dashboard\Tab\Customers\Newest' ); diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/ProductsViewedTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/ProductsViewedTest.php index 145a8a14077d4797a69045b2a61fb08f6a8bbdec..4efdf2c4edf435e69c31779913e081f7a45b9e78 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/ProductsViewedTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/ProductsViewedTest.php @@ -15,7 +15,7 @@ class ProductsViewedTest extends AbstractTestCase { public function testExecute() { - $this->assertExecute( + $this->assertExecuteInternal( 'Magento\Backend\Controller\Adminhtml\Dashboard\ProductsViewed', 'Magento\Backend\Block\Dashboard\Tab\Products\Viewed' ); diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/RefreshStatisticsTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/RefreshStatisticsTest.php index 76d670fef543e0c13d0f1671a5116eff05b670a7..a224583fe5a963dcef216b87a4cf607670da7391 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/RefreshStatisticsTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/RefreshStatisticsTest.php @@ -128,7 +128,7 @@ class RefreshStatisticsTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->refreshStatisticsController->execute() + $this->refreshStatisticsController->executeInternal() ); } } diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/TunnelTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/TunnelTest.php index 2e5cd51547eee22243ccaeff09f9164dc3ee49d9..cae77b8ad3cc96ed668ebd7dea8b1379dacf64b7 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/TunnelTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/Dashboard/TunnelTest.php @@ -92,7 +92,7 @@ class TunnelTest extends \PHPUnit_Framework_TestCase ->with('success_msg') ->willReturnSelf(); - $controller->execute(); + $controller->executeInternal(); $this->assertEquals('success_msg', $controller->getResponse()->getBody()); } @@ -112,7 +112,7 @@ class TunnelTest extends \PHPUnit_Framework_TestCase ->with('Service unavailable: invalid request') ->willReturnSelf(); - $controller->execute(); + $controller->executeInternal(); } public function testTunnelAction503() @@ -164,7 +164,7 @@ class TunnelTest extends \PHPUnit_Framework_TestCase ->with('Service unavailable: see error log for details') ->willReturnSelf(); - $controller->execute(); + $controller->executeInternal(); } /** diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php index b63c4f1e1a5ad33a38144569dba89dcda1892fa7..d86dd0eb5e1bcb67bcaf594eb3fc4ad3c8b8563b 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php @@ -9,88 +9,105 @@ namespace Magento\Backend\Test\Unit\Controller\Adminhtml\System\Account; class SaveTest extends \PHPUnit_Framework_TestCase { - /** @var \Magento\Backend\Controller\Adminhtml\System\Account */ - protected $_controller; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\RequestInterface */ - protected $_requestMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\ResponseInterface */ - protected $_responseMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\ObjectManager\ObjectManager */ - protected $_objectManagerMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Message\ManagerInterface */ - protected $_messagesMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Helper\Data */ - protected $_helperMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Model\Auth\Session */ - protected $_authSessionMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\User\Model\User */ - protected $_userMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Validator\locale */ - protected $_validatorMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Model\Locale\Manager */ - protected $_managerMock; - - /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\TranslateInterface */ - protected $_translatorMock; + /** + * @var \Magento\Backend\Controller\Adminhtml\System\Account\Save + */ + protected $controller; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\RequestInterface + */ + protected $requestMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\ResponseInterface + */ + protected $responseMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\ObjectManager\ObjectManager + */ + protected $objectManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Message\ManagerInterface + */ + protected $messagesMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Helper\Data + */ + protected $helperMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Model\Auth\Session + */ + protected $authSessionMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\User\Model\User + */ + protected $userMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Validator\locale + */ + protected $validatorMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Model\Locale\Manager + */ + protected $managerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\TranslateInterface + */ + protected $translatorMock; protected function setUp() { - $this->_requestMock = $this->getMockBuilder('Magento\Framework\App\Request\Http') + $frontControllerMock = $this->getMockBuilder('Magento\Framework\App\FrontController') + ->disableOriginalConstructor() + ->getMock(); + + $this->requestMock = $this->getMockBuilder('Magento\Framework\App\Request\Http') ->disableOriginalConstructor()->setMethods(['getOriginalPathInfo']) ->getMock(); - $this->_responseMock = $this->getMockBuilder('Magento\Framework\App\Response\Http') + $this->responseMock = $this->getMockBuilder('Magento\Framework\App\Response\Http') ->disableOriginalConstructor() ->setMethods([]) ->getMock(); - $this->_objectManagerMock = $this->getMockBuilder('Magento\Framework\ObjectManager\ObjectManager') + $this->objectManagerMock = $this->getMockBuilder('Magento\Framework\ObjectManager\ObjectManager') ->disableOriginalConstructor() ->setMethods(['get', 'create']) ->getMock(); - $frontControllerMock = $this->getMockBuilder('Magento\Framework\App\FrontController') - ->disableOriginalConstructor() - ->getMock(); - - $this->_helperMock = $this->getMockBuilder('Magento\Backend\Helper\Data') + $this->helperMock = $this->getMockBuilder('Magento\Backend\Helper\Data') ->disableOriginalConstructor() ->setMethods(['getUrl']) ->getMock(); - $this->_messagesMock = $this->getMockBuilder('Magento\Framework\Message\Manager') + $this->messagesMock = $this->getMockBuilder('Magento\Framework\Message\Manager') ->disableOriginalConstructor() ->setMethods(['addSuccess']) ->getMockForAbstractClass(); - - $this->_authSessionMock = $this->getMockBuilder('Magento\Backend\Model\Auth\Session') + $this->authSessionMock = $this->getMockBuilder('Magento\Backend\Model\Auth\Session') ->disableOriginalConstructor() ->setMethods(['getUser']) ->getMock(); - - $this->_userMock = $this->getMockBuilder('Magento\User\Model\User') + $this->userMock = $this->getMockBuilder('Magento\User\Model\User') ->disableOriginalConstructor() ->setMethods( ['load', 'save', 'sendPasswordResetNotificationEmail', 'verifyIdentity', '__sleep', '__wakeup'] ) ->getMock(); - - $this->_validatorMock = $this->getMockBuilder('Magento\Framework\Validator\Locale') + $this->validatorMock = $this->getMockBuilder('Magento\Framework\Validator\Locale') ->disableOriginalConstructor() ->setMethods(['isValid']) ->getMock(); - - $this->_managerMock = $this->getMockBuilder('Magento\Backend\Model\Locale\Manager') + $this->managerMock = $this->getMockBuilder('Magento\Backend\Model\Locale\Manager') ->disableOriginalConstructor() ->setMethods(['switchBackendInterfaceLocale']) ->getMock(); - - $this->_translatorMock = $this->getMockBuilder('Magento\Framework\TranslateInterface') + $this->translatorMock = $this->getMockBuilder('Magento\Framework\TranslateInterface') ->disableOriginalConstructor() ->getMock(); @@ -107,19 +124,19 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->willReturn($resultRedirect); $contextMock = $this->getMock('Magento\Backend\App\Action\Context', [], [], '', false); - $contextMock->expects($this->any())->method('getRequest')->willReturn($this->_requestMock); - $contextMock->expects($this->any())->method('getResponse')->willReturn($this->_responseMock); - $contextMock->expects($this->any())->method('getObjectManager')->willReturn($this->_objectManagerMock); + $contextMock->expects($this->any())->method('getRequest')->willReturn($this->requestMock); + $contextMock->expects($this->any())->method('getResponse')->willReturn($this->responseMock); + $contextMock->expects($this->any())->method('getObjectManager')->willReturn($this->objectManagerMock); $contextMock->expects($this->any())->method('getFrontController')->willReturn($frontControllerMock); - $contextMock->expects($this->any())->method('getHelper')->willReturn($this->_helperMock); - $contextMock->expects($this->any())->method('getMessageManager')->willReturn($this->_messagesMock); - $contextMock->expects($this->any())->method('getTranslator')->willReturn($this->_translatorMock); + $contextMock->expects($this->any())->method('getHelper')->willReturn($this->helperMock); + $contextMock->expects($this->any())->method('getMessageManager')->willReturn($this->messagesMock); + $contextMock->expects($this->any())->method('getTranslator')->willReturn($this->translatorMock); $contextMock->expects($this->once())->method('getResultFactory')->willReturn($resultFactory); $args = ['context' => $contextMock]; $testHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->_controller = $testHelper->getObject('Magento\Backend\Controller\Adminhtml\System\Account\Save', $args); + $this->controller = $testHelper->getObject('Magento\Backend\Controller\Adminhtml\System\Account\Save', $args); } public function testSaveAction() @@ -136,69 +153,50 @@ class SaveTest extends \PHPUnit_Framework_TestCase \Magento\Backend\Block\System\Account\Edit\Form::IDENTITY_VERIFICATION_PASSWORD_FIELD => 'current_password', ]; - $testedMessage = 'You saved the account.'; - - $this->_authSessionMock->expects($this->any())->method('getUser')->will($this->returnValue($this->_userMock)); - - $this->_userMock->expects($this->any())->method('load')->will($this->returnSelf()); - $this->_validatorMock->expects( - $this->once() - )->method( - 'isValid' - )->with( - $this->equalTo($requestParams['interface_locale']) - )->will( - $this->returnValue(true) - ); - $this->_managerMock->expects($this->any())->method('switchBackendInterfaceLocale'); - - $this->_objectManagerMock->expects( - $this->at(0) - )->method( - 'get' - )->with( - $this->equalTo('Magento\Backend\Model\Auth\Session') - )->will( - $this->returnValue($this->_authSessionMock) - ); - $this->_objectManagerMock->expects( - $this->at(1) - )->method( - 'create' - )->with( - $this->equalTo('Magento\User\Model\User') - )->will( - $this->returnValue($this->_userMock) - ); - $this->_objectManagerMock->expects( - $this->at(2) - )->method( - 'get' - )->with( - $this->equalTo('Magento\Framework\Validator\Locale') - )->will( - $this->returnValue($this->_validatorMock) - ); - $this->_objectManagerMock->expects( - $this->at(3) - )->method( - 'get' - )->with( - $this->equalTo('Magento\Backend\Model\Locale\Manager') - )->will( - $this->returnValue($this->_managerMock) - ); - - $this->_userMock->setUserId($userId); - - $this->_userMock->expects($this->once())->method('save'); - $this->_userMock->expects($this->once())->method('verifyIdentity')->will($this->returnValue(true)); - $this->_userMock->expects($this->once())->method('sendPasswordResetNotificationEmail'); - - $this->_requestMock->setParams($requestParams); - - $this->_messagesMock->expects($this->once())->method('addSuccess')->with($this->equalTo($testedMessage)); - - $this->_controller->execute(); + $testedMessage = __('You saved the account.'); + + $this->authSessionMock->expects($this->any()) + ->method('getUser') + ->willReturn($this->userMock); + $this->userMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $this->validatorMock->expects($this->once()) + ->method('isValid') + ->with($this->equalTo($requestParams['interface_locale'])) + ->willReturn(true); + $this->managerMock->expects($this->any()) + ->method('switchBackendInterfaceLocale'); + $this->objectManagerMock->expects($this->at(0)) + ->method('get') + ->with($this->equalTo('Magento\Backend\Model\Auth\Session')) + ->willReturn($this->authSessionMock); + $this->objectManagerMock->expects($this->at(1)) + ->method('create') + ->with($this->equalTo('Magento\User\Model\User')) + ->willReturn($this->userMock); + $this->objectManagerMock->expects($this->at(2)) + ->method('get') + ->with($this->equalTo('Magento\Framework\Validator\Locale')) + ->willReturn($this->validatorMock); + $this->objectManagerMock->expects($this->at(3)) + ->method('get') + ->with($this->equalTo('Magento\Backend\Model\Locale\Manager')) + ->willReturn($this->managerMock); + $this->userMock->expects($this->once()) + ->method('save'); + $this->userMock->expects($this->once()) + ->method('verifyIdentity') + ->willReturn(true); + $this->userMock->expects($this->once()) + ->method('sendPasswordResetNotificationEmail'); + $this->messagesMock->expects($this->once()) + ->method('addSuccess') + ->with($this->equalTo($testedMessage)); + + $this->userMock->setUserId($userId); + $this->requestMock->setParams($requestParams); + + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Backend/i18n/de_DE.csv b/app/code/Magento/Backend/i18n/de_DE.csv index 8bd82b41c2050a73b6cefcad5a4a53a280627769..7c6b4dab5992d69ca9214ebabc18c6b9e4e6eca3 100644 --- a/app/code/Magento/Backend/i18n/de_DE.csv +++ b/app/code/Magento/Backend/i18n/de_DE.csv @@ -606,3 +606,11 @@ Tags,Tags Options,Options "Magento Admin","Magento Admin" "Community Edition","Community Edition" +Marketing,Marketing +Communications,Communications +"SEO & Search","SEO & Search" +"User Content","User Content" +"Data Transfer","Data Transfer" +"Import History","Import History" +Extensions,Extensions +"Web Setup Wizard","Web Setup Wizard" diff --git a/app/code/Magento/Backend/i18n/en_US.csv b/app/code/Magento/Backend/i18n/en_US.csv index 8bd82b41c2050a73b6cefcad5a4a53a280627769..82284a014c7e3cd704ee91ecec88f82e7524693a 100644 --- a/app/code/Magento/Backend/i18n/en_US.csv +++ b/app/code/Magento/Backend/i18n/en_US.csv @@ -606,3 +606,17 @@ Tags,Tags Options,Options "Magento Admin","Magento Admin" "Community Edition","Community Edition" +"Last Orders","Last Orders" +"Last Search Terms","Last Search Terms" +"Top Search Terms","Top Search Terms" +"Your Password","Your Password" +"You saved the account.","You saved the account." +"Current User Identity Verification","Current User Identity Verification" +Marketing,Marketing +Communications,Communications +"SEO & Search","SEO & Search" +"User Content","User Content" +"Data Transfer","Data Transfer" +"Import History","Import History" +Extensions,Extensions +"Web Setup Wizard","Web Setup Wizard" diff --git a/app/code/Magento/Backend/i18n/es_ES.csv b/app/code/Magento/Backend/i18n/es_ES.csv index 8bd82b41c2050a73b6cefcad5a4a53a280627769..7c6b4dab5992d69ca9214ebabc18c6b9e4e6eca3 100644 --- a/app/code/Magento/Backend/i18n/es_ES.csv +++ b/app/code/Magento/Backend/i18n/es_ES.csv @@ -606,3 +606,11 @@ Tags,Tags Options,Options "Magento Admin","Magento Admin" "Community Edition","Community Edition" +Marketing,Marketing +Communications,Communications +"SEO & Search","SEO & Search" +"User Content","User Content" +"Data Transfer","Data Transfer" +"Import History","Import History" +Extensions,Extensions +"Web Setup Wizard","Web Setup Wizard" diff --git a/app/code/Magento/Backend/i18n/fr_FR.csv b/app/code/Magento/Backend/i18n/fr_FR.csv index 8bd82b41c2050a73b6cefcad5a4a53a280627769..7c6b4dab5992d69ca9214ebabc18c6b9e4e6eca3 100644 --- a/app/code/Magento/Backend/i18n/fr_FR.csv +++ b/app/code/Magento/Backend/i18n/fr_FR.csv @@ -606,3 +606,11 @@ Tags,Tags Options,Options "Magento Admin","Magento Admin" "Community Edition","Community Edition" +Marketing,Marketing +Communications,Communications +"SEO & Search","SEO & Search" +"User Content","User Content" +"Data Transfer","Data Transfer" +"Import History","Import History" +Extensions,Extensions +"Web Setup Wizard","Web Setup Wizard" diff --git a/app/code/Magento/Backend/i18n/nl_NL.csv b/app/code/Magento/Backend/i18n/nl_NL.csv index 8bd82b41c2050a73b6cefcad5a4a53a280627769..7c6b4dab5992d69ca9214ebabc18c6b9e4e6eca3 100644 --- a/app/code/Magento/Backend/i18n/nl_NL.csv +++ b/app/code/Magento/Backend/i18n/nl_NL.csv @@ -606,3 +606,11 @@ Tags,Tags Options,Options "Magento Admin","Magento Admin" "Community Edition","Community Edition" +Marketing,Marketing +Communications,Communications +"SEO & Search","SEO & Search" +"User Content","User Content" +"Data Transfer","Data Transfer" +"Import History","Import History" +Extensions,Extensions +"Web Setup Wizard","Web Setup Wizard" diff --git a/app/code/Magento/Backend/i18n/pt_BR.csv b/app/code/Magento/Backend/i18n/pt_BR.csv index 8bd82b41c2050a73b6cefcad5a4a53a280627769..7c6b4dab5992d69ca9214ebabc18c6b9e4e6eca3 100644 --- a/app/code/Magento/Backend/i18n/pt_BR.csv +++ b/app/code/Magento/Backend/i18n/pt_BR.csv @@ -606,3 +606,11 @@ Tags,Tags Options,Options "Magento Admin","Magento Admin" "Community Edition","Community Edition" +Marketing,Marketing +Communications,Communications +"SEO & Search","SEO & Search" +"User Content","User Content" +"Data Transfer","Data Transfer" +"Import History","Import History" +Extensions,Extensions +"Web Setup Wizard","Web Setup Wizard" diff --git a/app/code/Magento/Backend/i18n/zh_Hans_CN.csv b/app/code/Magento/Backend/i18n/zh_Hans_CN.csv index 8bd82b41c2050a73b6cefcad5a4a53a280627769..7c6b4dab5992d69ca9214ebabc18c6b9e4e6eca3 100644 --- a/app/code/Magento/Backend/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Backend/i18n/zh_Hans_CN.csv @@ -606,3 +606,11 @@ Tags,Tags Options,Options "Magento Admin","Magento Admin" "Community Edition","Community Edition" +Marketing,Marketing +Communications,Communications +"SEO & Search","SEO & Search" +"User Content","User Content" +"Data Transfer","Data Transfer" +"Import History","Import History" +Extensions,Extensions +"Web Setup Wizard","Web Setup Wizard" diff --git a/app/code/Magento/Backend/view/adminhtml/layout/default.xml b/app/code/Magento/Backend/view/adminhtml/layout/default.xml index f960316fcc92933bc64b33f9457f50335ec8eb46..216934514bcc56a027f62da5c01b76c72a33d61e 100644 --- a/app/code/Magento/Backend/view/adminhtml/layout/default.xml +++ b/app/code/Magento/Backend/view/adminhtml/layout/default.xml @@ -53,15 +53,18 @@ <block class="Magento\Framework\View\Element\Template" name="page.actions.toolbar" template="Magento_Backend::pageactions.phtml" after="-"/> </referenceContainer> <referenceContainer name="footer"> - <block class="Magento\Backend\Block\Page\Locale" name="locale.switcher" template="Magento_Backend::page/locale.phtml"/> - <container name="legal" htmlTag="div" htmlClass="footer-legal col-m-6 col-m-offset-1"> - <block class="Magento\Backend\Block\Page\Footer" name="version" as="version" /> - <block class="Magento\Backend\Block\Page\Copyright" name="copyright" as="copyright" /> - <block class="Magento\Framework\View\Element\Template" name="report" as="report" template="Magento_Backend::page/report.phtml"> - <arguments> - <argument name="bugreport_url" xsi:type="string">https://github.com/magento/magento2/issues</argument> - </arguments> - </block> + <container name="legal" htmlTag="div" htmlClass="footer-legal"> + <container name="legal.copyright" htmlTag="p" htmlClass="copyright col-m-6"> + <block class="Magento\Backend\Block\Page\Copyright" name="copyright" as="copyright" /> + </container> + <container name="legal.system" htmlTag="div" htmlClass="footer-legal-system col-m-6"> + <block class="Magento\Backend\Block\Page\Footer" name="version" as="version" /> + <block class="Magento\Framework\View\Element\Template" name="report" as="report" template="Magento_Backend::page/report.phtml"> + <arguments> + <argument name="bugreport_url" xsi:type="string">https://github.com/magento/magento2/issues</argument> + </arguments> + </block> + </container> </container> </referenceContainer> <referenceContainer name="backend.page"> diff --git a/app/code/Magento/Backend/view/adminhtml/templates/page/copyright.phtml b/app/code/Magento/Backend/view/adminhtml/templates/page/copyright.phtml index 5612ab20661793683670a0b2d35fc7a9684b48bd..41781c9d1287fcbabaca8e259939424f85697bb7 100644 --- a/app/code/Magento/Backend/view/adminhtml/templates/page/copyright.phtml +++ b/app/code/Magento/Backend/view/adminhtml/templates/page/copyright.phtml @@ -7,7 +7,5 @@ // @codingStandardsIgnoreFile ?> -<p class="copyright"> - <a class="link-copyright" href="http://magento.com" target="_blank" title="<?php /* @escapeNotVerified */ echo __('Magento') ?>"></a> - <?php /* @escapeNotVerified */ echo __('Copyright © %1 Magento. All rights reserved.', date('Y')) ?> -</p> +<a class="link-copyright" href="http://magento.com" target="_blank" title="<?php /* @escapeNotVerified */ echo __('Magento') ?>"></a> +<?php /* @escapeNotVerified */ echo __('Copyright © %1 Magento. All rights reserved.', date('Y')) ?> diff --git a/app/code/Magento/Backend/view/adminhtml/templates/page/locale.phtml b/app/code/Magento/Backend/view/adminhtml/templates/page/locale.phtml deleted file mode 100644 index 03347fbcbe6953245b1b14cc3534c1894d173049..0000000000000000000000000000000000000000 --- a/app/code/Magento/Backend/view/adminhtml/templates/page/locale.phtml +++ /dev/null @@ -1,31 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -// @codingStandardsIgnoreFile - -?> -<div class="locale-switcher col-m-5"> - <label class="label" for="footer_interface_locale"><span><?php /* @escapeNotVerified */ echo __('Interface Locale'); ?></span></label> - <?php /* @escapeNotVerified */ echo $block->getLocaleSelect(); ?> - <script> - require([ - 'mage/validation/url' - ], - function (urlValidator) { - 'use strict'; - - var elem = document.getElementById('footer_interface_locale'); - - function onChange() { - urlValidator.redirect('<?php /* @escapeNotVerified */ echo $block->getChangeLocaleUrl() ?>locale/' + - elem.value + - '/<?php /* @escapeNotVerified */ echo $block->getUrlForReferer() ?>'); - } - - elem.addEventListener('change', onChange); - }); - </script> -</div> diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php index abfd789889b8339939d5b202e29197b2aac889ea..caa8da583a6f3b2bbf3afe313061682498a77c2b 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php @@ -17,7 +17,7 @@ class Create extends \Magento\Backup\Controller\Adminhtml\Index * @return void|\Magento\Backend\App\Action * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { if (!$this->getRequest()->isAjax()) { return $this->_redirect('*/*/index'); diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Download.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Download.php index c9fe2c5758624b59d19f5a8ec8deba05bcb6c11a..a5ea380d2b671f87b4aebc23994ba2a8eae5a986 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Download.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Download.php @@ -49,7 +49,7 @@ class Download extends \Magento\Backup\Controller\Adminhtml\Index * * @return void|\Magento\Backend\App\Action */ - public function execute() + public function executeInternal() { /* @var $backup \Magento\Backup\Model\Backup */ $backup = $this->_backupModelFactory->create( diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php index 0b9321033825562391fe32f168a6becd278ceacb..f1b60948461c7e168c098605a93adb866784e4ea 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Backup\Controller\Adminhtml\Index * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_view->renderLayout(); diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Index.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Index.php index 6d3e4f75f4a84b93c09042eaa4995c7d3853a909..5335d40f9a8125ab84530edfb48ce81624fc8ce8 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Index.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Backup\Controller\Adminhtml\Index * * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('ajax')) { $this->_forward('grid'); diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php index b0c1af3a1f4db1ba8980fd43ad927729fea2d7b4..c9958e65d66d71ba95f323a94b9dae0ca5ec1db6 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php @@ -13,7 +13,7 @@ class MassDelete extends \Magento\Backup\Controller\Adminhtml\Index * * @return \Magento\Backend\App\Action */ - public function execute() + public function executeInternal() { $backupIds = $this->getRequest()->getParam('ids', []); diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php index fdb4714f0ac8c57a484a241b74443bd47d6bf9e4..bd80aff5febf4c06ed83905ff662a76f768e7d52 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php @@ -19,7 +19,7 @@ class Rollback extends \Magento\Backup\Controller\Adminhtml\Index * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { if (!$this->_objectManager->get('Magento\Backup\Helper\Data')->isRollbackAllowed()) { $this->_forward('denied'); diff --git a/app/code/Magento/Backup/Model/Config/Backend/Cron.php b/app/code/Magento/Backup/Model/Config/Backend/Cron.php index 133e6ad8636ae2dfdcf36f92f067dbd470b49eb7..d7deeebccdea94d8464ff7ec6acb8a2dd7ac4b01 100644 --- a/app/code/Magento/Backup/Model/Config/Backend/Cron.php +++ b/app/code/Magento/Backup/Model/Config/Backend/Cron.php @@ -32,6 +32,7 @@ class Cron extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\ValueFactory $configValueFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -42,6 +43,7 @@ class Cron extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\ValueFactory $configValueFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, @@ -50,13 +52,13 @@ class Cron extends \Magento\Framework\App\Config\Value ) { $this->_runModelPath = $runModelPath; $this->_configValueFactory = $configValueFactory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** * Cron settings after save * - * @return void + * @return $this * @throws \Magento\Framework\Exception\LocalizedException */ public function afterSave() @@ -102,5 +104,6 @@ class Cron extends \Magento\Framework\App\Config\Value } catch (\Exception $e) { throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t save the Cron expression.')); } + return parent::afterSave(); } } diff --git a/app/code/Magento/Backup/Test/Unit/Controller/Adminhtml/Index/DownloadTest.php b/app/code/Magento/Backup/Test/Unit/Controller/Adminhtml/Index/DownloadTest.php index 21d27ef0c5a347c9098906b7f63f19abb665e81a..6d2c6d515f11ef472f6b56691a96525f616b1bd1 100644 --- a/app/code/Magento/Backup/Test/Unit/Controller/Adminhtml/Index/DownloadTest.php +++ b/app/code/Magento/Backup/Test/Unit/Controller/Adminhtml/Index/DownloadTest.php @@ -143,7 +143,7 @@ class DownloadTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Backup\Controller\Adminhtml\Index\Download::execute + * @covers \Magento\Backup\Controller\Adminhtml\Index\Download::executeInternal */ public function testExecuteBackupFound() { @@ -201,11 +201,11 @@ class DownloadTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($this->resultRawMock); - $this->assertSame($this->resultRawMock, $this->downloadController->execute()); + $this->assertSame($this->resultRawMock, $this->downloadController->executeInternal()); } /** - * @covers \Magento\Backup\Controller\Adminhtml\Index\Download::execute + * @covers \Magento\Backup\Controller\Adminhtml\Index\Download::executeInternal * @param int $time * @param bool $exists * @param int $existsCount @@ -240,7 +240,7 @@ class DownloadTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($this->resultRedirectMock); - $this->assertSame($this->resultRedirectMock, $this->downloadController->execute()); + $this->assertSame($this->resultRedirectMock, $this->downloadController->executeInternal()); } /** diff --git a/app/code/Magento/Braintree/Controller/Creditcard/AjaxSave.php b/app/code/Magento/Braintree/Controller/Creditcard/AjaxSave.php index 0177988ea45ab3754d00528e7f4d5e1b3064f2da..c5d284c62cd775aa4c69fef91a2203ede3c153ac 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/AjaxSave.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/AjaxSave.php @@ -14,7 +14,7 @@ class AjaxSave extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { try { $this->vault->processNonce( diff --git a/app/code/Magento/Braintree/Controller/Creditcard/Delete.php b/app/code/Magento/Braintree/Controller/Creditcard/Delete.php index 2dd4c4f9b136b356ac6de35218d9c1c8bedeaecb..a1f8d5e55a95c151d0cc6b7217e0aa8c3b29188f 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/Delete.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/Delete.php @@ -12,7 +12,7 @@ class Delete extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\View\Result\Page|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { if ($this->hasToken()) { if (!$this->vault->storedCard($this->hasToken())) { diff --git a/app/code/Magento/Braintree/Controller/Creditcard/DeleteConfirm.php b/app/code/Magento/Braintree/Controller/Creditcard/DeleteConfirm.php index bef7c62f781895173744abc0ccd2e7e47f2c15cc..20102ff5c36a654a7e5fa3b85cf2f4e91b5a520e 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/DeleteConfirm.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/DeleteConfirm.php @@ -29,7 +29,7 @@ class DeleteConfirm extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { if ($token = $this->hasToken()) { $result = $this->vault->deleteCard($token); diff --git a/app/code/Magento/Braintree/Controller/Creditcard/Edit.php b/app/code/Magento/Braintree/Controller/Creditcard/Edit.php index 864d53f55639bcad696e7ca7035c920af7ca52db..7e88faeeeedf11f3f929ac108befca019f1bdcc0 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/Edit.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/Edit.php @@ -12,7 +12,7 @@ class Edit extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\View\Result\Page|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { if ($this->hasToken()) { if (!$this->vault->storedCard($this->hasToken())) { diff --git a/app/code/Magento/Braintree/Controller/Creditcard/Generate.php b/app/code/Magento/Braintree/Controller/Creditcard/Generate.php index 7bfcdfde5b99270582a0dbeb798f89dee906fa60..41c13f08cdadecfa7167196e0da77eb8eb701d16 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/Generate.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/Generate.php @@ -19,7 +19,7 @@ class Generate extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { try { if ($this->hasToken()) { diff --git a/app/code/Magento/Braintree/Controller/Creditcard/Index.php b/app/code/Magento/Braintree/Controller/Creditcard/Index.php index db240cda6fcc7c2f077c5263b5461981cc22b2e5..9e94ccdb307ce4e1a2bf923da510c01b9b82423e 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/Index.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/Index.php @@ -12,7 +12,7 @@ class Index extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Braintree/Controller/Creditcard/NewCard.php b/app/code/Magento/Braintree/Controller/Creditcard/NewCard.php index 000ba39e0ab21c4bfd5f26fec25745b2dce71591..1ac92a741d17beb9c847cedeb259b6be5171f249 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/NewCard.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/NewCard.php @@ -12,7 +12,7 @@ class NewCard extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Braintree/Controller/Creditcard/Save.php b/app/code/Magento/Braintree/Controller/Creditcard/Save.php index d51c3de282860c48a2d40be82794040015d0b5e6..9080a2a3b65d6c8cad09ad8824839828dfaa8a3f 100644 --- a/app/code/Magento/Braintree/Controller/Creditcard/Save.php +++ b/app/code/Magento/Braintree/Controller/Creditcard/Save.php @@ -12,7 +12,7 @@ class Save extends \Magento\Braintree\Controller\MyCreditCards * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $this->messageManager->addError(__('There was error during saving card data')); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Braintree/Controller/MyCreditCards.php b/app/code/Magento/Braintree/Controller/MyCreditCards.php index 122edc79ca2a0697bddbe08f4a0c787039dce6c9..04ff04202bc09448ec1293e72ec0ab7c69d53858 100644 --- a/app/code/Magento/Braintree/Controller/MyCreditCards.php +++ b/app/code/Magento/Braintree/Controller/MyCreditCards.php @@ -68,7 +68,7 @@ abstract class MyCreditCards extends \Magento\Framework\App\Action\Action * @param RequestInterface $request * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $loginUrl = $this->customerUrl->getLoginUrl(); if (!$this->customerSession->authenticate($loginUrl)) { @@ -82,7 +82,7 @@ abstract class MyCreditCards extends \Magento\Framework\App\Action\Action return $resultRedirect; } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Braintree/Controller/PayPal.php b/app/code/Magento/Braintree/Controller/PayPal.php index e24bd47e8d322c64938c7ea82684d9b59d08c189..b85b605c9ef8d0f890cfd992192622e150978661 100644 --- a/app/code/Magento/Braintree/Controller/PayPal.php +++ b/app/code/Magento/Braintree/Controller/PayPal.php @@ -77,7 +77,7 @@ abstract class PayPal extends \Magento\Framework\App\Action\Action * @param RequestInterface $request * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { if (!$this->braintreePayPalConfig->isActive() || !$this->braintreePayPalConfig->isShortcutCheckoutEnabled()) { $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); @@ -87,7 +87,7 @@ abstract class PayPal extends \Magento\Framework\App\Action\Action return $resultRedirect; } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Braintree/Controller/PayPal/GetButtonData.php b/app/code/Magento/Braintree/Controller/PayPal/GetButtonData.php index 4d070aa489d2cd0a0c944156625d175f9eca4950..4be1d5aaebd5440f432fef25e01d5c8fec28a52e 100644 --- a/app/code/Magento/Braintree/Controller/PayPal/GetButtonData.php +++ b/app/code/Magento/Braintree/Controller/PayPal/GetButtonData.php @@ -37,7 +37,7 @@ class GetButtonData extends \Magento\Framework\App\Action\Action * @return ResultInterface * @throws LocalizedException */ - public function execute() + public function executeInternal() { $isAjax = $this->_request->getParam('isAjax'); diff --git a/app/code/Magento/Braintree/Controller/PayPal/PlaceOrder.php b/app/code/Magento/Braintree/Controller/PayPal/PlaceOrder.php index 45041a25ef04eca3ba2ddee4e4b56f957c07cd8c..febdcf06fed58c3062906ea733b5b26e04235c50 100644 --- a/app/code/Magento/Braintree/Controller/PayPal/PlaceOrder.php +++ b/app/code/Magento/Braintree/Controller/PayPal/PlaceOrder.php @@ -48,7 +48,7 @@ class PlaceOrder extends \Magento\Braintree\Controller\PayPal * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { try { if (!$this->agreementsValidator->isValid(array_keys($this->getRequest()->getPost('agreement', [])))) { diff --git a/app/code/Magento/Braintree/Controller/PayPal/Review.php b/app/code/Magento/Braintree/Controller/PayPal/Review.php index ef01f89b38e11dc78fe6895dd87e5370bb856eb0..48634e9fe7ba8f317187ba1d2e9e6644a32bbb5e 100644 --- a/app/code/Magento/Braintree/Controller/PayPal/Review.php +++ b/app/code/Magento/Braintree/Controller/PayPal/Review.php @@ -49,7 +49,7 @@ class Review extends \Magento\Braintree\Controller\PayPal /** * @return $this|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { $paymentMethodNonce = $this->getRequest()->getParam('payment_method_nonce'); $details = $this->getRequest()->getParam('details'); diff --git a/app/code/Magento/Braintree/Controller/PayPal/SaveShippingMethod.php b/app/code/Magento/Braintree/Controller/PayPal/SaveShippingMethod.php index d8041b7186ea4bb786a7827cd3e34595f6aaf5ba..6ec5b0c18e21fcbd83a9ef38a1ca46e6ac37d0eb 100644 --- a/app/code/Magento/Braintree/Controller/PayPal/SaveShippingMethod.php +++ b/app/code/Magento/Braintree/Controller/PayPal/SaveShippingMethod.php @@ -15,7 +15,7 @@ class SaveShippingMethod extends \Magento\Braintree\Controller\PayPal * * @return void */ - public function execute() + public function executeInternal() { try { $isAjax = $this->getRequest()->getParam('isAjax'); diff --git a/app/code/Magento/Braintree/Model/PaymentMethod.php b/app/code/Magento/Braintree/Model/PaymentMethod.php index 45171956e87bcf8832723f7b7dffeb90ea5f1f79..da5ff0d88e29aaf2bf417fa332cf57659672fe04 100644 --- a/app/code/Magento/Braintree/Model/PaymentMethod.php +++ b/app/code/Magento/Braintree/Model/PaymentMethod.php @@ -604,7 +604,7 @@ class PaymentMethod extends \Magento\Payment\Model\Method\Cc if ($result->success) { $payment->setIsTransactionClosed(false) ->setShouldCloseParentTransaction(false); - if ($this->isFinalCapture($payment->getParentId(), $amount)) { + if ($payment->isCaptureFinal($amount)) { $payment->setShouldCloseParentTransaction(true); } } else { @@ -657,7 +657,6 @@ class PaymentMethod extends \Magento\Payment\Model\Method\Cc : $this->braintreeTransaction->refund($transactionId, $amount); $this->_debug($this->_convertObjToArray($result)); if ($result->success) { - $payment->setTransactionId($transactionId . '-' . Transaction::TYPE_REFUND); $payment->setIsTransactionClosed(true); } else { throw new LocalizedException($this->errorHelper->parseBraintreeError($result)); @@ -905,7 +904,7 @@ class PaymentMethod extends \Magento\Payment\Model\Method\Cc ->setAdditionalInformation($this->getExtraTransactionInformation($result->transaction)) ->setAmount($amount) ->setShouldCloseParentTransaction(false); - if ($this->isFinalCapture($payment->getParentId(), $amount)) { + if ($payment->isCaptureFinal($amount)) { $payment->setShouldCloseParentTransaction(true); } if (isset($result->transaction->creditCard['token']) && $result->transaction->creditCard['token']) { @@ -964,21 +963,4 @@ class PaymentMethod extends \Magento\Payment\Model\Method\Cc { return json_decode(json_encode($data), true); } - - /** - * Checks whether the capture is final - * - * @param string $orderId - * @param string $amount - * @return bool - */ - protected function isFinalCapture($orderId, $amount) - { - if (!empty($orderId)) { - $order = $this->orderRepository->get($orderId); - return (float)$order->getTotalDue() === (float) $amount; - } - - return false; - } } diff --git a/app/code/Magento/Braintree/Model/System/Config/Backend/Countrycreditcard.php b/app/code/Magento/Braintree/Model/System/Config/Backend/Countrycreditcard.php index 7e234209d001fe8b21439b3f755f2434e791678c..73b1c40112ec7c408332f9eda97da6fafd1f862a 100644 --- a/app/code/Magento/Braintree/Model/System/Config/Backend/Countrycreditcard.php +++ b/app/code/Magento/Braintree/Model/System/Config/Backend/Countrycreditcard.php @@ -16,6 +16,7 @@ class Countrycreditcard extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Math\Random $mathRandom * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -25,13 +26,14 @@ class Countrycreditcard extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Math\Random $mathRandom, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->mathRandom = $mathRandom; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/AjaxSaveTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/AjaxSaveTest.php index 53e070f5843a81ac46817a4e96067d2bd5b7dbf4..ff09bdb9e322fd741f2edc6e6ed00c14dd49df95 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/AjaxSaveTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/AjaxSaveTest.php @@ -88,8 +88,8 @@ class AjaxSaveTest extends \PHPUnit_Framework_TestCase ->method('addSuccess') ->with($phrase); - - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\AjaxSave $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\AjaxSave', [ 'request' => $this->request, @@ -98,7 +98,7 @@ class AjaxSaveTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultJson, $notification->execute()); + $this->assertSame($this->resultJson, $controller->executeInternal()); } /** @@ -124,7 +124,8 @@ class AjaxSaveTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with($phrase); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\AjaxSave $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\AjaxSave', [ 'request' => $this->request, @@ -134,6 +135,6 @@ class AjaxSaveTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultJson, $notification->execute()); + $this->assertSame($this->resultJson, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteConfirmTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteConfirmTest.php index a3047c7cac4437e36a750f67dd3b6458c2b80db2..13029d4d144b369a8de4a57cabb2b528eb5809ab 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteConfirmTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteConfirmTest.php @@ -66,7 +66,7 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action and asserts successfully deleted */ - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManagerHelper($this); $phrase = new \Magento\Framework\Phrase('Credit card successfully deleted'); @@ -93,7 +93,8 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ->method('addSuccess') ->with($phrase); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\DeleteConfirm $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\DeleteConfirm', [ 'request' => $this->request, @@ -103,13 +104,13 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } /** * Executes the controller action and asserts with redirect for non valid token param */ - public function testExecuteNoTokenRedirect() + public function testExecuteInternalNoTokenRedirect() { $objectManager = new ObjectManagerHelper($this); @@ -128,7 +129,8 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ->method('setPath') ->willReturnSelf(); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Edit $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Edit', [ 'request' => $this->request, @@ -137,13 +139,13 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } /** * Executes the controller action and asserts with redirects for can't delete card logic */ - public function testExecuteNonExistingTokenRedirect() + public function testExecuteInternalNonExistingTokenRedirect() { $objectManager = new ObjectManagerHelper($this); $phrase = new \Magento\Framework\Phrase('a,b,c'); @@ -172,7 +174,8 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with($phrase); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\DeleteConfirm $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\DeleteConfirm', [ 'request' => $this->request, @@ -182,13 +185,13 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } /** * Executes the controller action and asserts failed deletion */ - public function testExecuteSaveFail() + public function testExecuteInternalSaveFail() { $objectManager = new ObjectManagerHelper($this); $phrase = new \Magento\Framework\Phrase('There was error deleting the credit card'); @@ -214,7 +217,8 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with($phrase); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\DeleteConfirm $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\DeleteConfirm', [ 'request' => $this->request, @@ -224,6 +228,6 @@ class DeleteConfirmTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteTest.php index 504c186ad11773a7e3b7739ac95d9946e4151b74..76c7fa5b7528ab6b9350c029d7f0e473d7799932 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/DeleteTest.php @@ -106,7 +106,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action and asserts non exception logic */ - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManagerHelper($this); @@ -138,8 +138,8 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->method('getConfig') ->willReturn($this->pageConfig); - - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Delete $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Delete', [ 'request' => $this->request, @@ -148,13 +148,13 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultPage, $notification->execute()); + $this->assertSame($this->resultPage, $controller->executeInternal()); } /** * Executes the controller action and asserts with redirect for non valid token param */ - public function testExecuteNoTokenRedirect() + public function testExecuteInternalNoTokenRedirect() { $objectManager = new ObjectManagerHelper($this); @@ -176,7 +176,8 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->method('setPath') ->willReturnSelf(); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Delete $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Delete', [ 'request' => $this->request, @@ -186,13 +187,13 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } /** * Executes the controller action and asserts with redirects for non existing logic */ - public function testExecuteNonExistingTokenRedirect() + public function testExecuteInternalNonExistingTokenRedirect() { $objectManager = new ObjectManagerHelper($this); $phrase = new \Magento\Framework\Phrase('Credit card does not exist'); @@ -224,8 +225,8 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with($phrase); - - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Delete $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Delete', [ 'request' => $this->request, @@ -236,6 +237,6 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/EditTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/EditTest.php index cd14d7181346d491c424dde2e5f2301965cc8c98..7742f863e16a87dc1df0e22a0b938b4af7ef2cc3 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/EditTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/EditTest.php @@ -106,7 +106,7 @@ class EditTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action and asserts non exception logic */ - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManagerHelper($this); @@ -138,8 +138,8 @@ class EditTest extends \PHPUnit_Framework_TestCase ->method('getConfig') ->willReturn($this->pageConfig); - - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Edit $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Edit', [ 'request' => $this->request, @@ -148,13 +148,13 @@ class EditTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultPage, $notification->execute()); + $this->assertSame($this->resultPage, $controller->executeInternal()); } /** * Executes the controller action and asserts with redirect for non valid token param */ - public function testExecuteNoTokenRedirect() + public function testExecuteInternalNoTokenRedirect() { $objectManager = new ObjectManagerHelper($this); @@ -176,7 +176,8 @@ class EditTest extends \PHPUnit_Framework_TestCase ->method('setPath') ->willReturnSelf(); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Edit $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Edit', [ 'request' => $this->request, @@ -186,13 +187,13 @@ class EditTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } /** * Executes the controller action and asserts with redirects for non existing logic */ - public function testExecuteNonExistingTokenRedirect() + public function testExecuteInternalNonExistingTokenRedirect() { $objectManager = new ObjectManagerHelper($this); $phrase = new \Magento\Framework\Phrase('Credit card does not exist'); @@ -224,8 +225,8 @@ class EditTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with($phrase); - - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Edit $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Edit', [ 'request' => $this->request, @@ -236,6 +237,6 @@ class EditTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/GenerateTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/GenerateTest.php index 40540bb9da8c0dafe14ffbbf70bf209aff6cfc7c..8f000251d18c7ed39a8171493bc0d83cc21a91dd 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/GenerateTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/GenerateTest.php @@ -72,7 +72,7 @@ class GenerateTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action and asserts non exception logic */ - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManager($this); $this->resultJson->expects($this->once()) @@ -87,7 +87,8 @@ class GenerateTest extends \PHPUnit_Framework_TestCase ->method('getParam') ->willReturn(true); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Generate $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Generate', [ 'request' => $this->request, @@ -96,13 +97,13 @@ class GenerateTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultJson, $notification->execute()); + $this->assertSame($this->resultJson, $controller->executeInternal()); } /** * Executes the controller action and asserts non exception logic */ - public function testExecuteLocalizedException() + public function testExecuteInternalLocalizedException() { $phrase = new \Magento\Framework\Phrase('Something went wrong while processing.'); $objectManager = new ObjectManager($this); @@ -126,7 +127,8 @@ class GenerateTest extends \PHPUnit_Framework_TestCase ->method('getParam') ->willReturn(true); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Generate $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Generate', [ 'request' => $this->request, @@ -136,6 +138,6 @@ class GenerateTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultJson, $notification->execute()); + $this->assertSame($this->resultJson, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/IndexTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/IndexTest.php index 7f8e3861a48dee3ba83c8f0e19136950781c0c24..38e88b0586e88ab1f04a181ae6cc63956001008f 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/IndexTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/IndexTest.php @@ -86,17 +86,18 @@ class IndexTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action and asserts non exception logic */ - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManagerHelper($this); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Index $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Index', [ 'resultPageFactory' => $this->resultPageFactory, ] ); - $this->assertSame($this->resultPage, $notification->execute()); + $this->assertSame($this->resultPage, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/NewCardTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/NewCardTest.php index ee655fe49b0834a6d249bad099a50c819ef8329d..23607cc3839854ef4071de1eeaf19ccc63aa8fea 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/NewCardTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/NewCardTest.php @@ -94,7 +94,7 @@ class NewCardTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action and asserts non exception logic */ - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManagerHelper($this); $customerId = 1; @@ -103,7 +103,8 @@ class NewCardTest extends \PHPUnit_Framework_TestCase ->method('getCustomerId') ->willReturn($customerId); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\NewCard $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\NewCard', [ 'resultPageFactory' => $this->resultPageFactory, @@ -111,6 +112,6 @@ class NewCardTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultPage, $notification->execute()); + $this->assertSame($this->resultPage, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/SaveTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/SaveTest.php index ff42e7e7c6e0e98ad4e6a2d0c2b25c4eae8b2469..512dbb4d07c253f01831dec3c976855772b65105 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/SaveTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Creditcard/SaveTest.php @@ -58,7 +58,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action */ - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManagerHelper($this); $phrase = new \Magento\Framework\Phrase('There was error during saving card data'); @@ -84,7 +84,8 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with($phrase); - $notification = $objectManager->getObject( + /** @var \Magento\Braintree\Controller\Creditcard\Save $controller */ + $controller = $objectManager->getObject( 'Magento\Braintree\Controller\Creditcard\Save', [ 'request' => $this->request, @@ -93,6 +94,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->execute()); + $this->assertSame($this->resultRedirect, $controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/MyCreditCardsTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/MyCreditCardsTest.php index 39f70eb0ce2ae317a337397b6c045731d7be8402..657d83e1f7ae0786de1faf18b7bf2348e3ec47c7 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/MyCreditCardsTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/MyCreditCardsTest.php @@ -113,7 +113,7 @@ class MyCreditCardsTest extends \PHPUnit_Framework_TestCase $requestInterface= $this->getMockBuilder('\Magento\Framework\App\RequestInterface') ->getMock(); - $notification = $objectManager->getObject( + $controller = $objectManager->getObject( 'Magento\Braintree\Test\Unit\Controller\Stub\MyCreditCardsStub', [ 'customerSession' => $this->customerSession, @@ -123,7 +123,7 @@ class MyCreditCardsTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->resultRedirect, $notification->dispatch($requestInterface)); + $this->assertSame($this->resultRedirect, $controller->execute($requestInterface)); } /** @@ -156,7 +156,7 @@ class MyCreditCardsTest extends \PHPUnit_Framework_TestCase ->getMock(); - $notification = $objectManager->getObject( + $controller = $objectManager->getObject( 'Magento\Braintree\Test\Unit\Controller\Stub\MyCreditCardsStub', [ 'customerSession' => $this->customerSession, @@ -167,6 +167,6 @@ class MyCreditCardsTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertSame($this->_response, $notification->dispatch($requestInterface)); + $this->assertSame($this->_response, $controller->execute($requestInterface)); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/GetButtonDataTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/GetButtonDataTest.php index 75718aa2f9c35289a65a7230161848539d2db14b..ee314f710e26ca732fe74b644089aed3d95ab0db 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/GetButtonDataTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/GetButtonDataTest.php @@ -85,7 +85,7 @@ class GetButtonDataTest extends \PHPUnit_Framework_TestCase ->willReturn($data['currency']); $getButtonData = new GetButtonData($this->contextMock, $this->checkoutSessionMock); - $getButtonData->execute(); + $getButtonData->executeInternal(); } /** @@ -168,7 +168,7 @@ class GetButtonDataTest extends \PHPUnit_Framework_TestCase ->method('getQuote'); $getButtonData = new GetButtonData($this->contextMock, $this->checkoutSessionMock); - $getButtonData->execute(); + $getButtonData->executeInternal(); } /** diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/PlaceOrderTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/PlaceOrderTest.php index e27de2bedd42cc30865b3db67b6b44f9a7c1dbcc..1d4fb2a241b7815a79b17b7d4c1835b73ec07059 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/PlaceOrderTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/PlaceOrderTest.php @@ -204,7 +204,7 @@ class PlaceOrderTest extends \PHPUnit_Framework_TestCase ->with(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT) ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->execute()); + $this->assertEquals($resultRedirect, $this->controller->executeInternal()); } public function testExecuteException() @@ -234,6 +234,6 @@ class PlaceOrderTest extends \PHPUnit_Framework_TestCase ->with(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT) ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->execute()); + $this->assertEquals($resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/ReviewTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/ReviewTest.php index bac4378b974a62f6be1313f2abce623867822ab6..c7fc1da8662620f2681e92cb6ae1ccb6bf18d087 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/ReviewTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/ReviewTest.php @@ -253,7 +253,7 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->with($paymentMethodNonce, ['email' => $email]); $resultPageMock = $this->setupReviewPage($quoteMock); - $this->assertEquals($resultPageMock, $this->controller->execute()); + $this->assertEquals($resultPageMock, $this->controller->executeInternal()); } public function testExecuteWithBillingAddress() @@ -285,7 +285,7 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->with($paymentMethodNonce, $details); $resultPageMock = $this->setupReviewPage($quoteMock); - $this->assertEquals($resultPageMock, $this->controller->execute()); + $this->assertEquals($resultPageMock, $this->controller->executeInternal()); } public function testExecuteRefresh() @@ -296,7 +296,7 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->willReturn(\Magento\Braintree\Model\PaymentMethod\PayPal::METHOD_CODE); $resultPageMock = $this->setupReviewPage($quoteMock); - $this->assertEquals($resultPageMock, $this->controller->execute()); + $this->assertEquals($resultPageMock, $this->controller->executeInternal()); } public function testExecuteNoPayment() @@ -328,7 +328,7 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->method('create') ->with(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT) ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->execute()); + $this->assertEquals($resultRedirect, $this->controller->executeInternal()); } public function testExecuteIncorrectPaymentMathod() @@ -352,7 +352,7 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->method('create') ->with(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT) ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->execute()); + $this->assertEquals($resultRedirect, $this->controller->executeInternal()); } public function testExecuteValidationFailure() @@ -400,7 +400,7 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->method('create') ->with(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT) ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->execute()); + $this->assertEquals($resultRedirect, $this->controller->executeInternal()); } public function testExecuteException() @@ -447,6 +447,6 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->method('create') ->with(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT) ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->execute()); + $this->assertEquals($resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/SaveShippingMethodTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/SaveShippingMethodTest.php index 38d61187310a6a6146435c7d6c55e62870398ab8..c1c5da115fcfacce48ee662e9b24bf87ff74a26e 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/SaveShippingMethodTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/PayPal/SaveShippingMethodTest.php @@ -198,7 +198,7 @@ class SaveShippingMethodTest extends \PHPUnit_Framework_TestCase ->with(ResultFactory::TYPE_PAGE) ->willReturn($responsePageMock); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteException() @@ -236,6 +236,6 @@ class SaveShippingMethodTest extends \PHPUnit_Framework_TestCase ->method('setBody') ->with($html); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/PayPalTest.php b/app/code/Magento/Braintree/Test/Unit/Controller/PayPalTest.php index b20831f92fe1d2be7ba0bb66aa61d0b86733a6c5..f9d3db87e6d6f9310b9273104084a10b1c8b822a 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/PayPalTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/PayPalTest.php @@ -125,7 +125,7 @@ class PayPalTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->dispatch($this->requestMock)); + $this->assertEquals($resultRedirect, $this->controller->execute($this->requestMock)); $this->assertEquals('noRoute', $resultRedirect->getPath()) ; } @@ -146,7 +146,7 @@ class PayPalTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($resultRedirect); - $this->assertEquals($resultRedirect, $this->controller->dispatch($this->requestMock)); + $this->assertEquals($resultRedirect, $this->controller->execute($this->requestMock)); $this->assertEquals('noRoute', $resultRedirect->getPath()) ; } } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Stub/MyCreditCardsStub.php b/app/code/Magento/Braintree/Test/Unit/Controller/Stub/MyCreditCardsStub.php index 971edb13bfa61df570c7afcfe5edbe928dde988d..b8abdda7eb05ff49cff58fbcfd6d4250d75a3814 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Stub/MyCreditCardsStub.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Stub/MyCreditCardsStub.php @@ -8,7 +8,7 @@ namespace Magento\Braintree\Test\Unit\Controller\Stub; class MyCreditCardsStub extends \Magento\Braintree\Controller\MyCreditCards { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/app/code/Magento/Braintree/Test/Unit/Controller/Stub/PayPalStub.php b/app/code/Magento/Braintree/Test/Unit/Controller/Stub/PayPalStub.php index b0b5a3dc3188418129fa7e00d7a6baef20e8aa9e..ca9248d5e6b509097efb39e3068879879b9edff4 100644 --- a/app/code/Magento/Braintree/Test/Unit/Controller/Stub/PayPalStub.php +++ b/app/code/Magento/Braintree/Test/Unit/Controller/Stub/PayPalStub.php @@ -8,7 +8,7 @@ namespace Magento\Braintree\Test\Unit\Controller\Stub; class PayPalStub extends \Magento\Braintree\Controller\PayPal { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/app/code/Magento/Braintree/Test/Unit/Model/PaymentMethodTest.php b/app/code/Magento/Braintree/Test/Unit/Model/PaymentMethodTest.php index e20af765062e3b3b0713c5732d5b67f8f3c279f3..749c2cf390f36359a4364027e9612a76ed810f89 100644 --- a/app/code/Magento/Braintree/Test/Unit/Model/PaymentMethodTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Model/PaymentMethodTest.php @@ -32,6 +32,7 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase const LNAME = 'Doe'; const AUTH_TRAN_ID = 'r4z34j'; const AUTH_AMOUNT = 5.76; + const TOTAL_AMOUNT = 10.02; const AUTH_CC_LAST_4 = '0004'; const CUSTOMER_ID = '221b3649effb4bb1b62fc940691bd18c'; @@ -325,11 +326,8 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase * @param $ccType * @param null $ccToken */ - protected function setupInfoInstance( - $countryId, - $ccType, - $ccToken = null - ) { + protected function setupInfoInstance($countryId, $ccType, $ccToken = null) + { $quoteObj = new \Magento\Framework\DataObject( [ 'billing_address' => new \Magento\Framework\DataObject( @@ -501,6 +499,7 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase 'getCustomerEmail', 'getCustomerId', 'getStoreId', + 'getTotalDue' ] )->getMock(); @@ -522,18 +521,25 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase $orderMock->expects($this->any()) ->method('getStoreId') ->willReturn($storeId); + $orderMock->expects(static::any()) + ->method('getTotalDue') + ->willReturn(self::TOTAL_AMOUNT); + + $this->orderRepository->expects(static::any()) + ->method('get') + ->willReturn($orderMock); + return $orderMock; } + /** * @param \Magento\Framework\DataObject $paymentObject * @param int $storeId * @return array * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - protected function setupPaymentObject( - \Magento\Framework\DataObject $paymentObject, - $storeId - ) { + protected function setupPaymentObject(\Magento\Framework\DataObject $paymentObject, $storeId) + { $customerId = '12'; $customerEmail = 'abc@example.com'; $company = 'NA'; @@ -564,13 +570,9 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase 'address_type' => 'billing', ]; - $billingAddress = new \Magento\Framework\DataObject( - $addressData - ); + $billingAddress = new \Magento\Framework\DataObject($addressData); $addressData['address_type'] = 'shipping'; - $shippingAddress = new \Magento\Framework\DataObject( - $addressData - ); + $shippingAddress = new \Magento\Framework\DataObject($addressData); $order = $this->setupOrderMock( $billingAddress, @@ -606,26 +608,26 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase ->willReturn($regionMock); $braintreeAddressData = [ - 'firstName' => self::FNAME, - 'lastName' => self::LNAME, - 'company' => $company, - 'streetAddress' => $street, - 'extendedAddress' => $street2, - 'locality' => $city, - 'region' => $regionCode, - 'postalCode' => $postcode, + 'firstName' => self::FNAME, + 'lastName' => self::LNAME, + 'company' => $company, + 'streetAddress' => $street, + 'extendedAddress' => $street2, + 'locality' => $city, + 'region' => $regionCode, + 'postalCode' => $postcode, 'countryCodeAlpha2' => $countryId, ]; return [ - 'channel' => self::CHANNEL, - 'orderId' => $orderId, - 'customer' => [ + 'channel' => self::CHANNEL, + 'orderId' => $orderId, + 'customer' => [ 'firstName' => self::FNAME, - 'lastName' => self::LNAME, - 'company' => $company, - 'phone' => $phone, - 'fax' => $fax, - 'email' => $customerEmail, + 'lastName' => self::LNAME, + 'company' => $company, + 'phone' => $phone, + 'fax' => $fax, + 'email' => $customerEmail, ], 'billing' => $braintreeAddressData, 'shipping' => $braintreeAddressData, @@ -765,8 +767,11 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase ) { $storeId = 3; $amount = self::AUTH_AMOUNT; - $paymentObject = $this->objectManagerHelper->getObject('Magento\Sales\Model\Order\Payment'); - + $currencyMock = $this->getPriceCurrencyMock(); + /** @var \Magento\Sales\Model\Order\Payment $paymentObject */ + $paymentObject = $this->objectManagerHelper->getObject('Magento\Sales\Model\Order\Payment', [ + 'priceCurrency' => $currencyMock + ]); $expectedRequestAttribs = $this->setupAuthorizeRequest( $configData, @@ -798,14 +803,6 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase } $paymentObject->setParentId('1'); - $order = $this->getMockBuilder('Magento\Sales\Api\Data\OrderInterface') - ->getMockForAbstractClass(); - $order->expects($this->once()) - ->method('getTotalDue') - ->willReturn(10.02); - $this->orderRepository->expects($this->once()) - ->method('get') - ->willReturn($order); $this->assertEquals($this->model, $this->model->authorize($paymentObject, $amount)); foreach ($expectedPaymentFields as $key => $value) { @@ -1598,13 +1595,8 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage error */ - public function testAuthorizeError( - array $configData, - $vault, - $registry, - $existingCustomer, - array $paymentInfo - ) { + public function testAuthorizeError(array $configData, $vault, $registry, $existingCustomer, array $paymentInfo) + { $storeId = 3; $amount = self::AUTH_AMOUNT; $paymentObject = $this->objectManagerHelper->getObject('Magento\Sales\Model\Order\Payment'); @@ -1649,13 +1641,8 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage Please try again later */ - public function testAuthorizeException( - array $configData, - $vault, - $registry, - $existingCustomer, - array $paymentInfo - ) { + public function testAuthorizeException(array $configData, $vault, $registry, $existingCustomer, array $paymentInfo) + { $storeId = 3; $amount = self::AUTH_AMOUNT; $paymentObject = $this->objectManagerHelper->getObject('Magento\Sales\Model\Order\Payment'); @@ -1716,10 +1703,8 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase * @param int $numberOfTransactions * @return $this */ - protected function setupSalesTransaction( - $paymentId, - $numberOfTransactions - ) { + protected function setupSalesTransaction($paymentId, $numberOfTransactions) + { $transactionCollectionMock = $this->getMockBuilder( 'Magento\Sales\Model\ResourceModel\Order\Payment\Transaction\Collection' )->disableOriginalConstructor() @@ -1741,12 +1726,24 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase return $this; } - protected function setupPaymentObjectForCapture( - $paymentId - ) { + protected function setupPaymentObjectForCapture($paymentId) + { + $order = $this->getMockBuilder('Magento\Sales\Api\Data\OrderInterface') + ->getMockForAbstractClass(); + $order->expects(static::any()) + ->method('getTotalDue') + ->willReturn(self::TOTAL_AMOUNT); + $this->orderRepository->expects(static::any()) + ->method('get') + ->willReturn($order); + + $currencyMock = $this->getPriceCurrencyMock(); + $paymentObject = $this->objectManagerHelper->getObject( 'Magento\Sales\Model\Order\Payment', [ + 'priceCurrency' => $currencyMock, + 'orderRepository' => $this->orderRepository, 'data' => [ 'id' => $paymentId, 'cc_trans_id' => self::AUTH_TRAN_ID, @@ -1756,6 +1753,11 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase return $paymentObject; } + + /** + * @covers \Magento\Braintree\Model\PaymentMethod::capture() + * @throws LocalizedException + */ public function testCaptureSuccess() { $amount = self::AUTH_AMOUNT; @@ -1774,20 +1776,40 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase ->method('critical'); $paymentObject->setParentId('1'); - $order = $this->getMockBuilder('Magento\Sales\Api\Data\OrderInterface') - ->getMockForAbstractClass(); - $order->expects($this->once()) - ->method('getTotalDue') - ->willReturn(10.02); - $this->orderRepository->expects($this->once()) - ->method('get') - ->willReturn($order); $this->model->capture($paymentObject, $amount); $this->assertEquals(0, $paymentObject->getIsTransactionClosed()); $this->assertFalse($paymentObject->getShouldCloseParentTransaction()); } + /** + * @covers \Magento\Braintree\Model\PaymentMethod::capture() + * @return void + */ + public function testCaptureSuccessAuthTransactionClosed() + { + $paymentId = 31232; + /** @var \Magento\Sales\Model\Order\Payment $payment */ + $payment = $this->setupPaymentObjectForCapture($paymentId); + $this->setupSalesTransaction($paymentId, 0); //no existing capture transaction + + $result = $this->setupSuccessResponse([]); + $this->braintreeTransactionMock->expects(static::once()) + ->method('submitForSettlement') + ->with(self::AUTH_TRAN_ID, self::TOTAL_AMOUNT) + ->willReturn($result); + + $this->psrLoggerMock->expects(static::never()) + ->method('critical'); + + $payment->setParentId(1); + $this->model->capture($payment, self::TOTAL_AMOUNT); + + static::assertFalse($payment->getIsTransactionClosed()); + static::assertTrue($payment->getShouldCloseParentTransaction()); + + } + /** * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage There was an error capturing the transaction: error. @@ -1820,10 +1842,8 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase $this->model->capture($paymentObject, $amount); } - protected function setupAuthTransaction( - $paymentId, - $authTransaction - ) { + protected function setupAuthTransaction($paymentId, $authTransaction) + { $authTransactionCollectionMock = $this->getMockBuilder( 'Magento\Sales\Model\ResourceModel\Order\Payment\Transaction\Collection' )->disableOriginalConstructor() @@ -1926,14 +1946,6 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase ->willReturn($result); $paymentObject->setParentId('1'); - $order = $this->getMockBuilder('Magento\Sales\Api\Data\OrderInterface') - ->getMockForAbstractClass(); - $order->expects($this->once()) - ->method('getTotalDue') - ->willReturn(10.02); - $this->orderRepository->expects($this->once()) - ->method('get') - ->willReturn($order); $this->model->capture($paymentObject, $amount); $this->assertEquals(0, $paymentObject->getIsTransactionClosed()); @@ -2115,17 +2127,10 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase 'submitForSettlement' => true, ], ] - )->willReturn($resultSuccess); + ) + ->willReturn($resultSuccess); $paymentObject->setParentId('1'); - $order = $this->getMockBuilder('Magento\Sales\Api\Data\OrderInterface') - ->getMockForAbstractClass(); - $order->expects($this->once()) - ->method('getTotalDue') - ->willReturn(10.02); - $this->orderRepository->expects($this->once()) - ->method('get') - ->willReturn($order); $this->model->capture($paymentObject, $amount); $this->assertEquals(PaymentMethod::STATUS_APPROVED, $paymentObject->getStatus()); @@ -2192,9 +2197,8 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase //End: test capture //Start: test refund - protected function setupPaymentObjectForRefund( - $refundTransactionId - ) { + protected function setupPaymentObjectForRefund($refundTransactionId) + { $paymentObject = $this->objectManagerHelper->getObject( 'Magento\Sales\Model\Order\Payment', [ @@ -2379,7 +2383,6 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase $this->model->refund($paymentObject, $amount); $this->assertEquals(1, $paymentObject->getIsTransactionClosed()); - $this->assertEquals($refundTransactionId . '-' .Transaction::TYPE_REFUND, $paymentObject->getTransactionId()); } /** @@ -2461,9 +2464,8 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase ->willReturnArgument(0); } - protected function setupPaymentObjectForVoid( - $orderId - ) { + protected function setupPaymentObjectForVoid($orderId) + { $paymentObject = $this->objectManagerHelper->getObject( 'Magento\Sales\Model\Order\Payment' ); @@ -2666,4 +2668,22 @@ class PaymentMethodTest extends \PHPUnit_Framework_TestCase ->willReturn($orderMock); $this->assertEquals(false, $this->model->canVoid()); } + + /** + * @return \Magento\Directory\Model\PriceCurrency|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPriceCurrencyMock() + { + $currencyMock = $this->getMockBuilder('\Magento\Directory\Model\PriceCurrency') + ->disableOriginalConstructor() + ->setMethods(['round']) + ->getMock(); + $currencyMock->expects(static::any()) + ->method('round') + ->willReturnMap([ + [self::TOTAL_AMOUNT, round(self::TOTAL_AMOUNT, 2)], + [self::AUTH_AMOUNT, round(self::AUTH_AMOUNT, 2)] + ]); + return $currencyMock; + } } diff --git a/app/code/Magento/Braintree/view/adminhtml/templates/form.phtml b/app/code/Magento/Braintree/view/adminhtml/templates/form.phtml index 5610e082e1715e36dcecc8f7cc241bf1aeee2798..508313a25527a942d6c55cea7fd64873528e91a6 100644 --- a/app/code/Magento/Braintree/view/adminhtml/templates/form.phtml +++ b/app/code/Magento/Braintree/view/adminhtml/templates/form.phtml @@ -7,7 +7,7 @@ // @codingStandardsIgnoreFile /** @var \Magento\Braintree\Block\Form $block */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); $storedCards = $this->helper('\Magento\Braintree\Helper\Createorder')->getLoggedInCustomerCards(); $useVault = $block->useVault(); $useCvv = $block->useCvv(); diff --git a/app/code/Magento/Braintree/view/frontend/templates/PayPal/shortcut.phtml b/app/code/Magento/Braintree/view/frontend/templates/PayPal/shortcut.phtml index 267a6fede0644551bf2e45c5027bf2aebc9effe4..6edb66bd04c8f1c5858104007035a9b83c14fad9 100644 --- a/app/code/Magento/Braintree/view/frontend/templates/PayPal/shortcut.phtml +++ b/app/code/Magento/Braintree/view/frontend/templates/PayPal/shortcut.phtml @@ -42,7 +42,7 @@ $config = [ class="paypal checkout <?php echo $block->escapeHtml($block->getShowOrPosition()) ?> paypal-logo" > <fieldset class="fieldset paypal items"> - <div id="<?php /* @noEscape */ echo $containerId ?>" + <div id="<?php echo $block->escapeHtml($containerId); ?>" data-mage-init='<?php /* @noEscape */ echo json_encode($config); ?>'></div> </fieldset> </div> diff --git a/app/code/Magento/Braintree/view/frontend/templates/creditcard/edit.phtml b/app/code/Magento/Braintree/view/frontend/templates/creditcard/edit.phtml index 6fcac2eae9c411929472c7b79ef1038836646183..7c49fa2eecbd8f9859e66af635d3369ad6bb8a21 100644 --- a/app/code/Magento/Braintree/view/frontend/templates/creditcard/edit.phtml +++ b/app/code/Magento/Braintree/view/frontend/templates/creditcard/edit.phtml @@ -9,8 +9,8 @@ /** @var $block \Magento\Braintree\Block\Creditcard\Management */ echo $block->getLayout()->getMessagesBlock()->getGroupedHtml(); -$defaultExpMonth = $block->getTodayMonth(); -$defaultExpYear = $block->getTodayYear(); +$defaultExpMonth = ''; +$defaultExpYear = ''; $countrySpecificCardTypeConfig = $block->getCountrySpecificCardTypeConfig(); $applicableCardTypeConfig = $block->getCcApplicableTypes(); if ($block->isEditMode()) { @@ -164,7 +164,7 @@ $serializedFormData = $this->helper('Magento\Framework\Json\Helper\Data')->jsonE class="year required-entry" data-validate="{required:true}"> <?php foreach ($block->getCcYears() as $k => $v): ?> - <option value="<?php /* @noEscape */ echo $k ? $k : ''; ?>" + <option value="<?php /* @noEscape */ echo $k ? $block->escapeHtml($k) : ''; ?>" <?php if ($k == $defaultExpYear): ?> selected="selected"<?php endif; ?>> <?php echo $block->escapeHtml($v); ?> </option> @@ -328,7 +328,7 @@ $serializedFormData = $this->helper('Magento\Framework\Json\Helper\Data')->jsonE </label> <div class="control"> - <?php echo $block->escapeHtml($block->countrySelect('credit_card[billing_address][country_code_alpha2]', 'billing_address_country', $default)); ?> + <?php /* @noEscape */ echo $block->countrySelect('credit_card[billing_address][country_code_alpha2]', 'billing_address_country', $default); ?> </div> </div> </fieldset> diff --git a/app/code/Magento/Braintree/view/frontend/templates/form.phtml b/app/code/Magento/Braintree/view/frontend/templates/form.phtml index 459a61568cff7fa67f19d3146b1a2f7e0fb5ff5d..41029526cc388a58d93dc9c8ef119d99a1ccafd4 100644 --- a/app/code/Magento/Braintree/view/frontend/templates/form.phtml +++ b/app/code/Magento/Braintree/view/frontend/templates/form.phtml @@ -7,7 +7,7 @@ // @codingStandardsIgnoreFile /** @var \Magento\Braintree\Block\Form $block */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); $loggedIn = $block->isCustomerLoggedIn(); $storedCards = $block->getStoredCards(); $useVault = $loggedIn && $block->useVault() && count($storedCards); diff --git a/app/code/Magento/Bundle/Block/Adminhtml/Order/Create/Sidebar.php b/app/code/Magento/Bundle/Block/Adminhtml/Order/Create/Sidebar.php new file mode 100644 index 0000000000000000000000000000000000000000..12a3d48d20c4bf596652cdd1635bfe27584cef67 --- /dev/null +++ b/app/code/Magento/Bundle/Block/Adminhtml/Order/Create/Sidebar.php @@ -0,0 +1,51 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Bundle\Block\Adminhtml\Order\Create; + +class Sidebar +{ + /** + * Get item qty + * + * @param \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject + * @param callable $proceed + * @param \Magento\Framework\DataObject $item + * + * @return string + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function aroundGetItemQty( + \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject, + \Closure $proceed, + \Magento\Framework\DataObject $item + ) { + if ($item->getProduct()->getTypeId() == \Magento\Bundle\Model\Product\Type::TYPE_CODE) { + return ''; + } + return $proceed($item); + } + + /** + * Check whether product configuration is required before adding to order + * + * @param \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject + * @param callable $proceed + * @param string $productType + * + * @return bool + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function aroundIsConfigurationRequired( + \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject, + \Closure $proceed, + $productType + ) { + if ($productType == \Magento\Bundle\Model\Product\Type::TYPE_CODE) { + return true; + } + return $proceed($productType); + } +} diff --git a/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Product/Edit/Form.php b/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Product/Edit/Form.php index 8323781a07c9406ddd61b0338f48ffcc37fd0d7c..2f6f5061a79e701902cef6d3d2a1a7d9892cdf38 100644 --- a/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Product/Edit/Form.php +++ b/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Product/Edit/Form.php @@ -33,7 +33,7 @@ class Form extends \Magento\Catalog\Controller\Adminhtml\Product /** * @return void */ - public function execute() + public function executeInternal() { $product = $this->initializationHelper->initialize($this->productBuilder->build($this->getRequest())); $this->getResponse()->setBody( diff --git a/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Grid.php b/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Grid.php index 684eb43e4ad6019b28243f9ef932f74d4e7f16e9..359f69c72e012b3e0a0bb00ebdc39fd7a1fd7284 100644 --- a/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Grid.php +++ b/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Grid.php @@ -11,7 +11,7 @@ class Grid extends \Magento\Backend\App\Action /** * @return mixed */ - public function execute() + public function executeInternal() { $index = $this->getRequest()->getParam('index'); if (!preg_match('/^[a-z0-9_.]*$/i', $index)) { diff --git a/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Search.php b/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Search.php index 46c2fae16f490ce78ecfeca2070d56784f7801bc..6101d8b9593a2f4c0a803525830c97e71de45245 100644 --- a/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Search.php +++ b/app/code/Magento/Bundle/Controller/Adminhtml/Bundle/Selection/Search.php @@ -11,7 +11,7 @@ class Search extends \Magento\Backend\App\Action /** * @return mixed */ - public function execute() + public function executeInternal() { return $this->getResponse()->setBody( $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Bundle/Model/Product/Price.php b/app/code/Magento/Bundle/Model/Product/Price.php index d7dd23bc8931e46a74cc4eb728eaa4858522fa0d..73902761e14a527539f29719f6ba7dc30cdc726c 100644 --- a/app/code/Magento/Bundle/Model/Product/Price.php +++ b/app/code/Magento/Bundle/Model/Product/Price.php @@ -118,9 +118,8 @@ class Price extends \Magento\Catalog\Model\Product\Type\Price { $price = 0.0; if ($product->hasCustomOptions()) { - $customOption = $product->getCustomOption('bundle_selection_ids'); - if ($customOption) { - $selectionIds = unserialize($customOption->getValue()); + $selectionIds = $this->getBundleSelectionIds($product); + if ($selectionIds) { $selections = $product->getTypeInstance()->getSelectionsByIds($selectionIds, $product); $selections->addTierPriceData(); $this->_eventManager->dispatch( @@ -145,6 +144,24 @@ class Price extends \Magento\Catalog\Model\Product\Type\Price return $price; } + /** + * Retrieve array of bundle selection IDs + * + * @param \Magento\Catalog\Model\Product $product + * @return array + */ + protected function getBundleSelectionIds(\Magento\Catalog\Model\Product $product) + { + $customOption = $product->getCustomOption('bundle_selection_ids'); + if ($customOption) { + $selectionIds = unserialize($customOption->getValue()); + if (!empty($selectionIds) && is_array($selectionIds)) { + return $selectionIds; + } + } + return []; + } + /** * Get product final price * diff --git a/app/code/Magento/Bundle/Model/Product/Type.php b/app/code/Magento/Bundle/Model/Product/Type.php index 65742f76f261fc8d391bc992d7d56db848307148..2270f6cb149eb9dc14c15bc097824673cad24bc8 100644 --- a/app/code/Magento/Bundle/Model/Product/Type.php +++ b/app/code/Magento/Bundle/Model/Product/Type.php @@ -19,6 +19,11 @@ use Magento\Framework\Pricing\PriceCurrencyInterface; */ class Type extends \Magento\Catalog\Model\Product\Type\AbstractType { + /** + * Product type + */ + const TYPE_CODE = 'bundle'; + /** * Product is composite * diff --git a/app/code/Magento/Bundle/Setup/InstallData.php b/app/code/Magento/Bundle/Setup/InstallData.php index 0df0acd57343b9129ee933c707b98f537dd62076..57a3ab0851e78c3b70903d606f9cef214d8d3347 100644 --- a/app/code/Magento/Bundle/Setup/InstallData.php +++ b/app/code/Magento/Bundle/Setup/InstallData.php @@ -86,7 +86,7 @@ class InstallData implements InstallDataInterface 'input' => '', 'class' => '', 'source' => '', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => true, 'required' => true, 'user_defined' => false, @@ -112,7 +112,7 @@ class InstallData implements InstallDataInterface 'input' => '', 'class' => '', 'source' => '', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => false, 'required' => true, 'user_defined' => false, @@ -137,7 +137,7 @@ class InstallData implements InstallDataInterface 'input' => '', 'class' => '', 'source' => '', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => false, 'required' => true, 'user_defined' => false, @@ -164,7 +164,7 @@ class InstallData implements InstallDataInterface 'input' => 'select', 'class' => '', 'source' => 'Magento\Bundle\Model\Product\Attribute\Source\Price\View', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => true, 'required' => true, 'user_defined' => false, @@ -190,7 +190,7 @@ class InstallData implements InstallDataInterface 'input' => '', 'class' => '', 'source' => '', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => false, 'required' => true, 'user_defined' => false, diff --git a/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Product/Edit/FormTest.php b/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Product/Edit/FormTest.php index 34f249ca2cdd33ba6b30010489b0f66fafbf8a46..75a14fd13a66b66cbd88ea89f8c1ebb95d6f7ac2 100644 --- a/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Product/Edit/FormTest.php +++ b/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Product/Edit/FormTest.php @@ -112,6 +112,6 @@ class FormTest extends \PHPUnit_Framework_TestCase $layout->expects($this->once())->method('createBlock')->willReturn($block); $block->expects($this->once())->method('toHtml')->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/GridTest.php b/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/GridTest.php index c0a7342f8249fe51452f5b762116455f814a9581..49a6c22704ee9c467f3bda12fba478c7bead4c15 100644 --- a/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/GridTest.php +++ b/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/GridTest.php @@ -88,7 +88,7 @@ class GridTest extends \PHPUnit_Framework_TestCase $block->expects($this->once())->method('setIndex')->willReturnSelf(); $block->expects($this->once())->method('toHtml')->willReturnSelf(); - $this->assertEquals($this->response, $this->controller->execute()); + $this->assertEquals($this->response, $this->controller->executeInternal()); } /** @@ -99,6 +99,6 @@ class GridTest extends \PHPUnit_Framework_TestCase { $this->request->expects($this->once())->method('getParam')->with('index')->willReturn('<index"'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/SearchTest.php b/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/SearchTest.php index 2ef224ab717151321a373d05bd6531f59a346633..7f03eeccfd156cec22fc183bf5ba99ccc3a428f1 100644 --- a/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/SearchTest.php +++ b/app/code/Magento/Bundle/Test/Unit/Controller/Adminhtml/Bundle/Selection/SearchTest.php @@ -87,6 +87,6 @@ class SearchTest extends \PHPUnit_Framework_TestCase $block->expects($this->once())->method('setFirstShow')->with(true)->willReturnSelf(); $block->expects($this->once())->method('toHtml')->willReturnSelf(); - $this->assertEquals($this->response, $this->controller->execute()); + $this->assertEquals($this->response, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php b/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php index 226418b97aed883cabefb2c24e889633c15a5cf0..887d772ea403248fba1ae574e3f5864d0a00fe6b 100644 --- a/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php +++ b/app/code/Magento/Bundle/Test/Unit/Model/Product/PriceTest.php @@ -146,4 +146,121 @@ class PriceTest extends \PHPUnit_Framework_TestCase [10, 100, 1, true, 10], ]; } + + public function testGetTotalBundleItemsPriceWithNoCustomOptions() + { + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $productMock->expects($this->once()) + ->method('hasCustomOptions') + ->willReturn(false); + + $this->assertEquals(0, $this->model->getTotalBundleItemsPrice($productMock)); + } + + /** + * @param string|null $value + * @dataProvider dataProviderWithEmptyOptions + */ + public function testGetTotalBundleItemsPriceWithEmptyOptions($value) + { + $dataObjectMock = $this->getMockBuilder('Magento\Framework\DataObject') + ->setMethods(['getValue']) + ->disableOriginalConstructor() + ->getMock(); + + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $productMock->expects($this->once()) + ->method('hasCustomOptions') + ->willReturn(true); + $productMock->expects($this->once()) + ->method('getCustomOption') + ->with('bundle_selection_ids') + ->willReturn($dataObjectMock); + + $dataObjectMock->expects($this->once()) + ->method('getValue') + ->willReturn($value); + + $this->assertEquals(0, $this->model->getTotalBundleItemsPrice($productMock)); + } + + /** + * @return array + */ + public function dataProviderWithEmptyOptions() + { + return [ + ['a:0:{}'], + [''], + [null], + ]; + } + + public function testGetTotalBundleItemsPriceWithNoItems() + { + $storeId = 1; + + $dataObjectMock = $this->getMockBuilder('Magento\Framework\DataObject') + ->setMethods(['getValue']) + ->disableOriginalConstructor() + ->getMock(); + + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $productTypeMock = $this->getMockBuilder('Magento\Bundle\Model\Product\Type') + ->disableOriginalConstructor() + ->getMock(); + + $selectionsMock = $this->getMockBuilder('Magento\Bundle\Model\ResourceModel\Selection\Collection') + ->disableOriginalConstructor() + ->getMock(); + + $productMock->expects($this->once()) + ->method('hasCustomOptions') + ->willReturn(true); + $productMock->expects($this->once()) + ->method('getCustomOption') + ->with('bundle_selection_ids') + ->willReturn($dataObjectMock); + $productMock->expects($this->once()) + ->method('getTypeInstance') + ->willReturn($productTypeMock); + $productMock->expects($this->once()) + ->method('getStoreId') + ->willReturn($storeId); + + $dataObjectMock->expects($this->once()) + ->method('getValue') + ->willReturn('a:1:{i:0;s:1:"1";}'); + + $productTypeMock->expects($this->once()) + ->method('getSelectionsByIds') + ->with([1], $productMock) + ->willReturn($selectionsMock); + + $selectionsMock->expects($this->once()) + ->method('addTierPriceData') + ->willReturnSelf(); + $selectionsMock->expects($this->once()) + ->method('getItems') + ->willReturn([]); + + $this->eventManagerMock->expects($this->once()) + ->method('dispatch') + ->with( + 'prepare_catalog_product_collection_prices', + ['collection' => $selectionsMock, 'store_id' => $storeId] + ) + ->willReturnSelf(); + + $this->assertEquals(0, $this->model->getTotalBundleItemsPrice($productMock)); + } } diff --git a/app/code/Magento/Bundle/etc/adminhtml/di.xml b/app/code/Magento/Bundle/etc/adminhtml/di.xml index 0270ff9164b5980aa8c6b8b62c32bcea0e21a628..91970a4cdd9f3a145faff60f4d877bcba563ceda 100644 --- a/app/code/Magento/Bundle/etc/adminhtml/di.xml +++ b/app/code/Magento/Bundle/etc/adminhtml/di.xml @@ -9,6 +9,9 @@ <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper"> <plugin name="Bundle" type="Magento\Bundle\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Bundle" sortOrder="60" /> </type> + <type name="Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar"> + <plugin name="Bundle" type="Magento\Bundle\Block\Adminhtml\Order\Create\Sidebar" sortOrder="200"/> + </type> <type name="Magento\Catalog\Model\Product\CopyConstructor\Composite"> <arguments> <argument name="constructors" xsi:type="array"> diff --git a/app/code/Magento/Captcha/Controller/Adminhtml/Refresh/Refresh.php b/app/code/Magento/Captcha/Controller/Adminhtml/Refresh/Refresh.php index 2c6ad98a280c7b601ac4cb54364c1ac1c0c2d44d..7dd6846a3fda634baefa26471c50ed3adcdeb508 100644 --- a/app/code/Magento/Captcha/Controller/Adminhtml/Refresh/Refresh.php +++ b/app/code/Magento/Captcha/Controller/Adminhtml/Refresh/Refresh.php @@ -13,7 +13,7 @@ class Refresh extends \Magento\Backend\App\Action /** * {@inheritdoc} */ - public function execute() + public function executeInternal() { $formId = $this->getRequest()->getPost('formId'); $captchaModel = $this->_objectManager->get('Magento\Captcha\Helper\Data')->getCaptcha($formId); diff --git a/app/code/Magento/Captcha/Controller/Refresh/Index.php b/app/code/Magento/Captcha/Controller/Refresh/Index.php index f12d17afaa99b04b9ad0ce094fb29fea6615732b..6e4a78090bd6c57ad8093e609bca9925445d70a3 100644 --- a/app/code/Magento/Captcha/Controller/Refresh/Index.php +++ b/app/code/Magento/Captcha/Controller/Refresh/Index.php @@ -30,7 +30,7 @@ class Index extends \Magento\Framework\App\Action\Action /** * {@inheritdoc} */ - public function execute() + public function executeInternal() { $formId = $this->_request->getPost('formId'); if (null === $formId) { diff --git a/app/code/Magento/Captcha/Model/Customer/Plugin/AjaxLogin.php b/app/code/Magento/Captcha/Model/Customer/Plugin/AjaxLogin.php index 9f1dcff38b658c5aedaa0b9f9ed1527d676dab33..4cc0d629b0100b7f0f69bcec11f9701bf3ebb898 100644 --- a/app/code/Magento/Captcha/Model/Customer/Plugin/AjaxLogin.php +++ b/app/code/Magento/Captcha/Model/Customer/Plugin/AjaxLogin.php @@ -57,7 +57,7 @@ class AjaxLogin * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function aroundExecute( + public function aroundExecuteInternal( \Magento\Customer\Controller\Ajax\Login $subject, \Closure $proceed ) { diff --git a/app/code/Magento/Captcha/Test/Unit/Controller/Refresh/IndexTest.php b/app/code/Magento/Captcha/Test/Unit/Controller/Refresh/IndexTest.php index fd47b19ea9038c553c8183b13066421b94236cfa..55f33af2161a8235f3ef6439d52b096e54fb5e5c 100644 --- a/app/code/Magento/Captcha/Test/Unit/Controller/Refresh/IndexTest.php +++ b/app/code/Magento/Captcha/Test/Unit/Controller/Refresh/IndexTest.php @@ -100,7 +100,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->responseMock->expects($this->once())->method('representJson')->with(json_encode(['imgSrc' => 'source'])); $this->flagMock->expects($this->once())->method('set')->with('', 'no-postDispatch', true); - $this->model->execute(); + $this->model->executeInternal(); } /** diff --git a/app/code/Magento/Captcha/Test/Unit/Model/Customer/Plugin/AjaxLoginTest.php b/app/code/Magento/Captcha/Test/Unit/Model/Customer/Plugin/AjaxLoginTest.php index 7a79969f8ef4f17c760547f7b7496821b18e9fec..3d92086223ca9eea6062a43c991f490db9cac72e 100644 --- a/app/code/Magento/Captcha/Test/Unit/Model/Customer/Plugin/AjaxLoginTest.php +++ b/app/code/Magento/Captcha/Test/Unit/Model/Customer/Plugin/AjaxLoginTest.php @@ -82,7 +82,7 @@ class AjaxLoginTest extends \PHPUnit_Framework_TestCase ); } - public function testAroundExecute() + public function testAroundExecuteInternal() { $username = 'name'; $captchaString = 'string'; @@ -102,10 +102,10 @@ class AjaxLoginTest extends \PHPUnit_Framework_TestCase $closure = function () { return 'result'; }; - $this->assertEquals('result', $this->model->aroundExecute($this->loginControllerMock, $closure)); + $this->assertEquals('result', $this->model->aroundExecuteInternal($this->loginControllerMock, $closure)); } - public function testAroundExecuteIncorrectCaptcha() + public function testAroundExecuteInternalIncorrectCaptcha() { $username = 'name'; $captchaString = 'string'; @@ -131,15 +131,15 @@ class AjaxLoginTest extends \PHPUnit_Framework_TestCase $closure = function () { }; - $this->assertEquals('response', $this->model->aroundExecute($this->loginControllerMock, $closure)); + $this->assertEquals('response', $this->model->aroundExecuteInternal($this->loginControllerMock, $closure)); } /** - * @dataProvider aroundExecuteCaptchaIsNotRequired + * @dataProvider aroundExecuteInternalCaptchaIsNotRequired * @param string $username * @param array $requestContent */ - public function testAroundExecuteCaptchaIsNotRequired($username, $requestContent) + public function testAroundExecuteInternalCaptchaIsNotRequired($username, $requestContent) { $this->requestMock->expects($this->once())->method('getContent')->will($this->returnValue($requestContent)); @@ -151,13 +151,13 @@ class AjaxLoginTest extends \PHPUnit_Framework_TestCase $closure = function () { return 'result'; }; - $this->assertEquals('result', $this->model->aroundExecute($this->loginControllerMock, $closure)); + $this->assertEquals('result', $this->model->aroundExecuteInternal($this->loginControllerMock, $closure)); } /** * @return array */ - public function aroundExecuteCaptchaIsNotRequired() + public function aroundExecuteInternalCaptchaIsNotRequired() { return [ [ diff --git a/app/code/Magento/Catalog/Api/Data/ProductWebsiteLinkInterface.php b/app/code/Magento/Catalog/Api/Data/ProductWebsiteLinkInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..08c8f6b97058335041348bbd57224133fbeb0a9b --- /dev/null +++ b/app/code/Magento/Catalog/Api/Data/ProductWebsiteLinkInterface.php @@ -0,0 +1,39 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Catalog\Api\Data; + +/** + * @api + */ +interface ProductWebsiteLinkInterface +{ + /** + * @return string + */ + public function getSku(); + + /** + * @param string $sku + * @return $this + */ + public function setSku($sku); + + /** + * Get website ids + * + * @return int + */ + public function getWebsiteId(); + + /** + * Set website id + * + * @param int $websiteId + * @return $this + */ + public function setWebsiteId($websiteId); +} diff --git a/app/code/Magento/Catalog/Api/ProductWebsiteLinkRepositoryInterface.php b/app/code/Magento/Catalog/Api/ProductWebsiteLinkRepositoryInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..55e875c2cfd37f951ba45ad251615c74b66700e8 --- /dev/null +++ b/app/code/Magento/Catalog/Api/ProductWebsiteLinkRepositoryInterface.php @@ -0,0 +1,42 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Catalog\Api; + +interface ProductWebsiteLinkRepositoryInterface +{ + /** + * Assign a product to the website + * + * @param \Magento\Catalog\Api\Data\ProductWebsiteLinkInterface $productWebsiteLink + * @return bool will returned True if website successfully assigned to product + * + * @throws \Magento\Framework\Exception\CouldNotSaveException + * @throws \Magento\Framework\Exception\InputException + */ + public function save(Data\ProductWebsiteLinkInterface $productWebsiteLink); + + /** + * Remove the website assignment from the product + * + * @param \Magento\Catalog\Api\Data\ProductWebsiteLinkInterface $productWebsiteLink + * @return bool will returned True if website successfully unassigned from product + * + * @throws \Magento\Framework\Exception\CouldNotSaveException + */ + public function delete(Data\ProductWebsiteLinkInterface $productWebsiteLink); + + /** + * Remove the website assignment from the product by product sku + * + * @param string $sku + * @param int $websiteId + * @return bool will returned True if website successfully unassigned from product + * + * @throws \Magento\Framework\Exception\CouldNotSaveException + */ + public function deleteById($sku, $websiteId); +} diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php index 96d204f7400e01651de1a2b2e75af3cec9c569a4..29f7d7227a290bac1a230be877481c0d9f3d4094 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php @@ -54,9 +54,9 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container $this->addButton( 'save_in_new_set', [ - 'label' => __('Save in New Product Template'), + 'label' => __('Save in New Attribute Set'), 'class' => 'save', - 'onclick' => 'saveAttributeInNewSet(\'' . __('Enter Name for New Product Template') . '\')' + 'onclick' => 'saveAttributeInNewSet(\'' . __('Enter Name for New Attribute Set') . '\')' ], 100 ); diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php index dec89ab52ff89d9275791fde97f7f2d4024de97d..db69fe00f5cfb6651bb3068d5aa08528c915caa4 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php @@ -31,12 +31,18 @@ class Advanced extends Generic */ protected $_yesNo; + /** + * @var array + */ + protected $disableScopeChangeList; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory * @param Yesno $yesNo * @param Data $eavData + * @param array $disableScopeChangeList * @param array $data */ public function __construct( @@ -45,10 +51,12 @@ class Advanced extends Generic \Magento\Framework\Data\FormFactory $formFactory, Yesno $yesNo, Data $eavData, + array $disableScopeChangeList = ['sku'], array $data = [] ) { $this->_yesNo = $yesNo; $this->_eavData = $eavData; + $this->disableScopeChangeList = $disableScopeChangeList; parent::__construct($context, $registry, $formFactory, $data); } @@ -205,14 +213,14 @@ class Advanced extends Generic } $scopes = [ - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE => __('Store View'), - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE => __('Website'), - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL => __('Global'), + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE => __('Store View'), + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE => __('Website'), + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL => __('Global'), ]; if ($attributeObject->getAttributeCode() == 'status' || $attributeObject->getAttributeCode() == 'tax_class_id' ) { - unset($scopes[\Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE]); + unset($scopes[\Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE]); } $fieldset->addField( @@ -229,7 +237,7 @@ class Advanced extends Generic ); $this->_eventManager->dispatch('product_attribute_form_build', ['form' => $form]); - if ($attributeObject->getId() && !$attributeObject->getIsUserDefined()) { + if (in_array($attributeObject->getAttributeCode(), $this->disableScopeChangeList)) { $form->getElement('is_global')->setDisabled(1); } $this->setForm($form); diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Options.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Options.php index eabcac9f715747f01c211f9d5fc7d6fcee0bf718..b08fdb85de106f3cb0197da629036350c5f90571 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Options.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Options.php @@ -8,7 +8,7 @@ * Product attribute add/edit form options tab * * @method \Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Options setReadOnly(bool $value) - * @method null|bool getReadOnly + * @method null|bool getReadOnly() * * @author Magento Core Team <core@magentocommerce.com> */ diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Grid.php index b2619647601b92b935951d8b2aae10959d89ea6b..575a12c430826baad1dc6114ac5893832b17015f 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Grid.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Grid.php @@ -83,9 +83,9 @@ class Grid extends AbstractGrid 'index' => 'is_global', 'type' => 'options', 'options' => [ - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE => __('Store View'), - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE => __('Web Site'), - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL => __('Global'), + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE => __('Store View'), + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE => __('Web Site'), + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL => __('Global'), ], 'align' => 'center' ], diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php index 34025f7fc5bcfbe5df6880ae4738c98acc19bd25..9215bdb305f892d29bfa6613dd9732f27d8b95dc 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php @@ -129,7 +129,7 @@ class Main extends \Magento\Backend\Block\Template 'label' => __('Delete'), 'onclick' => 'deleteConfirm(\'' . $this->escapeJsQuote( __( - 'You are about to delete all products in this product template. ' + 'You are about to delete all products in this attribute set. ' . 'Are you sure you want to do that?' ) ) . '\', \'' . $this->getUrl( @@ -187,7 +187,7 @@ class Main extends \Magento\Backend\Block\Template */ protected function _getHeader() { - return __("Edit Product Template '%1'", $this->_getAttributeSet()->getAttributeSetName()); + return __("Edit Attribute Set '%1'", $this->_getAttributeSet()->getAttributeSetName()); } /** diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main/Formset.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main/Formset.php index ab4bcab4dbf1d7602d34cc7a9c42a542c94ab0e6..ecfdb19e430251c3d84185273801787e569b7a42 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main/Formset.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main/Formset.php @@ -43,7 +43,7 @@ class Formset extends \Magento\Backend\Block\Widget\Form\Generic /** @var \Magento\Framework\Data\Form $form */ $form = $this->_formFactory->create(); - $fieldset = $form->addFieldset('set_name', ['legend' => __('Edit Product Template Name')]); + $fieldset = $form->addFieldset('set_name', ['legend' => __('Edit Attribute Set Name')]); $fieldset->addField( 'attribute_set_name', 'text', diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php index 42434c7094c6464bc98657e856416e5109e80a36..f4f6dc467ca0d47cc86b782a7f55f7cd6befcada 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php @@ -57,7 +57,7 @@ class Add extends \Magento\Backend\Block\Template */ protected function _getHeader() { - return __('Add New Product Template'); + return __('Add New Attribute Set'); } /** diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Main.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Main.php index cedf419205b6f704b1ebc4dd60009ea20beb4b55..a04f09439e1bc8811373dae7106817af955b421b 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Main.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Main.php @@ -27,7 +27,7 @@ class Main extends \Magento\Backend\Block\Template 'addButton', 'Magento\Backend\Block\Widget\Button', [ - 'label' => __('Add Product Template'), + 'label' => __('Add Attribute Set'), 'onclick' => 'setLocation(\'' . $this->getUrl('catalog/*/add') . '\')', 'class' => 'add primary add-set' ] @@ -48,7 +48,7 @@ class Main extends \Magento\Backend\Block\Template */ protected function _getHeader() { - return __('Product Templates'); + return __('Attribute Sets'); } /** diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/AttributeSet.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/AttributeSet.php index 5b8bb9a77fa3bc10528129cfa5097d3350776ddd..df7a36b961a3432f25387f9d332dbaabf333ca9f 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/AttributeSet.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/AttributeSet.php @@ -42,7 +42,7 @@ class AttributeSet extends \Magento\Backend\Block\Widget\Form public function getSelectorOptions() { return [ - 'source' => $this->getUrl('catalog/product/suggestProductTemplates'), + 'source' => $this->getUrl('catalog/product/suggestAttributeSets'), 'className' => 'category-select', 'showRecent' => true, 'storageKey' => 'product-template-key', diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php index 8f6c08bb52bca13d6ded0f70f31ab034c9549d2f..09fbbd9b2a292c037815df8e1720a54f3e1b0bb9 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php @@ -249,7 +249,7 @@ class Crosssell extends Extended $this->addColumn( 'set_name', [ - 'header' => __('Product Template'), + 'header' => __('Attribute Set'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php index f507d9ee30ec0bf3a8094bdc5fd7796f047e3cd3..7dbacd96990b59888da7ecccb736760b1836c5a4 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php @@ -461,4 +461,14 @@ class Option extends Widget { return $this->getUrl('catalog/*/customOptions'); } + + /** + * Return current product id + * + * @return null|int + */ + public function getCurrentProductId() + { + return $this->getProduct()->getId(); + } } diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Popup/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Popup/Grid.php index 53bcc298732f9d804846b252f950e4e9c5d3b936..646db241f82248d612d0d34e8d1dd74745cd85ef 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Popup/Grid.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Popup/Grid.php @@ -62,7 +62,19 @@ class Grid extends \Magento\Catalog\Block\Adminhtml\Product\Grid protected function _prepareCollection() { parent::_prepareCollection(); - $this->getCollection()->addFieldToFilter('has_options', 1); + + if (null !== $this->getRequest()->getParam('current_product_id')) { + $this->getCollection()->getSelect()->where( + 'e.entity_id != ?', + $this->getRequest()->getParam('current_product_id') + ); + } + + $this->getCollection()->getSelect()->distinct()->join( + ['opt' => $this->getCollection()->getTable('catalog_product_option')], + 'opt.product_id = e.entity_id', + null + ); return $this; } diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php index 0e87290ec2729752ef2b35adcffa418ad3d8da9c..af104d601ac4e9a2d04dc08b7c27a3496ecbea30 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php @@ -243,7 +243,7 @@ class Related extends Extended $this->addColumn( 'set_name', [ - 'header' => __('Product Template'), + 'header' => __('Attribute Set'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php index cad5aafe5d0ccfd2c4ee561e8f425a6d9695ea32..2ea563292e69c8bb8ccebcd77f96da2d20c2d76e 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php @@ -239,7 +239,7 @@ class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended $this->addColumn( 'set_name', [ - 'header' => __('Product Template'), + 'header' => __('Attribute Set'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php index e6f12259918729648a443e1310e05b196f2e7b25..e426c08e70a44e9ee178993f204901976683ba9f 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php @@ -263,7 +263,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended $this->addColumn( 'set_name', [ - 'header' => __('Product Template'), + 'header' => __('Attribute Set'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, diff --git a/app/code/Magento/Catalog/Block/Product/TemplateSelector.php b/app/code/Magento/Catalog/Block/Product/TemplateSelector.php index 0fa415acf082b57e582d31793fa67e84a9a73006..e2cb3d356a6f40e6cd1e17b46aae73615b249565 100644 --- a/app/code/Magento/Catalog/Block/Product/TemplateSelector.php +++ b/app/code/Magento/Catalog/Block/Product/TemplateSelector.php @@ -54,7 +54,7 @@ class TemplateSelector extends \Magento\Framework\View\Element\Template } /** - * Retrieve list of product templates with search part contained in label + * Retrieve list of attribute sets with search part contained in label * * @param string $labelPart * @return array diff --git a/app/code/Magento/Catalog/Block/Product/View.php b/app/code/Magento/Catalog/Block/Product/View.php index 5a2ceac3be71d69b206b780a785d7459a59146f7..193dee6b5119a40d895c43cd231612eacff21cd7 100644 --- a/app/code/Magento/Catalog/Block/Product/View.php +++ b/app/code/Magento/Catalog/Block/Product/View.php @@ -219,7 +219,6 @@ class View extends AbstractProduct implements \Magento\Framework\DataObject\Iden /* @var $product \Magento\Catalog\Model\Product */ $product = $this->getProduct(); - $config = []; if (!$this->hasOptions()) { $config = [ 'productId' => $product->getId(), diff --git a/app/code/Magento/Catalog/Block/Product/View/Options.php b/app/code/Magento/Catalog/Block/Product/View/Options.php index 5e4efdb8e56cbcb45dbaa32a20e54367021c05fe..e23b253872e627b412cdf7178025934fad49f18e 100644 --- a/app/code/Magento/Catalog/Block/Product/View/Options.php +++ b/app/code/Magento/Catalog/Block/Product/View/Options.php @@ -162,7 +162,7 @@ class Options extends \Magento\Framework\View\Element\Template $data = [ 'prices' => [ 'oldPrice' => [ - 'amount' => $this->pricingHelper->currency($option->getPrice(false), false, false), + 'amount' => $this->pricingHelper->currency($option->getRegularPrice(), false, false), 'adjustments' => [], ], 'basePrice' => [ @@ -208,7 +208,6 @@ class Options extends \Magento\Framework\View\Element\Template $config = []; foreach ($this->getOptions() as $option) { /* @var $option \Magento\Catalog\Model\Product\Option */ - $priceValue = 0; if ($option->getGroupByType() == \Magento\Catalog\Model\Product\Option::OPTION_GROUP_SELECT) { $tmpPriceValues = []; foreach ($option->getValues() as $value) { diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Add.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Add.php index 5cd9fffd001c469ca9276a706a71105206b70d1d..9860f99b8267d72062f0f9f78e909d3461dda954 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Add.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Add.php @@ -30,7 +30,7 @@ class Add extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->_objectManager->get('Magento\Backend\Model\Auth\Session')->unsActiveTabId(); /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/CategoriesJson.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/CategoriesJson.php index 6f9cf5cc6e551509bb3eb6c33dbb55f90032761d..21c4c2fddbdc0dfc57d1483d542e381c6ed488ca 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/CategoriesJson.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/CategoriesJson.php @@ -38,7 +38,7 @@ class CategoriesJson extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('expand_all')) { $this->_objectManager->get('Magento\Backend\Model\Auth\Session')->setIsTreeWasExpanded(true); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Delete.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Delete.php index cc0e60a82a3918825367c4a4b166c0bb0477c216..7590c92887c703e4611b0cfbc345c49c54c39ebc 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Delete.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Delete.php @@ -28,7 +28,7 @@ class Delete extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php index 3c308d5deeafa0464ad48da3f6e398ceaffe9a64..4c8f0e0be64b64be576f0940ba637798e4b2c5ca 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Edit.php @@ -40,7 +40,7 @@ class Edit extends \Magento\Catalog\Controller\Adminhtml\Category * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $storeId = (int)$this->getRequest()->getParam('store'); $parentId = (int)$this->getRequest()->getParam('parent'); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Grid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Grid.php index fdecd7c3922901e0a4288d146219eeaadbd76e12..6f389e87de6f8afafc758226499a1a173d736286 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Grid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Grid.php @@ -39,7 +39,7 @@ class Grid extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $category = $this->_initCategory(true); if (!$category) { diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Index.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Index.php index 1b0bbf347f509d852ee2ee713513a58de1e185a3..7fb6ab9e9561eed6880c14956bc1bad671f8e8d2 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Index.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Index.php @@ -30,7 +30,7 @@ class Index extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Move.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Move.php index fb0d48aacc43c37800cf9f4745a777909eb6e44d..28f7d43bec6008aa45e38ffc6d1898af7d4fd592 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Move.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Move.php @@ -46,7 +46,7 @@ class Move extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { /** * New parent category identifier diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/RefreshPath.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/RefreshPath.php index 150b0194664890a4de8f33bd33c82eaa9eddeb2e..5441e16587445ecfc52b593182bf099ac336d9f5 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/RefreshPath.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/RefreshPath.php @@ -30,7 +30,7 @@ class RefreshPath extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $categoryId = (int)$this->getRequest()->getParam('id'); if ($categoryId) { diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php index ac0b303f18d4d676f2ac418db1dd795d24cc3067..014bea2cfa3ee061ea4fbaf550c9236b11dc09b0 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php @@ -70,7 +70,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Category * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/SuggestCategories.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/SuggestCategories.php index 94c8010cc39809e7383ca98384e3c019a93304b0..6fbed45cc7662c74bfaeae0b9441077bab35b0e0 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/SuggestCategories.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/SuggestCategories.php @@ -38,7 +38,7 @@ class SuggestCategories extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultJsonFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Tree.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Tree.php index 9acd075bc827602e5839bfbf30ba2f1a1e00ab3c..1eee483d716f6fbb954ad696ffcb36358dfe2d58 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Tree.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Tree.php @@ -39,7 +39,7 @@ class Tree extends \Magento\Catalog\Controller\Adminhtml\Category * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $storeId = (int)$this->getRequest()->getParam('store'); $categoryId = (int)$this->getRequest()->getParam('id'); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/CategoriesJson.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/CategoriesJson.php index 329f786314fb2f972cdc769f08ef68305c0d469b..953daaa46074a944f9198070e677924b1ae4ee10 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/CategoriesJson.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/CategoriesJson.php @@ -42,7 +42,7 @@ class CategoriesJson extends \Magento\Catalog\Controller\Adminhtml\Category\Widg * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $categoryId = (int)$this->getRequest()->getPost('id'); if ($categoryId) { diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/Chooser.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/Chooser.php index fa9b2ab95b233597c4bf350467063a83f33f3933..f65912621ce8956e4d8f6c11cfb9260f2f576421 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/Chooser.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Widget/Chooser.php @@ -32,7 +32,7 @@ class Chooser extends \Magento\Catalog\Controller\Adminhtml\Category\Widget * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */ $resultRaw = $this->resultRawFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Edit.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Edit.php index 29f30ad573f032622b55758995f48b01d701e264..e83384f5f355f7def1785f4d0b8045b10e00b420 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Edit.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Edit.php @@ -51,7 +51,7 @@ class Edit extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribut /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $collection = $this->filter->getCollection($this->collectionFactory->create()); $this->attributeHelper->setProductIds($collection->getAllIds()); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php index 3661567d5fa0001cc9a0a051145f1c0b69e3f100..c77b65c71a2ee4d118325657c1aa05aa712f04ed 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php @@ -85,7 +85,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribut * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { if (!$this->_validateProducts()) { return $this->resultRedirectFactory->create()->setPath('catalog/product/', ['_current' => true]); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Validate.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Validate.php index a7f2da5776206d6abe400f94c8b65cc852d9c7a6..1b3c6e2ad17a9d5af5279f83beaaaae8d4bcc124 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Validate.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Validate.php @@ -40,7 +40,7 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attr * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $response = $this->_objectManager->create('Magento\Framework\DataObject'); $response->setError(false); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/AddAttributeToTemplate.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/AddAttributeToTemplate.php index 7d337411b0a234f947c20f243bce508de82a8481..623c1d0bd3b83a9bdf12c866254271b35fc70054 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/AddAttributeToTemplate.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/AddAttributeToTemplate.php @@ -27,11 +27,11 @@ class AddAttributeToTemplate extends \Magento\Catalog\Controller\Adminhtml\Produ $this->resultJsonFactory = $resultJsonFactory; } /** - * Add attribute to product template + * Add attribute to attribute set * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $request = $this->getRequest(); $resultJson = $this->resultJsonFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsPriceGrid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsPriceGrid.php index b865313f943f872423fdd77e15e6f5c96f8c3075..e8b34dde057e048a8366e0ddf170d0ba623042dd 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsPriceGrid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsPriceGrid.php @@ -14,7 +14,7 @@ class AlertsPriceGrid extends AbstractProductGrid * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { return $this->resultLayoutFactory->create(); } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsStockGrid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsStockGrid.php index dc4a3f14470112900cc8df672f757a0211c77bb8..e6324f21714528f9b28a59989307a61246063458 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsStockGrid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/AlertsStockGrid.php @@ -39,7 +39,7 @@ class AlertsStockGrid extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { return $this->resultLayoutFactory->create(); } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php index 6d444009f5a7730079598e257bf5eabeaa7484a4..d2bc262e1a80996bd8f1bfdf3b08877b8370d6f3 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php @@ -62,14 +62,14 @@ abstract class Attribute extends \Magento\Backend\App\Action * @param \Magento\Framework\App\RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(\Magento\Framework\App\RequestInterface $request) + public function execute(\Magento\Framework\App\RequestInterface $request) { $this->_entityTypeId = $this->_objectManager->create( 'Magento\Eav\Model\Entity' )->setType( \Magento\Catalog\Model\Product::ENTITY )->getTypeId(); - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php index aa99a78945e65f2e10b31ddfa1299b1fff2e5656..be13157399e319d8065d2734d664b6c6df2594f2 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php @@ -11,7 +11,7 @@ class Delete extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('attribute_id'); $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Edit.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Edit.php index bfe598b3d9b37de359ab4cf2a15d1e48bf766beb..14baeaa2461a946a5f2c1276bde87620ea5b1a74 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Edit.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Edit.php @@ -12,7 +12,7 @@ class Edit extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute * @return \Magento\Framework\Controller\ResultInterface * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('attribute_id'); /** @var $model \Magento\Catalog\Model\ResourceModel\Eav\Attribute */ diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Index.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Index.php index bb264940f4af9f69397b950d77936565cf51fc8c..b2caa1c521966e2b797c06c485c5112e40a8988c 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Index.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->createActionPage(); $resultPage->addContent( diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/NewAction.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/NewAction.php index 08e6e33b32fba61c8dba20de58ce5aa5373aa360..97886d735b71a18923aacac9afb5101689de8f2b 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/NewAction.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/NewAction.php @@ -34,7 +34,7 @@ class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { return $this->resultForwardFactory->create()->forward('edit'); } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php index 2d57b6148e5532fdd1fe15415c694c05452084f4..17bed1b247b9c62e2829b9f2a8c7306f1a7ffd05 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php @@ -86,7 +86,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php index bb870c3f8ef06db3a297831bf26eda8cdb758a14..7a529343b1faf1a3ea7af2218b4e20760f3e9bb5 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php @@ -44,7 +44,7 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $response = new \Magento\Framework\DataObject(); $response->setError(false); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Categories.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Categories.php index 202f41cda59331eb1ef1ca4416f0d1b71e287073..f62dc494341e694bc9e02d337f3a898c70555849 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Categories.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Categories.php @@ -32,7 +32,7 @@ class Categories extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->productBuilder->build($this->getRequest()); return $this->resultPageFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Crosssell.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Crosssell.php index 298dd38b0655443b34b535ab0b36b076d266cac4..a39e81bcb5dbc8cacbb9db9813962801e3adc382 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Crosssell.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Crosssell.php @@ -32,7 +32,7 @@ class Crosssell extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->productBuilder->build($this->getRequest()); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/CrosssellGrid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/CrosssellGrid.php index 7dd03b84c0993384c5d0e4dc39397e8df9b76b55..06213df4acd58c67431a85a2aa671ad505cce9cd 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/CrosssellGrid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/CrosssellGrid.php @@ -32,7 +32,7 @@ class CrosssellGrid extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->productBuilder->build($this->getRequest()); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/CustomOptions.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/CustomOptions.php index cc5dde10f1a3960ba5c6726b15afd358661fe29c..23546bfe57dd2642a5b50d7cc3f519cc2656b7d6 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/CustomOptions.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/CustomOptions.php @@ -45,7 +45,7 @@ class CustomOptions extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->registry->register('import_option_products', $this->getRequest()->getPost('products')); return $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Datafeeds/Index.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Datafeeds/Index.php index f51fb90425adb7534a92425af0df1a34515e1454..0abe6282eee29b470e4ee227f459b4a3a0a1c642 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Datafeeds/Index.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Datafeeds/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\Backend\App\Action /** * @return void */ - public function execute() + public function executeInternal() { } } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Duplicate.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Duplicate.php index d335b898f71ce1b455608d81f85f186f9d7af435..fa68907d14c788ae7aa62a6f82978547fbd72bd6 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Duplicate.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Duplicate.php @@ -35,7 +35,7 @@ class Duplicate extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Edit.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Edit.php index 30e1299ca1749c93a6274425d0e2a3a1f3343637..123117c22a798670d307ac190b7d44ae93549d12 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Edit.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Edit.php @@ -39,7 +39,7 @@ class Edit extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $productId = (int) $this->getRequest()->getParam('id'); $product = $this->productBuilder->build($this->getRequest()); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Gallery/Upload.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Gallery/Upload.php index fb6511ec6bb0d0bf2bc2a9d36640ba6ba36aacff..6e41eed07bb5d4d27093f2cfbab9a1f734fb1452 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Gallery/Upload.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Gallery/Upload.php @@ -38,7 +38,7 @@ class Upload extends \Magento\Backend\App\Action /** * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { try { $uploader = $this->_objectManager->create( diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Grid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Grid.php index fdda822206b73669f2de6d038a701a2386809160..a9536e615d0b5ae3d5375d95276969c01bbf9e50 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Grid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Grid.php @@ -32,7 +32,7 @@ class Grid extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { return $this->resultPageFactory->create(); } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/GridOnly.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/GridOnly.php index 0732fd041b9501e40e847edc5ec2de399a02713c..f489d581fe354809cee1890cc2dd6dc3d9e77045 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/GridOnly.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/GridOnly.php @@ -39,7 +39,7 @@ class GridOnly extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Products')); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Group/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Group/Save.php index 9c4ba567e04538b0a6bf084c0e5e2cc2735a8644..810fa031ba9554c589f5972802ba6033c3d0ad8a 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Group/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Group/Save.php @@ -19,7 +19,7 @@ class Save extends \Magento\Backend\App\Action /** * @return void */ - public function execute() + public function executeInternal() { $model = $this->_objectManager->create('Magento\Eav\Model\Entity\Attribute\Group'); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Index.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Index.php index 2edf364aa668afb544a460dfa801071b0a3b9a0a..89051652951c2b7370a49f475a169f87713c47df 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Index.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Index.php @@ -32,7 +32,7 @@ class Index extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassDelete.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassDelete.php index 831fb79fc5f46e3318510609b21d7f1e91e7dc77..2140d25e25061a502814c286bb174ef856d2720a 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassDelete.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassDelete.php @@ -46,7 +46,7 @@ class MassDelete extends \Magento\Catalog\Controller\Adminhtml\Product /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $collection = $this->filter->getCollection($this->collectionFactory->create()); $productDeleted = 0; diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php index 04f37fda61f14339ecb128f17306e9953943519a..913a1be34b5137464dd3e7d16f2065815ed159fe 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php @@ -75,7 +75,7 @@ class MassStatus extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $collection = $this->filter->getCollection($this->collectionFactory->create()); $productIds = $collection->getAllIds(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php index 47c42d49e3adfcd82016ff4a320cf492555b48fd..d22b64ee03e5ca1c4f7088376225775382f0b810 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php @@ -51,7 +51,7 @@ class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { if (!$this->getRequest()->getParam('set')) { return $this->resultForwardFactory->create()->forward('noroute'); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Options.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Options.php index 2fcd0dcf96126e4b6203a665480569323a4a37d0..3bd0b5eab8e60e02ad83cf5b93cb6b3dd9cc5991 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Options.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Options.php @@ -32,7 +32,7 @@ class Options extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->productBuilder->build($this->getRequest()); return $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/OptionsImportGrid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/OptionsImportGrid.php index a2b2dbda990ec622394d0d0ddb67171339361c70..2958d8fb965b88574b0aee4d432f73c770da2c2c 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/OptionsImportGrid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/OptionsImportGrid.php @@ -13,7 +13,7 @@ class OptionsImportGrid extends AbstractProductGrid * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { return $this->resultLayoutFactory->create(); } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Related.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Related.php index d503a79ff3a67c436ed7cdbb37c1b561791adeb5..98bc500a023251bfbe6e9444bc5e313cb6fc039e 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Related.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Related.php @@ -31,7 +31,7 @@ class Related extends \Magento\Catalog\Controller\Adminhtml\Product /** * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->productBuilder->build($this->getRequest()); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Save.php index f37bc324c56b2b6badd5ef21d23d712d529afe88..d09ce170e4c21204f88a6e7e62984cb983716f9b 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Save.php @@ -53,7 +53,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $storeId = $this->getRequest()->getParam('store'); $redirectBack = $this->getRequest()->getParam('back', false); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Add.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Add.php index 81f61ec8362a54a1e3e094902ef15365e78ab056..e90f47343d0d972a3a3a61a0f7a12032f83b04ce 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Add.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Add.php @@ -30,14 +30,14 @@ class Add extends \Magento\Catalog\Controller\Adminhtml\Product\Set /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->_setTypeId(); /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); $resultPage->setActiveMenu('Magento_Catalog::catalog_attributes_sets'); - $resultPage->getConfig()->getTitle()->prepend(__('New Product Template')); + $resultPage->getConfig()->getTitle()->prepend(__('New Attribute Set')); $resultPage->addContent( $resultPage->getLayout()->createBlock('Magento\Catalog\Block\Adminhtml\Product\Attribute\Set\Toolbar\Add') ); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php index 9849dc6884732048424f4b95adc8782eca6954c9..eeaeb920af3c22159416b020a043f7880f77f090 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php @@ -30,13 +30,13 @@ class Delete extends \Magento\Catalog\Controller\Adminhtml\Product\Set /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $setId = $this->getRequest()->getParam('id'); $resultRedirect = $this->resultRedirectFactory->create(); try { $this->attributeSetRepository->deleteById($setId); - $this->messageManager->addSuccess(__('The product template has been removed.')); + $this->messageManager->addSuccess(__('The attribute set has been removed.')); $resultRedirect->setPath('catalog/*/'); } catch (\Exception $e) { $this->messageManager->addError(__('We can\'t delete this set right now.')); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Edit.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Edit.php index d40982a5d5641e8d2c3a3099015686f5435e52b8..e10b3391c2dd11631c3d15988c4ee4f270efa511 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Edit.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Edit.php @@ -30,7 +30,7 @@ class Edit extends \Magento\Catalog\Controller\Adminhtml\Product\Set /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->_setTypeId(); $attributeSet = $this->_objectManager->create('Magento\Eav\Model\Entity\Attribute\Set') @@ -45,7 +45,7 @@ class Edit extends \Magento\Catalog\Controller\Adminhtml\Product\Set /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); $resultPage->setActiveMenu('Magento_Catalog::catalog_attributes_sets'); - $resultPage->getConfig()->getTitle()->prepend(__('Product Templates')); + $resultPage->getConfig()->getTitle()->prepend(__('Attribute Sets')); $resultPage->getConfig()->getTitle()->prepend( $attributeSet->getId() ? $attributeSet->getAttributeSetName() : __('New Set') ); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php index 7b9edb21c7e2f8951643e51963411f2252b655a9..61da929908d3098fb223e9ded7bfae6436aeefdc 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php @@ -30,16 +30,16 @@ class Index extends \Magento\Catalog\Controller\Adminhtml\Product\Set /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->_setTypeId(); /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); $resultPage->setActiveMenu('Magento_Catalog::catalog_attributes_sets'); - $resultPage->getConfig()->getTitle()->prepend(__('Product Templates')); + $resultPage->getConfig()->getTitle()->prepend(__('Attribute Sets')); $resultPage->addBreadcrumb(__('Catalog'), __('Catalog')); - $resultPage->addBreadcrumb(__('Manage Product Templates'), __('Product Templates')); + $resultPage->addBreadcrumb(__('Manage Attribute Sets'), __('Attribute Sets')); return $resultPage; } } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php index 5870190db02b73a9bbae7b804d0ad1e75b8acfe5..5f36ab3bea0f0477927b276ebdb3fed167596dd1 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php @@ -57,7 +57,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Set * @return \Magento\Framework\Controller\ResultInterface * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { $entityTypeId = $this->_getEntityTypeId(); $hasError = false; @@ -82,7 +82,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Set } if (!$model->getId()) { throw new \Magento\Framework\Exception\LocalizedException( - __('This product template no longer exists.') + __('This attribute set no longer exists.') ); } $data = $this->_objectManager->get('Magento\Framework\Json\Helper\Data') @@ -100,12 +100,12 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Set $model->initFromSkeleton($this->getRequest()->getParam('skeleton_set')); } $model->save(); - $this->messageManager->addSuccess(__('You saved the product template.')); + $this->messageManager->addSuccess(__('You saved the attribute set.')); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); $hasError = true; } catch (\Exception $e) { - $this->messageManager->addException($e, __('Something went wrong while saving the product template.')); + $this->messageManager->addException($e, __('Something went wrong while saving the attribute set.')); $hasError = true; } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/SetGrid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/SetGrid.php index d58fa4a600a89c61c47779a7ac75628876669b2b..13a7440a7a70dad166699efa988fa256a996449d 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/SetGrid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/SetGrid.php @@ -30,7 +30,7 @@ class SetGrid extends \Magento\Catalog\Controller\Adminhtml\Product\Set /** * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->_setTypeId(); return $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/ShowUpdateResult.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/ShowUpdateResult.php index d7e4db8dbb7e57c408a913e4327866b66b1dafde..c5bda8da562a1eea741927a99073b237463e74a7 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/ShowUpdateResult.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/ShowUpdateResult.php @@ -35,7 +35,7 @@ class ShowUpdateResult extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $layout = false; if ($this->_session->hasCompositeProductResult() diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestProductTemplates.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestAttributeSets.php similarity index 90% rename from app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestProductTemplates.php rename to app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestAttributeSets.php index d28b72799e770cebf089341b9749125141baefdf..7eb906bfa89c25d8ccefdeb8a8d6851f8a4b6a71 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestProductTemplates.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestAttributeSets.php @@ -6,7 +6,7 @@ */ namespace Magento\Catalog\Controller\Adminhtml\Product; -class SuggestProductTemplates extends \Magento\Backend\App\Action +class SuggestAttributeSets extends \Magento\Backend\App\Action { /** * @var \Magento\Framework\Controller\Result\JsonFactory @@ -34,11 +34,11 @@ class SuggestProductTemplates extends \Magento\Backend\App\Action } /** - * Action for product template selector + * Action for attribute set selector * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $resultJson = $this->resultJsonFactory->create(); $resultJson->setData( diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestAttributes.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestAttributes.php index 6b60c4f74810fc5cc445384205066ba752efe4a5..b5db6ac5e0797d74b3a46aa4b69cd6e0cf65c5b2 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestAttributes.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/SuggestAttributes.php @@ -40,7 +40,7 @@ class SuggestAttributes extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $resultJson = $this->resultJsonFactory->create(); $resultJson->setData( diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Upsell.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Upsell.php index 4c11f14d9f998acee84841a889e574c7c07661e9..09ef399f3ce66e4fa871c8980238276ed04154a2 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Upsell.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Upsell.php @@ -32,7 +32,7 @@ class Upsell extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->productBuilder->build($this->getRequest()); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/UpsellGrid.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/UpsellGrid.php index 171a1e4694a9e8e75dffa1989d9b914be0938808..b4a6a42d94fe60a91313b3af886a0d6b68719e7c 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/UpsellGrid.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/UpsellGrid.php @@ -32,7 +32,7 @@ class UpsellGrid extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->productBuilder->build($this->getRequest()); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Validate.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Validate.php index 82e68cd1c943a729ca3517413fb0c3aaa3ac5f53..be1d2b5b962df9deb9e09c0aa03386e929cf5b30 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Validate.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Validate.php @@ -72,7 +72,7 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $response = new \Magento\Framework\DataObject(); $response->setError(false); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Widget/Chooser.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Widget/Chooser.php index 1c883ea7989d7278d7c9f95cf5375002642e2f4a..eeb41e0bea55b4df68693c3ad3efc034051f2c67 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Widget/Chooser.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Widget/Chooser.php @@ -38,7 +38,7 @@ class Chooser extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $uniqId = $this->getRequest()->getParam('uniq_id'); $massAction = $this->getRequest()->getParam('use_massaction', false); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Wysiwyg.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Wysiwyg.php index f0f0b5274a66745f3cd6ea50960b853a0697f59d..98daec96d7347662f7306e1e774d2c39b7f20c76 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Wysiwyg.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Wysiwyg.php @@ -40,7 +40,7 @@ class Wysiwyg extends \Magento\Catalog\Controller\Adminhtml\Product * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $elementId = $this->getRequest()->getParam('element_id', md5(microtime())); $storeId = $this->getRequest()->getParam('store_id', 0); diff --git a/app/code/Magento/Catalog/Controller/Category/View.php b/app/code/Magento/Catalog/Controller/Category/View.php index b0684d90546f184c3e185c44d8d5e8e711be7f2f..bcdea75c74cb3f50537bb4d5d454b27b7bae52cc 100644 --- a/app/code/Magento/Catalog/Controller/Category/View.php +++ b/app/code/Magento/Catalog/Controller/Category/View.php @@ -150,7 +150,7 @@ class View extends \Magento\Framework\App\Action\Action * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { if ($this->_request->getParam(\Magento\Framework\App\ActionInterface::PARAM_NAME_URL_ENCODED)) { return $this->resultRedirectFactory->create()->setUrl($this->_redirect->getRedirectUrl()); diff --git a/app/code/Magento/Catalog/Controller/Index/Index.php b/app/code/Magento/Catalog/Controller/Index/Index.php index 5ea3a57caf483b4ad09f26d56ec28602a7c292fd..d6890855f14f8873260d78c59a36ff7bd0264750 100644 --- a/app/code/Magento/Catalog/Controller/Index/Index.php +++ b/app/code/Magento/Catalog/Controller/Index/Index.php @@ -12,7 +12,7 @@ class Index extends \Magento\Framework\App\Action\Action * * @return $this */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); return $resultRedirect->setPath('/'); diff --git a/app/code/Magento/Catalog/Controller/Product/Compare/Add.php b/app/code/Magento/Catalog/Controller/Product/Compare/Add.php index 995f51e23ecb8ce7918455ef04cdec762905bec5..99dccd664dfbeed5e8c55c3ec54e381441fec55a 100644 --- a/app/code/Magento/Catalog/Controller/Product/Compare/Add.php +++ b/app/code/Magento/Catalog/Controller/Product/Compare/Add.php @@ -15,7 +15,7 @@ class Add extends \Magento\Catalog\Controller\Product\Compare * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); if (!$this->_formKeyValidator->validate($this->getRequest())) { diff --git a/app/code/Magento/Catalog/Controller/Product/Compare/Clear.php b/app/code/Magento/Catalog/Controller/Product/Compare/Clear.php index 40525ddb90fbaca8d2f8e22b0d857295ca4fe76c..085013b86a4b6ef13b6c0681262c42a09828acb6 100644 --- a/app/code/Magento/Catalog/Controller/Product/Compare/Clear.php +++ b/app/code/Magento/Catalog/Controller/Product/Compare/Clear.php @@ -15,7 +15,7 @@ class Clear extends \Magento\Catalog\Controller\Product\Compare * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Catalog\Model\ResourceModel\Product\Compare\Item\Collection $items */ $items = $this->_itemCollectionFactory->create(); diff --git a/app/code/Magento/Catalog/Controller/Product/Compare/Index.php b/app/code/Magento/Catalog/Controller/Product/Compare/Index.php index a8e79afa1c047271497454f371253374fd356d3a..5808e737e5daafdbef45349b310f85748aed100b 100644 --- a/app/code/Magento/Catalog/Controller/Product/Compare/Index.php +++ b/app/code/Magento/Catalog/Controller/Product/Compare/Index.php @@ -71,7 +71,7 @@ class Index extends \Magento\Catalog\Controller\Product\Compare * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $items = $this->getRequest()->getParam('items'); diff --git a/app/code/Magento/Catalog/Controller/Product/Compare/Remove.php b/app/code/Magento/Catalog/Controller/Product/Compare/Remove.php index b710c3a066de0158d4393f425affcb2c1e1d928c..00db1446bdac81de69d2db4a4143796aa392bee9 100644 --- a/app/code/Magento/Catalog/Controller/Product/Compare/Remove.php +++ b/app/code/Magento/Catalog/Controller/Product/Compare/Remove.php @@ -15,7 +15,7 @@ class Remove extends \Magento\Catalog\Controller\Product\Compare * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $productId = (int)$this->getRequest()->getParam('product'); if ($productId) { diff --git a/app/code/Magento/Catalog/Controller/Product/Gallery.php b/app/code/Magento/Catalog/Controller/Product/Gallery.php index b4e9c7480ba1de468cf4eb08f11d8478d91eb1a1..32411c663db8d285f21f0f82d6fa225e778c7730 100644 --- a/app/code/Magento/Catalog/Controller/Product/Gallery.php +++ b/app/code/Magento/Catalog/Controller/Product/Gallery.php @@ -44,7 +44,7 @@ class Gallery extends \Magento\Catalog\Controller\Product * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $result = null; if (!$this->_initProduct()) { diff --git a/app/code/Magento/Catalog/Controller/Product/View.php b/app/code/Magento/Catalog/Controller/Product/View.php index aed317633da4bfb9bc0a8407fe23c1e899b02b1e..b50819ecb9861ed5da109657a98bcb822bfe5a68 100644 --- a/app/code/Magento/Catalog/Controller/Product/View.php +++ b/app/code/Magento/Catalog/Controller/Product/View.php @@ -69,7 +69,7 @@ class View extends \Magento\Catalog\Controller\Product * * @return \Magento\Framework\Controller\Result\Forward|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { // Get initial data from request $categoryId = (int) $this->getRequest()->getParam('category', false); diff --git a/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php b/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php index a54b13b3d6fbc9742cfc1f9571bb9981b11c6849..b88dac52725b279759f938ea53cb5d789c5dfa5f 100644 --- a/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php +++ b/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php @@ -204,7 +204,7 @@ class Indexer extends \Magento\Framework\App\Helper\AbstractHelper 'unsigned' => true, 'nullable' => false, 'default' => '0', - 'comment' => 'Product Template ID', + 'comment' => 'Attribute Set ID', ]; $columns['type_id'] = [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, diff --git a/app/code/Magento/Catalog/Model/Attribute/Source/Scopes.php b/app/code/Magento/Catalog/Model/Attribute/Source/Scopes.php index f471a47432063fc2e2dfe56031d97266a6fd01cd..62e02652527d2fdb3d4885d40ba9e38d050a6ea9 100644 --- a/app/code/Magento/Catalog/Model/Attribute/Source/Scopes.php +++ b/app/code/Magento/Catalog/Model/Attribute/Source/Scopes.php @@ -5,7 +5,7 @@ */ namespace Magento\Catalog\Model\Attribute\Source; -use \Magento\Catalog\Model\ResourceModel\Eav\Attribute; +use \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface; class Scopes implements \Magento\Framework\Data\OptionSourceInterface { @@ -16,15 +16,15 @@ class Scopes implements \Magento\Framework\Data\OptionSourceInterface { return [ [ - 'value' => Attribute::SCOPE_STORE, + 'value' => ScopedAttributeInterface::SCOPE_STORE, 'label' => __('Store View'), ], [ - 'value' => Attribute::SCOPE_WEBSITE, + 'value' => ScopedAttributeInterface::SCOPE_WEBSITE, 'label' => __('Web Site'), ], [ - 'value' => Attribute::SCOPE_GLOBAL, + 'value' => ScopedAttributeInterface::SCOPE_GLOBAL, 'label' => __('Global'), ], ]; diff --git a/app/code/Magento/Catalog/Model/CategoryLinkManagement.php b/app/code/Magento/Catalog/Model/CategoryLinkManagement.php index 0c2c324bd8e2c931b57babe59147837b4feb193b..4ff351dc3d735b79ad3ee2adf3d9275ceb54c0c3 100644 --- a/app/code/Magento/Catalog/Model/CategoryLinkManagement.php +++ b/app/code/Magento/Catalog/Model/CategoryLinkManagement.php @@ -36,20 +36,20 @@ class CategoryLinkManagement implements \Magento\Catalog\Api\CategoryLinkManagem public function getAssignedProducts($categoryId) { $category = $this->categoryRepository->get($categoryId); - $productsPosition = $category->getProductsPosition(); - /** @var \Magento\Framework\Data\Collection\AbstractDb $products */ + /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $products */ $products = $category->getProductCollection(); + $products->addFieldToSelect('position'); /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface[] $links */ $links = []; /** @var \Magento\Catalog\Model\Product $product */ - foreach ($products->getItems() as $productId => $product) { + foreach ($products->getItems() as $product) { /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface $link */ $link = $this->productLinkFactory->create(); $link->setSku($product->getSku()) - ->setPosition($productsPosition[$productId]) + ->setPosition($product->getData('cat_index_position')) ->setCategoryId($category->getId()); $links[] = $link; } diff --git a/app/code/Magento/Catalog/Model/Config/Backend/Category.php b/app/code/Magento/Catalog/Model/Config/Backend/Category.php index 9634b182bd4b25bb05a0be3af3b0cef28fcad5ab..306f334266fd52011bc03a569f8166a5276627cf 100644 --- a/app/code/Magento/Catalog/Model/Config/Backend/Category.php +++ b/app/code/Magento/Catalog/Model/Config/Backend/Category.php @@ -25,6 +25,7 @@ class Category extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Catalog\Model\Category $catalogCategory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -34,13 +35,14 @@ class Category extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Catalog\Model\Category $catalogCategory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_catalogCategory = $catalogCategory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -67,6 +69,6 @@ class Category extends \Magento\Framework\App\Config\Value $this->_catalogCategory->setStoreId($storeId)->save(); } } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Catalog/Model/Config/CatalogClone/Media/Image.php b/app/code/Magento/Catalog/Model/Config/CatalogClone/Media/Image.php index 2f0c8f4e2eefe51aeaff11820d53fb793265ea3e..7458441f437fc046742a7fc66f3229308f464332 100644 --- a/app/code/Magento/Catalog/Model/Config/CatalogClone/Media/Image.php +++ b/app/code/Magento/Catalog/Model/Config/CatalogClone/Media/Image.php @@ -30,6 +30,7 @@ class Image extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $attributeCollectionFactory * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -40,6 +41,7 @@ class Image extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $attributeCollectionFactory, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -48,7 +50,7 @@ class Image extends \Magento\Framework\App\Config\Value ) { $this->_attributeCollectionFactory = $attributeCollectionFactory; $this->_eavConfig = $eavConfig; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Type.php b/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Type.php index 5d0c1f24872a76b3345d9a4995535c180f4931e8..ca62402f23a378129cac9cd10f43a42a5a463aa7 100644 --- a/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Type.php +++ b/app/code/Magento/Catalog/Model/Config/Source/Product/Options/Type.php @@ -43,7 +43,7 @@ class Type implements \Magento\Framework\Option\ArrayInterface $types[] = ['label' => __($type['label']), 'value' => $type['name']]; } if (count($types)) { - $groups[] = ['label' => __($option['label']), 'value' => $types]; + $groups[] = ['label' => __($option['label']), 'value' => $types, 'optgroup-name' => $option['label']]; } } diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/System/Config/Mode.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/System/Config/Mode.php index e72004991e87503b23d9b565a534fcf00a72e4ca..69852a7afd101896d67956ba32f12c3e093c3747 100644 --- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/System/Config/Mode.php +++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/System/Config/Mode.php @@ -20,6 +20,7 @@ class Mode extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry * @param \Magento\Indexer\Model\Indexer\State $indexerState * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -30,13 +31,14 @@ class Mode extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry, \Magento\Indexer\Model\Indexer\State $indexerState, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->indexerRegistry = $indexerRegistry; $this->indexerState = $indexerState; } @@ -49,7 +51,7 @@ class Mode extends \Magento\Framework\App\Config\Value public function afterSave() { $this->_getResource()->addCommitCallback([$this, 'processValue']); - return $this; + return parent::afterSave(); } /** diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode.php index 1db9aae1325cc819a2639b53194bab135cf8552b..400e2d01c0dded3a9ecf027bf30ce1b02aafc575 100644 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode.php @@ -24,6 +24,7 @@ class Mode extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor * @param \Magento\Indexer\Model\Indexer\State $indexerState * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -34,6 +35,7 @@ class Mode extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor, \Magento\Indexer\Model\Indexer\State $indexerState, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -42,7 +44,7 @@ class Mode extends \Magento\Framework\App\Config\Value ) { $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor; $this->indexerState = $indexerState; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -53,7 +55,7 @@ class Mode extends \Magento\Framework\App\Config\Value public function afterSave() { $this->_getResource()->addCommitCallback([$this, 'processValue']); - return $this; + return parent::afterSave(); } /** diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Price/System/Config/PriceScope.php b/app/code/Magento/Catalog/Model/Indexer/Product/Price/System/Config/PriceScope.php index 148b5b7a99af73a355ec694df00a636156096fdf..3bb9265b3d6f65aef5bffbcefdd893f161d1d2db 100644 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Price/System/Config/PriceScope.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Price/System/Config/PriceScope.php @@ -17,6 +17,7 @@ class PriceScope extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -26,24 +27,25 @@ class PriceScope extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->indexerRegistry = $indexerRegistry; } /** * Set after commit callback * - * @return \Magento\Catalog\Model\Indexer\Product\Price\System\Config\PriceScope + * @return $this */ public function afterSave() { $this->_getResource()->addCommitCallback([$this, 'processValue']); - return $this; + return parent::afterSave(); } /** diff --git a/app/code/Magento/Catalog/Model/Layer/Search/CollectionFilter.php b/app/code/Magento/Catalog/Model/Layer/Search/CollectionFilter.php index 958751ae02b38bff9fa7441ea0c347be1302da89..2ae363436b6fe072b982e2c77a813ea684c5d50e 100644 --- a/app/code/Magento/Catalog/Model/Layer/Search/CollectionFilter.php +++ b/app/code/Magento/Catalog/Model/Layer/Search/CollectionFilter.php @@ -63,7 +63,6 @@ class CollectionFilter implements CollectionFilterInterface ->addTaxPercents() ->addStoreFilter() ->addUrlRewrite() - ->setVisibility($this->productVisibility->getVisibleInSearchIds()) - ->setOrder('relevance', Select::SQL_DESC); + ->setVisibility($this->productVisibility->getVisibleInSearchIds()); } } diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php index 99709b513ca2cf08167a07f76ac22169ec2001b7..2687760e6b13fc24e77264ae9fe961f6d1d1de05 100644 --- a/app/code/Magento/Catalog/Model/Product.php +++ b/app/code/Magento/Catalog/Model/Product.php @@ -25,7 +25,7 @@ use Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionFactory; * @method array getAssociatedProductIds() * @method Product setNewVariationsAttributeSetId(int $value) * @method int getNewVariationsAttributeSetId() - * @method int getPriceType + * @method int getPriceType() * @method \Magento\Catalog\Model\ResourceModel\Product\Collection getCollection() * @method string getUrlKey() * @method Product setUrlKey(string $urlKey) @@ -117,12 +117,19 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements */ protected $_errors = []; + /** + * Product option factory + * + * @var Product\OptionFactory + */ + protected $optionFactory; + /** * Product option * * @var Product\Option */ - protected $_optionInstance; + protected $optionInstance; /** * @var array @@ -337,7 +344,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements * @param Product\Link $productLink * @param Product\Configuration\Item\OptionFactory $itemOptionFactory * @param \Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory $stockItemFactory - * @param Product\Option $catalogProductOption + * @param Product\OptionFactory $catalogProductOptionFactory * @param Product\Visibility $catalogProductVisibility * @param Product\Attribute\Source\Status $catalogProductStatus * @param Product\Media\Config $catalogProductMediaConfig @@ -376,7 +383,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements Product\Link $productLink, \Magento\Catalog\Model\Product\Configuration\Item\OptionFactory $itemOptionFactory, \Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory $stockItemFactory, - \Magento\Catalog\Model\Product\Option $catalogProductOption, + \Magento\Catalog\Model\Product\OptionFactory $catalogProductOptionFactory, \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility, \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus, \Magento\Catalog\Model\Product\Media\Config $catalogProductMediaConfig, @@ -405,7 +412,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements $this->metadataService = $metadataService; $this->_itemOptionFactory = $itemOptionFactory; $this->_stockItemFactory = $stockItemFactory; - $this->_optionInstance = $catalogProductOption; + $this->optionFactory = $catalogProductOptionFactory; $this->_catalogProductVisibility = $catalogProductVisibility; $this->_catalogProductStatus = $catalogProductStatus; $this->_catalogProductMediaConfig = $catalogProductMediaConfig; @@ -1889,7 +1896,11 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements */ public function getOptionInstance() { - return $this->_optionInstance; + if (!isset($this->optionInstance)) { + $this->optionInstance = $this->optionFactory->create(); + $this->optionInstance->setProduct($this); + } + return $this->optionInstance; } /** diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Media.php b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Media.php index 8ca5ffbc429e567ddc1b37f5c24b482e62ec5335..f7fd135a134061614cbbc4b7d6c8557289cd0ad8 100644 --- a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Media.php +++ b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Media.php @@ -85,7 +85,7 @@ class Media extends Product\Attribute\Backend\AbstractMedia // For duplicating we need copy original images. $duplicate = []; foreach ($value['images'] as &$image) { - if (empty($image['value_id'])) { + if (empty($image['value_id']) || !empty($image['removed'])) { continue; } $duplicate[$image['value_id']] = $this->copyImage($image['file']); diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Price.php b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Price.php index ed6612507d290071d86c4cee485126edf4a8e7b9..9dc0dce6f518b43d23bd8a8d92e2baab20b15760 100644 --- a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Price.php +++ b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/Price.php @@ -5,6 +5,8 @@ */ namespace Magento\Catalog\Model\Product\Attribute\Backend; +use \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface; + /** * Catalog product price attribute backend model * @@ -91,9 +93,9 @@ class Price extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend public function setScope($attribute) { if ($this->_helper->isPriceGlobal()) { - $attribute->setIsGlobal(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL); + $attribute->setIsGlobal(ScopedAttributeInterface::SCOPE_GLOBAL); } else { - $attribute->setIsGlobal(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE); + $attribute->setIsGlobal(ScopedAttributeInterface::SCOPE_WEBSITE); } return $this; @@ -118,7 +120,7 @@ class Price extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend return $this; } - if ($this->getAttribute()->getIsGlobal() == \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE) { + if ($this->getAttribute()->getIsGlobal() == ScopedAttributeInterface::SCOPE_WEBSITE) { $baseCurrency = $this->_config->getValue( \Magento\Directory\Model\Currency::XML_PATH_CURRENCY_BASE, 'default' diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Group.php b/app/code/Magento/Catalog/Model/Product/Attribute/Group.php index ba141dc370cd451188425fcc2dd4ca3208a2680b..4fb0b521c22c76201fa5f0f0276016b082a44239 100644 --- a/app/code/Magento/Catalog/Model/Product/Attribute/Group.php +++ b/app/code/Magento/Catalog/Model/Product/Attribute/Group.php @@ -18,13 +18,15 @@ class Group extends \Magento\Eav\Model\Entity\Attribute\Group protected $_attributeCollectionFactory; /** + * Group constructor. * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory * @param AttributeValueFactory $customAttributeFactory + * @param \Magento\Framework\Filter\Translit $translitFilter * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $attributeCollectionFactory - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource - * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection + * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource + * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $data */ public function __construct( @@ -32,6 +34,7 @@ class Group extends \Magento\Eav\Model\Entity\Attribute\Group \Magento\Framework\Registry $registry, \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory, AttributeValueFactory $customAttributeFactory, + \Magento\Framework\Filter\Translit $translitFilter, \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $attributeCollectionFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, @@ -43,6 +46,7 @@ class Group extends \Magento\Eav\Model\Entity\Attribute\Group $registry, $extensionFactory, $customAttributeFactory, + $translitFilter, $resource, $resourceCollection, $data diff --git a/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php b/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php index 7c5be52e6d7e89e9d387a0d6c5e5d63f66af9d61..a70ae163575947f344ad368f1b56f950f56fe6b7 100644 --- a/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php +++ b/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php @@ -79,7 +79,7 @@ class Build $attributeSet = $this->attributeSetFactory->create(); $attributeSet->setEntityTypeId($this->entityTypeId)->load($this->name, 'attribute_set_name'); if ($attributeSet->getId()) { - throw new AlreadyExistsException(__('Product Template already exists.')); + throw new AlreadyExistsException(__('Attribute Set already exists.')); } $attributeSet->setAttributeSetName($this->name)->validate(); diff --git a/app/code/Magento/Catalog/Model/Product/Option.php b/app/code/Magento/Catalog/Model/Product/Option.php index 8b981d6f0b86c19e3102ac34e0ccc0a69ae23a6e..cf672e0f29f262c2726881725241197f7d74c3f7 100644 --- a/app/code/Magento/Catalog/Model/Product/Option.php +++ b/app/code/Magento/Catalog/Model/Product/Option.php @@ -4,15 +4,16 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile namespace Magento\Catalog\Model\Product; +use Magento\Catalog\Api\Data\ProductCustomOptionInterface; use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface; use Magento\Catalog\Model\Product; use Magento\Catalog\Model\ResourceModel\Product\Option\Value\Collection; use Magento\Catalog\Pricing\Price\BasePrice; use Magento\Framework\Exception\LocalizedException; +use Magento\Framework\Model\AbstractExtensibleModel; /** * Catalog product option model @@ -25,8 +26,7 @@ use Magento\Framework\Exception\LocalizedException; * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.ExcessivePublicCount) */ -class Option extends \Magento\Framework\Model\AbstractExtensibleModel - implements \Magento\Catalog\Api\Data\ProductCustomOptionInterface +class Option extends AbstractExtensibleModel implements ProductCustomOptionInterface { const OPTION_GROUP_TEXT = 'text'; @@ -77,31 +77,31 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel /** * @var Product */ - protected $_product; + protected $product; /** * @var array */ - protected $_options = []; + protected $options = []; /** * @var array */ - protected $_values = null; + protected $values = null; /** * Catalog product option value * * @var Option\Value */ - protected $_productOptionValue; + protected $productOptionValue; /** * Product option factory * * @var \Magento\Catalog\Model\Product\Option\Type\Factory */ - protected $_optionFactory; + protected $optionTypeFactory; /** * @var \Magento\Framework\Stdlib\StringUtils @@ -140,8 +140,8 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - $this->_productOptionValue = $productOptionValue; - $this->_optionFactory = $optionFactory; + $this->productOptionValue = $productOptionValue; + $this->optionTypeFactory = $optionFactory; $this->validatorPool = $validatorPool; $this->string = $string; parent::__construct( @@ -182,7 +182,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function addValue(Option\Value $value) { - $this->_values[$value->getId()] = $value; + $this->values[$value->getId()] = $value; return $this; } @@ -194,8 +194,8 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function getValueById($valueId) { - if (isset($this->_values[$valueId])) { - return $this->_values[$valueId]; + if (isset($this->values[$valueId])) { + return $this->values[$valueId]; } return null; @@ -206,7 +206,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function getValues() { - return $this->_values; + return $this->values; } /** @@ -216,7 +216,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function getValueInstance() { - return $this->_productOptionValue; + return $this->productOptionValue; } /** @@ -227,7 +227,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function addOption($option) { - $this->_options[] = $option; + $this->options[] = $option; return $this; } @@ -238,7 +238,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function getOptions() { - return $this->_options; + return $this->options; } /** @@ -249,7 +249,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function setOptions($options) { - $this->_options = $options; + $this->options = $options; return $this; } @@ -260,7 +260,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function unsetOptions() { - $this->_options = []; + $this->options = []; return $this; } @@ -271,7 +271,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function getProduct() { - return $this->_product; + return $this->product; } /** @@ -282,7 +282,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function setProduct(Product $product = null) { - $this->_product = $product; + $this->product = $product; return $this; } @@ -294,7 +294,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function getGroupByType($type = null) { - if (is_null($type)) { + if ($type === null) { $type = $this->getType(); } $optionGroupsToTypes = [ @@ -324,7 +324,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel { $group = $this->getGroupByType($type); if (!empty($group)) { - return $this->_optionFactory->create( + return $this->optionTypeFactory->create( 'Magento\Catalog\Model\Product\Option\Type\\' . $this->string->upperCaseWords($group) ); } @@ -451,24 +451,24 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel /** * Delete prices of option * - * @param int $option_id + * @param int $optionId * @return $this */ - public function deletePrices($option_id) + public function deletePrices($optionId) { - $this->getResource()->deletePrices($option_id); + $this->getResource()->deletePrices($optionId); return $this; } /** * Delete titles of option * - * @param int $option_id + * @param int $optionId * @return $this */ - public function deleteTitles($option_id) + public function deleteTitles($optionId) { - $this->getResource()->deleteTitles($option_id); + $this->getResource()->deleteTitles($optionId); return $this; } @@ -480,7 +480,8 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function getProductOptionCollection(Product $product) { - $collection = $this->getCollection()->addFieldToFilter( + $collection = clone $this->getCollection(); + $collection->addFieldToFilter( 'product_id', $product->getId() )->addTitleToResult( @@ -519,12 +520,12 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel * Get collection of values by given option ids * * @param array $optionIds - * @param int $store_id + * @param int $storeId * @return Collection */ - public function getOptionValuesByOptionId($optionIds, $store_id) + public function getOptionValuesByOptionId($optionIds, $storeId) { - $collection = $this->_productOptionValue->getValuesByOption($optionIds, $this->getId(), $store_id); + $collection = $this->productOptionValue->getValuesByOption($optionIds, $this->getId(), $storeId); return $collection; } @@ -563,7 +564,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel protected function _clearData() { $this->_data = []; - $this->_values = null; + $this->values = null; return $this; } @@ -574,8 +575,8 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ protected function _clearReferences() { - if (!empty($this->_values)) { - foreach ($this->_values as $value) { + if (!empty($this->values)) { + foreach ($this->values as $value) { $value->unsetOption(); } } @@ -848,7 +849,7 @@ class Option extends \Magento\Framework\Model\AbstractExtensibleModel */ public function setValues(array $values = null) { - $this->_values = $values; + $this->values = $values; return $this; } diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php index a9f7a1188c554ddfbd13abfd7aa2d57bdbc37ba1..1b3b2c5f0d8f3f2f824b16e2dde53d08e91a5505 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php @@ -21,21 +21,21 @@ class ValidatorFile extends Validator * * @var string */ - protected $path = '/custom_options'; + protected $path = 'custom_options'; /** * Relative path for quote folder * * @var string */ - protected $quotePath = '/custom_options/quote'; + protected $quotePath = 'custom_options/quote'; /** * Relative path for order folder * * @var string */ - protected $orderPath = '/custom_options/order'; + protected $orderPath = 'custom_options/order'; /** * @var \Magento\Framework\Filesystem\Directory\WriteInterface @@ -175,12 +175,12 @@ class ValidatorFile extends Validator $_height = $imageSize[1]; } } - $uri = $this->filesystem->getUri(DirectoryList::MEDIA); + $userValue = [ 'type' => $fileInfo['type'], 'title' => $fileInfo['name'], - 'quote_path' => $uri . $this->quotePath . $filePath, - 'order_path' => $uri . $this->orderPath . $filePath, + 'quote_path' => $this->quotePath . $filePath, + 'order_path' => $this->orderPath . $filePath, 'fullpath' => $fileFullPath, 'size' => $fileInfo['size'], 'width' => $_width, diff --git a/app/code/Magento/Catalog/Model/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Product/Option/Value.php index 863c3a374b1cd0e738415fd9b5b0ac65d863a8df..9a84ec22921836db518c1634438fa58c39a3f7e9 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Value.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Value.php @@ -238,6 +238,21 @@ class Value extends AbstractModel implements \Magento\Catalog\Api\Data\ProductCu return $this->_getData(self::KEY_PRICE); } + /** + * Return regular price. + * + * @return float|int + */ + public function getRegularPrice() + { + if ($this->getPriceType() == self::TYPE_PERCENT) { + $basePrice = $this->getOption()->getProduct()->getPriceInfo()->getPrice('regular_price')->getAmount()->getValue(); + $price = $basePrice * ($this->_getData(self::KEY_PRICE) / 100); + return $price; + } + return $this->_getData(self::KEY_PRICE); + } + /** * Enter description here... * diff --git a/app/code/Magento/Catalog/Model/ProductWebsiteLink.php b/app/code/Magento/Catalog/Model/ProductWebsiteLink.php new file mode 100644 index 0000000000000000000000000000000000000000..614cd579281f1cfe5317299ff89b1821fe3bc81a --- /dev/null +++ b/app/code/Magento/Catalog/Model/ProductWebsiteLink.php @@ -0,0 +1,51 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Catalog\Model; + +class ProductWebsiteLink extends \Magento\Framework\Api\AbstractSimpleObject implements + \Magento\Catalog\Api\Data\ProductWebsiteLinkInterface +{ + /**#@+ + * Field names + */ + const KEY_SKU = 'sku'; + const WEBSITE_ID = 'website_id'; + /**#@-*/ + + /** + * {@inheritdoc} + */ + public function getSku() + { + return $this->_get(self::KEY_SKU); + } + + /** + * {@inheritdoc} + */ + public function getWebsiteId() + { + return $this->_get(self::WEBSITE_ID); + } + + /** + * @param string $sku + * @return $this + */ + public function setSku($sku) + { + return $this->setData(self::KEY_SKU, $sku); + } + + /** + * {@inheritdoc} + */ + public function setWebsiteId($websiteId) + { + return $this->setData(self::WEBSITE_ID, $websiteId); + } +} diff --git a/app/code/Magento/Catalog/Model/ProductWebsiteLinkRepository.php b/app/code/Magento/Catalog/Model/ProductWebsiteLinkRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..4e24fc5ef9c9b7ead4c51cb2a0d3bd347f7767ea --- /dev/null +++ b/app/code/Magento/Catalog/Model/ProductWebsiteLinkRepository.php @@ -0,0 +1,84 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Catalog\Model; + +use Magento\Framework\Exception\InputException; +use Magento\Framework\Exception\CouldNotSaveException; +use Magento\Catalog\Api\Data\ProductWebsiteLinkInterface; + +class ProductWebsiteLinkRepository implements \Magento\Catalog\Api\ProductWebsiteLinkRepositoryInterface +{ + /** + * @var \Magento\Catalog\Api\ProductRepositoryInterface + */ + protected $productRepository; + + /** + * @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository + */ + public function __construct( + \Magento\Catalog\Api\ProductRepositoryInterface $productRepository + ) { + $this->productRepository = $productRepository; + } + + /** + * {@inheritdoc} + */ + public function save(ProductWebsiteLinkInterface $productWebsiteLink) + { + if (!$productWebsiteLink->getWebsiteId()) { + throw new InputException(__('There are not websites for assign to product')); + } + $product = $this->productRepository->get($productWebsiteLink->getSku()); + $product->setWebsiteIds(array_merge($product->getWebsiteIds(), [$productWebsiteLink->getWebsiteId()])); + try { + $product->save(); + } catch (\Exception $e) { + throw new CouldNotSaveException( + __( + 'Could not assign product "%1" to websites "%2"', + $product->getId(), + $productWebsiteLink->getWebsiteId() + ), + $e + ); + } + return true; + } + + /** + * {@inheritdoc} + */ + public function delete(ProductWebsiteLinkInterface $productLink) + { + return $this->deleteById($productLink->getSku(), $productLink->getSku()); + } + + /** + * {@inheritdoc} + */ + public function deleteById($sku, $websiteId) + { + $product = $this->productRepository->get($sku); + $product->setWebsiteIds(array_diff($product->getWebsiteIds(), [$websiteId])); + + try { + $product->save(); + } catch (\Exception $e) { + throw new CouldNotSaveException( + __( + 'Could not save product "%1" with websites %2', + $product->getId(), + implode(', ', $product->getWebsiteIds()) + ), + $e + ); + } + return true; + } +} diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php b/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php index dd522da5888643ed495a7c2e1039d828400cc04c..ec7bfafeee1dd3f01464ed24d41c2329737c2300 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Attribute.php @@ -86,7 +86,7 @@ class Attribute extends \Magento\Eav\Model\ResourceModel\Entity\Attribute if ($object->isScopeGlobal() && isset( $origData['is_global'] - ) && \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL != $origData['is_global'] + ) && \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL != $origData['is_global'] ) { $attributeStoreIds = array_keys($this->_storeManager->getStores()); if (!empty($attributeStoreIds)) { diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Category/Flat.php b/app/code/Magento/Catalog/Model/ResourceModel/Category/Flat.php index 82000fb03d1703e6e34dfeb854e6d1ad6aca80ee..30c9476931f10aa0daf23dbbf1ff389bb02d2abd 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Category/Flat.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Category/Flat.php @@ -671,4 +671,23 @@ class Flat extends \Magento\Indexer\Model\ResourceModel\AbstractResource return $this->getConnection()->fetchCol($select); } + + /** + * Get positions of associated to category products + * + * @param \Magento\Catalog\Model\Category $category + * @return array + */ + public function getProductsPosition($category) + { + $select = $this->getConnection()->select()->from( + $this->getTable('catalog_category_product'), + ['product_id', 'position'] + )->where( + 'category_id = :category_id' + ); + $bind = ['category_id' => (int)$category->getId()]; + + return $this->getConnection()->fetchPairs($select, $bind); + } } diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php b/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php index 2f4d6769131bda05483460e194fbffa9b8be0083..cde304b004ac497e35502954291fda86a499533e 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Eav/Attribute.php @@ -32,14 +32,8 @@ use Magento\Framework\Stdlib\DateTime\DateTimeFormatterInterface; * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ class Attribute extends \Magento\Eav\Model\Entity\Attribute implements - \Magento\Catalog\Api\Data\ProductAttributeInterface + \Magento\Catalog\Api\Data\ProductAttributeInterface, \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface { - const SCOPE_STORE = 0; - - const SCOPE_GLOBAL = 1; - - const SCOPE_WEBSITE = 2; - const MODULE_NAME = 'Magento_Catalog'; const ENTITY = 'catalog_eav_attribute'; diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product.php b/app/code/Magento/Catalog/Model/ResourceModel/Product.php index b4d5298035dadab55cb0158a5ef72d64226d4253..130cd77177306433c5a9202e3ae85906f03ed516 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Product.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Product.php @@ -656,7 +656,7 @@ class Product extends AbstractResource $entityType = $this->typeFactory->create()->loadByCode(\Magento\Catalog\Model\Product::ENTITY); $attributeSet = $this->setFactory->create()->load($object->getAttributeSetId()); if ($attributeSet->getEntityTypeId() != $entityType->getId()) { - return ['attribute_set' => 'Invalid product template entity type']; + return ['attribute_set' => 'Invalid attribute set entity type']; } return parent::validate($object); diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Attribute/Backend/Media.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Attribute/Backend/Media.php index a77ea68ae16d5e42855e7e422ff3662eeba5bcf6..96fa2009c64feb198d2bf38fd1ce957dcff383fa 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Attribute/Backend/Media.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Attribute/Backend/Media.php @@ -298,41 +298,30 @@ class Media extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb * @param array $newFiles * @param int $originalProductId * @param int $newProductId - * @return $this + * @return array */ public function duplicate($attributeId, $newFiles, $originalProductId, $newProductId) { - $mainTableAlias = $this->getMainTableAlias(); + $mediaGalleryEntities = $this->loadMediaGalleryEntities($attributeId, $originalProductId); - $select = $this->getConnection()->select()->from( - [$mainTableAlias => $this->getMainTable()], - ['value_id', 'value'] - )->joinInner( - ['entity' => $this->getTable(self::GALLERY_VALUE_TO_ENTITY_TABLE)], - $mainTableAlias . '.value_id = entity.value_id', - ['entity_id' => 'entity_id'] - )->where( - 'attribute_id = ?', - $attributeId - )->where( - 'entity.entity_id = ?', - $originalProductId - ); - - $valueIdMap = []; // Duplicate main entries of gallery - foreach ($this->getConnection()->fetchAll($select) as $row) { + $valueIdMap = []; + foreach ($mediaGalleryEntities as $row) { + $valueId = $row['value_id']; $data = [ 'attribute_id' => $attributeId, - 'entity_id' => $newProductId, - 'value' => isset($newFiles[$row['value_id']]) ? $newFiles[$row['value_id']] : $row['value'], + 'media_type' => $row['media_type'], + 'disabled' => $row['disabled'], + 'value' => isset($newFiles[$valueId]) ? $newFiles[$valueId] : $row['value'], ]; - - $valueIdMap[$row['value_id']] = $this->insertGallery($data); + $valueIdMap[$valueId] = $this->insertGallery($data); + $this->bindValueToEntity($valueIdMap[$valueId], $newProductId); } + + if (count($valueIdMap) == 0) { - return $this; + return []; } // Duplicate per store gallery values @@ -345,9 +334,54 @@ class Media extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb foreach ($this->getConnection()->fetchAll($select) as $row) { $row['value_id'] = $valueIdMap[$row['value_id']]; + unset($row['record_id']); $this->insertGalleryValueInStore($row); + $this->bindValueToEntity($row['value_id'], $newProductId); } - return $this; + return $valueIdMap; + } + + /** + * @param array $valueIds + * @return array + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function loadMediaGalleryEntitiesbyId($valueIds) + { + $select = $this->getConnection()->select()->from( + $this->getMainTable() + )->where( + 'value_id IN(?)', + $valueIds + ); + + return $this->getConnection()->fetchAll($select); + } + + /** + * @param int $attributeId + * @param int $productId + * @return array + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function loadMediaGalleryEntities($attributeId, $productId) + { + $mainTableAlias = $this->getMainTableAlias(); + $select = $this->getConnection()->select()->from( + [$mainTableAlias => $this->getMainTable()] + )->joinInner( + ['entity' => $this->getTable(self::GALLERY_VALUE_TO_ENTITY_TABLE)], + $mainTableAlias . '.value_id = entity.value_id', + ['entity_id' => 'entity_id'] + )->where( + 'attribute_id = ?', + $attributeId + )->where( + 'entity.entity_id = ?', + $productId + ); + + return $this->getConnection()->fetchAll($select); } } diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php index 0393bf02276257507ebd9f392ef6b499a7866bee..15421607a696fe8e09d9efeddc85c9505dcb4942 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php @@ -133,22 +133,6 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac */ protected $_priceDataFieldFilters = []; - /** - * Map of price fields - * - * @var array - */ - protected $_map = [ - 'fields' => [ - 'price' => 'price_index.price', - 'final_price' => 'price_index.final_price', - 'min_price' => 'price_index.min_price', - 'max_price' => 'price_index.max_price', - 'tier_price' => 'price_index.tier_price', - 'special_price' => 'price_index.special_price', - ], - ]; - /** * Price expression sql * diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php index 0df889441d2624095043ca2bab26fd00e1b3feb4..8b433296b328c19370585606ed86f44722587571 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Indexer/Price/DefaultPrice.php @@ -224,6 +224,20 @@ class DefaultPrice extends AbstractIndexer implements PriceInterface * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function _prepareFinalPriceData($entityIds = null) + { + return $this->prepareFinalPriceDataForType($entityIds, $this->getTypeId()); + } + + /** + * Prepare products default final price in temporary index table + * + * @param int|array $entityIds the entity ids limitation + * @param string|null $type product type, all if null + * @return $this + * @throws \Magento\Framework\Exception\LocalizedException + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + protected function prepareFinalPriceDataForType($entityIds, $type) { $this->_prepareDefaultFinalPriceTable(); @@ -260,11 +274,12 @@ class DefaultPrice extends AbstractIndexer implements PriceInterface 'tp.entity_id = e.entity_id AND tp.website_id = cw.website_id' . ' AND tp.customer_group_id = cg.customer_group_id', [] - )->where( - 'e.type_id = ?', - $this->getTypeId() ); + if ($type !== null) { + $select->where('e.type_id = ?', $type); + } + // add enable products limitation $statusCond = $connection->quoteInto( '=?', @@ -299,10 +314,10 @@ class DefaultPrice extends AbstractIndexer implements PriceInterface $select->columns( [ - 'orig_price' => $price, - 'price' => $finalPrice, - 'min_price' => $finalPrice, - 'max_price' => $finalPrice, + 'orig_price' => $connection->getIfNullSql($price, 0), + 'price' => $connection->getIfNullSql($finalPrice, 0), + 'min_price' => $connection->getIfNullSql($finalPrice, 0), + 'max_price' => $connection->getIfNullSql($finalPrice, 0), 'tier_price' => new \Zend_Db_Expr('tp.min_price'), 'base_tier' => new \Zend_Db_Expr('tp.min_price'), ] @@ -554,9 +569,10 @@ class DefaultPrice extends AbstractIndexer implements PriceInterface /** * Mode Final Prices index to primary temporary index table * + * @param int[]|null $entityIds * @return $this */ - protected function _movePriceDataToIndexTable() + protected function _movePriceDataToIndexTable($entityIds = null) { $columns = [ 'entity_id' => 'entity_id', @@ -574,6 +590,10 @@ class DefaultPrice extends AbstractIndexer implements PriceInterface $table = $this->_getDefaultFinalPriceTable(); $select = $connection->select()->from($table, $columns); + if ($entityIds !== null) { + $select->where('entity_id in (?)', count($entityIds) > 0 ? $entityIds : 0); + } + $query = $select->insertFromSelect($this->getIdxTable(), [], false); $connection->query($query); diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Setup/PropertyMapper.php b/app/code/Magento/Catalog/Model/ResourceModel/Setup/PropertyMapper.php index b7d5bbb301efd0db69682ace00f57077fbf6dec6..2f2814b5affaaad086da30d27e26c1c654506483 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Setup/PropertyMapper.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Setup/PropertyMapper.php @@ -26,7 +26,7 @@ class PropertyMapper extends PropertyMapperAbstract 'is_global' => $this->_getValue( $input, 'global', - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL ), 'is_visible' => $this->_getValue($input, 'visible', 1), 'is_searchable' => $this->_getValue($input, 'searchable', 0), diff --git a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php b/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php index de1649851c6699987abb434a987843748b1f3e7d..2ff610190d43095a16b8ad5bd35217b6bedb2644 100644 --- a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php +++ b/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php @@ -39,12 +39,13 @@ class Suffix extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource - * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\UrlRewrite\Helper\UrlRewrite $urlRewriteHelper * @param \Magento\Store\Model\StoreManagerInterface $storeManager - * @param \Magento\Framework\App\ResourceConnection $appResource + * @param ResourceConnection $appResource * @param \Magento\UrlRewrite\Model\UrlFinderInterface $urlFinder + * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource + * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -52,6 +53,7 @@ class Suffix extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\UrlRewrite\Helper\UrlRewrite $urlRewriteHelper, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\App\ResourceConnection $appResource, @@ -60,7 +62,7 @@ class Suffix extends \Magento\Framework\App\Config\Value \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->urlRewriteHelper = $urlRewriteHelper; $this->connection = $appResource->getConnection(); $this->urlFinder = $urlFinder; diff --git a/app/code/Magento/Catalog/Setup/CategorySetup.php b/app/code/Magento/Catalog/Setup/CategorySetup.php index 0efc0ac08375a2ba5b35e5d88601d75e729ec1f4..c0dddb276cb1dbc23de18432d5d943a08485502a 100644 --- a/app/code/Magento/Catalog/Setup/CategorySetup.php +++ b/app/code/Magento/Catalog/Setup/CategorySetup.php @@ -78,7 +78,7 @@ class CategorySetup extends EavSetup 'label' => 'Name', 'input' => 'text', 'sort_order' => 1, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ], 'is_active' => [ @@ -87,7 +87,7 @@ class CategorySetup extends EavSetup 'input' => 'select', 'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean', 'sort_order' => 2, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ], 'description' => [ @@ -96,7 +96,7 @@ class CategorySetup extends EavSetup 'input' => 'textarea', 'required' => false, 'sort_order' => 4, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'wysiwyg_enabled' => true, 'is_html_allowed_on_front' => true, 'group' => 'General Information', @@ -108,7 +108,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Category\Attribute\Backend\Image', 'required' => false, 'sort_order' => 5, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ], 'meta_title' => [ @@ -117,7 +117,7 @@ class CategorySetup extends EavSetup 'input' => 'text', 'required' => false, 'sort_order' => 6, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ], 'meta_keywords' => [ @@ -126,7 +126,7 @@ class CategorySetup extends EavSetup 'input' => 'textarea', 'required' => false, 'sort_order' => 7, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ], 'meta_description' => [ @@ -135,7 +135,7 @@ class CategorySetup extends EavSetup 'input' => 'textarea', 'required' => false, 'sort_order' => 8, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ], 'display_mode' => [ @@ -145,7 +145,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Catalog\Model\Category\Attribute\Source\Mode', 'required' => false, 'sort_order' => 10, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Display Settings', ], 'landing_page' => [ @@ -155,7 +155,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Catalog\Model\Category\Attribute\Source\Page', 'required' => false, 'sort_order' => 20, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Display Settings', ], 'is_anchor' => [ @@ -211,7 +211,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Theme\Model\Theme\Source\Theme', 'required' => false, 'sort_order' => 10, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Custom Design', ], 'custom_design_from' => [ @@ -221,7 +221,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Attribute\Backend\Startdate', 'required' => false, 'sort_order' => 30, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Custom Design', ], 'custom_design_to' => [ @@ -231,7 +231,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\Datetime', 'required' => false, 'sort_order' => 40, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Custom Design', ], 'page_layout' => [ @@ -241,7 +241,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Catalog\Model\Category\Attribute\Source\Layout', 'required' => false, 'sort_order' => 50, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Custom Design', ], 'custom_layout_update' => [ @@ -251,7 +251,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Attribute\Backend\Customlayoutupdate', 'required' => false, 'sort_order' => 60, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Custom Design', ], 'level' => [ @@ -278,7 +278,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Category\Attribute\Backend\Sortby', 'sort_order' => 40, 'input_renderer' => 'Magento\Catalog\Block\Adminhtml\Category\Helper\Sortby\Available', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Display Settings', ], 'default_sort_by' => [ @@ -289,7 +289,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Category\Attribute\Backend\Sortby', 'sort_order' => 50, 'input_renderer' => 'Magento\Catalog\Block\Adminhtml\Category\Helper\Sortby\DefaultSortby', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Display Settings', ], 'include_in_menu' => [ @@ -299,7 +299,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean', 'default' => '1', 'sort_order' => 10, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ], 'custom_use_parent_settings' => [ @@ -309,7 +309,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean', 'required' => false, 'sort_order' => 5, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Custom Design', ], 'custom_apply_to_products' => [ @@ -319,7 +319,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean', 'required' => false, 'sort_order' => 6, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Custom Design', ], 'filter_price_range' => [ @@ -329,7 +329,7 @@ class CategorySetup extends EavSetup 'required' => false, 'sort_order' => 51, 'input_renderer' => 'Magento\Catalog\Block\Adminhtml\Category\Helper\Pricestep', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Display Settings', ], ], @@ -347,7 +347,7 @@ class CategorySetup extends EavSetup 'input' => 'text', 'frontend_class' => 'validate-length maximum-length-255', 'sort_order' => 1, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'searchable' => true, 'visible_in_advanced_search' => true, 'used_in_product_listing' => true, @@ -370,7 +370,7 @@ class CategorySetup extends EavSetup 'label' => 'Description', 'input' => 'textarea', 'sort_order' => 3, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'searchable' => true, 'comparable' => true, 'wysiwyg_enabled' => true, @@ -382,7 +382,7 @@ class CategorySetup extends EavSetup 'label' => 'Short Description', 'input' => 'textarea', 'sort_order' => 4, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'searchable' => true, 'comparable' => true, 'wysiwyg_enabled' => true, @@ -399,7 +399,7 @@ class CategorySetup extends EavSetup 'input' => 'price', 'backend' => 'Magento\Catalog\Model\Product\Attribute\Backend\Price', 'sort_order' => 1, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'searchable' => true, 'filterable' => true, 'visible_in_advanced_search' => true, @@ -415,7 +415,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Product\Attribute\Backend\Price', 'required' => false, 'sort_order' => 3, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'used_in_product_listing' => true, 'apply_to' => 'simple,virtual', 'group' => 'Prices', @@ -430,7 +430,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Attribute\Backend\Startdate', 'required' => false, 'sort_order' => 4, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'used_in_product_listing' => true, 'apply_to' => 'simple,virtual', 'group' => 'Prices', @@ -445,7 +445,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\Datetime', 'required' => false, 'sort_order' => 5, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'used_in_product_listing' => true, 'apply_to' => 'simple,virtual', 'group' => 'Prices', @@ -461,7 +461,7 @@ class CategorySetup extends EavSetup 'required' => false, 'user_defined' => true, 'sort_order' => 6, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'apply_to' => 'simple,virtual', 'group' => 'Prices', 'is_used_in_grid' => true, @@ -501,7 +501,7 @@ class CategorySetup extends EavSetup 'input' => 'text', 'required' => false, 'sort_order' => 20, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Meta Information', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -513,7 +513,7 @@ class CategorySetup extends EavSetup 'input' => 'textarea', 'required' => false, 'sort_order' => 30, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Meta Information', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -527,7 +527,7 @@ class CategorySetup extends EavSetup 'note' => 'Maximum 255 chars', 'class' => 'validate-length maximum-length-255', 'sort_order' => 40, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Meta Information', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -541,7 +541,7 @@ class CategorySetup extends EavSetup 'input_renderer' => 'Magento\Catalog\Block\Adminhtml\Product\Helper\Form\BaseImage', 'required' => false, 'sort_order' => 0, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'used_in_product_listing' => true, 'group' => 'General', ], @@ -552,7 +552,7 @@ class CategorySetup extends EavSetup 'frontend' => 'Magento\Catalog\Model\Product\Attribute\Frontend\Image', 'required' => false, 'sort_order' => 2, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'used_in_product_listing' => true, 'group' => 'Images', ], @@ -563,7 +563,7 @@ class CategorySetup extends EavSetup 'frontend' => 'Magento\Catalog\Model\Product\Attribute\Frontend\Image', 'required' => false, 'sort_order' => 3, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'used_in_product_listing' => true, 'group' => 'Images', ], @@ -584,7 +584,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Product\Attribute\Backend\Tierprice', 'required' => false, 'sort_order' => 7, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'apply_to' => 'simple,virtual', 'group' => 'Prices', ], @@ -610,7 +610,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Attribute\Backend\Startdate', 'required' => false, 'sort_order' => 7, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'used_in_product_listing' => true, 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -623,7 +623,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\Datetime', 'required' => false, 'sort_order' => 8, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'used_in_product_listing' => true, 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -643,7 +643,7 @@ class CategorySetup extends EavSetup 'input' => 'select', 'source' => 'Magento\Catalog\Model\Product\Attribute\Source\Status', 'sort_order' => 9, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'searchable' => true, 'used_in_product_listing' => true, ], @@ -653,7 +653,7 @@ class CategorySetup extends EavSetup 'input' => 'price', 'required' => false, 'sort_order' => 8, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, 'apply_to' => 'simple,virtual', 'group' => 'Prices', @@ -665,7 +665,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Catalog\Model\Product\Visibility', 'default' => '4', 'sort_order' => 12, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, ], 'custom_design' => [ 'type' => 'varchar', @@ -674,7 +674,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Theme\Model\Theme\Source\Theme', 'required' => false, 'sort_order' => 1, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Design', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -687,7 +687,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Attribute\Backend\Startdate', 'required' => false, 'sort_order' => 2, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Design', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -700,7 +700,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\Datetime', 'required' => false, 'sort_order' => 3, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Design', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -713,7 +713,7 @@ class CategorySetup extends EavSetup 'backend' => 'Magento\Catalog\Model\Attribute\Backend\Customlayoutupdate', 'required' => false, 'sort_order' => 4, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Design', ], 'page_layout' => [ @@ -723,7 +723,7 @@ class CategorySetup extends EavSetup 'source' => 'Magento\Catalog\Model\Product\Attribute\Source\Layout', 'required' => false, 'sort_order' => 5, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Design', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, @@ -732,7 +732,7 @@ class CategorySetup extends EavSetup 'category_ids' => [ 'type' => 'static', 'label' => 'Categories', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'backend' => 'Magento\Catalog\Model\Product\Attribute\Backend\Category', 'input_renderer' => 'Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Category', 'required' => false, @@ -748,7 +748,7 @@ class CategorySetup extends EavSetup 'required' => false, 'default' => 'container2', 'sort_order' => 6, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Design', ], 'required_options' => [ @@ -772,7 +772,7 @@ class CategorySetup extends EavSetup 'input' => 'text', 'required' => false, 'sort_order' => 16, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, 'used_in_product_listing' => true, ], @@ -782,7 +782,7 @@ class CategorySetup extends EavSetup 'input' => 'text', 'required' => false, 'sort_order' => 17, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, 'used_in_product_listing' => true, ], @@ -792,7 +792,7 @@ class CategorySetup extends EavSetup 'input' => 'text', 'required' => false, 'sort_order' => 18, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, 'used_in_product_listing' => true, ], @@ -816,7 +816,7 @@ class CategorySetup extends EavSetup 'input' => 'select', 'source' => 'Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture', 'required' => false, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'visible' => true, 'user_defined' => false, 'searchable' => false, @@ -837,8 +837,8 @@ class CategorySetup extends EavSetup 'label' => 'Quantity', 'input' => 'select', 'input_renderer' => 'Magento\CatalogInventory\Block\Adminhtml\Form\Field\Stock', - 'source' => 'Magento\\CatalogInventory\\Model\\Source\\Stock', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'source' => 'Magento\CatalogInventory\Model\Source\Stock', + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'default' => \Magento\CatalogInventory\Model\Stock::STOCK_IN_STOCK, 'user_defined' => false, 'visible' => true, diff --git a/app/code/Magento/Catalog/Setup/InstallSchema.php b/app/code/Magento/Catalog/Setup/InstallSchema.php index c507f35db664497d5a59c4f45a5e458833dde4d2..927dd2596cb2951597bb2b81e98ec24cd2913702 100644 --- a/app/code/Magento/Catalog/Setup/InstallSchema.php +++ b/app/code/Magento/Catalog/Setup/InstallSchema.php @@ -42,7 +42,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, null, ['unsigned' => true, 'nullable' => false, 'default' => '0'], - 'Product Template ID' + 'Attribute Set ID' ) ->addColumn( 'type_id', diff --git a/app/code/Magento/Catalog/Setup/UpgradeData.php b/app/code/Magento/Catalog/Setup/UpgradeData.php index c59635383719f1e21810929af146899695d32f39..accd781b59984b501fc4aca2befc07ba982f51fd 100644 --- a/app/code/Magento/Catalog/Setup/UpgradeData.php +++ b/app/code/Magento/Catalog/Setup/UpgradeData.php @@ -40,31 +40,6 @@ class UpgradeData implements UpgradeDataInterface public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); - if (version_compare($context->getVersion(), '2.0.1') < 0) { - /** @var \Magento\Catalog\Setup\CategorySetup $categorySetup */ - $categorySetup = $this->categorySetupFactory->create(['setup' => $setup]); - - $entityTypeId = $categorySetup->getEntityTypeId(\Magento\Catalog\Model\Product::ENTITY); - $attributeSetId = $categorySetup->getDefaultAttributeSetId($entityTypeId); - - $attributeGroup = $categorySetup->getAttributeGroup( - $entityTypeId, - $attributeSetId, - 'Images', - 'attribute_group_name' - ); - if (isset($attributeGroup['attribute_group_name']) && $attributeGroup['attribute_group_name'] == 'Images') { - // update General Group - $categorySetup->updateAttributeGroup( - $entityTypeId, - $attributeSetId, - $attributeGroup['attribute_group_id'], - 'attribute_group_name', - 'Images and Videos' - ); - } - } - if ($context->getVersion() && version_compare($context->getVersion(), '2.0.1') < 0 ) { @@ -139,6 +114,12 @@ class UpgradeData implements UpgradeDataInterface 'Magento\Catalog\Model\ResourceModel\Product\Attribute\Collection' ); } + + if (version_compare($context->getVersion(), '2.0.3') < 0) { + /** @var \Magento\Catalog\Setup\CategorySetup $categorySetup */ + $categorySetup = $this->categorySetupFactory->create(['setup' => $setup]); + $categorySetup->updateAttribute(3, 51, 'default_value', 1); + } $setup->endSetup(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Attribute/Edit/Tab/AdvancedTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Attribute/Edit/Tab/AdvancedTest.php index a54834d4f56966f448480c1000f1f98ba45c4356..7408df0ede1d678644939f92c9055007e97e3759 100644 --- a/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Attribute/Edit/Tab/AdvancedTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Attribute/Edit/Tab/AdvancedTest.php @@ -89,7 +89,7 @@ class AdvancedTest extends \PHPUnit_Framework_TestCase $this->localeDate->expects($this->any())->method('getDateFormat')->willReturn('mm/dd/yy'); $entityType->expects($this->any())->method('getEntityTypeCode')->willReturn('entity_type_code'); $this->eavData->expects($this->any())->method('getFrontendClasses')->willReturn([]); - $formElement->expects($this->exactly(3))->method('setDisabled')->willReturnSelf(); + $formElement->expects($this->exactly(2))->method('setDisabled')->willReturnSelf(); $this->yesNo->expects($this->any())->method('toOptionArray')->willReturn(['yes', 'no']); $this->filesystem->expects($this->any())->method('getDirectoryRead')->willReturn($directoryReadInterface); $directoryReadInterface->expects($this->any())->method('getRelativePath')->willReturn('relative_path'); diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/DeleteTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/DeleteTest.php index bec5548f8bbc374a6b7631d984f6517da430bcbc..203f49495c8cd9f4b3a9bf0b7e9c4cd25eccbcb7 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/DeleteTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/DeleteTest.php @@ -122,7 +122,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with('catalog/*/', ['_current' => true, 'id' => null]); $this->categoryRepository->expects($this->never())->method('get'); - $this->unit->execute(); + $this->unit->executeInternal(); } public function testDelete() @@ -138,6 +138,6 @@ class DeleteTest extends \PHPUnit_Framework_TestCase $this->resultRedirect->expects($this->once())->method('setPath') ->with('catalog/*/', ['_current' => true, 'id' => $parentId]); - $this->unit->execute(); + $this->unit->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/SaveTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/SaveTest.php index 09cad210ad80cf1e510c7057799c5210fed0e5fe..b4e61882ee51d5bf04c04daa7f3d9cdda5c0db7c 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/SaveTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/SaveTest.php @@ -550,7 +550,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ) ->will($this->returnValue('result-execute')); - $this->assertEquals('result-execute', $this->save->execute()); + $this->assertEquals('result-execute', $this->save->executeInternal()); } /** diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/CategoriesJsonTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/CategoriesJsonTest.php index 26b7598e03b0f7609ea78634148aa01d4a227799..e1ae3110fed8d4ae979dce898990481481f4ae52 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/CategoriesJsonTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/CategoriesJsonTest.php @@ -141,6 +141,6 @@ class CategoriesJsonTest extends \PHPUnit_Framework_TestCase $testHtml = '<div>Some test html</div>'; $this->chooserBlockMock->expects($this->once())->method('getTreeJson')->will($this->returnValue($testHtml)); $this->resultJson->expects($this->once())->method('setJsonData')->with($testHtml)->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/ChooserTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/ChooserTest.php index f61c31a66208bf1f64d2a55bd6ec1358baceec31..ec55fc8616193b0d856a4dcdcad327a7b9c01e85 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/ChooserTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Category/Widget/ChooserTest.php @@ -123,6 +123,6 @@ class ChooserTest extends \PHPUnit_Framework_TestCase $testHtml = '<div>Some test html</div>'; $this->chooserBlockMock->expects($this->once())->method('toHtml')->will($this->returnValue($testHtml)); $this->resultRaw->expects($this->once())->method('setContents')->with($testHtml); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Action/Attribute/SaveTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Action/Attribute/SaveTest.php index b83afa0e6361f9fbad7576e272ebfb75477391f7..db88d451374f8b30979c23f80e1fe65f922060c9 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Action/Attribute/SaveTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Action/Attribute/SaveTest.php @@ -274,6 +274,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManager->expects($this->never())->method('addError'); $this->messageManager->expects($this->never())->method('addException'); - $this->object->execute(); + $this->object->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Attribute/EditTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Attribute/EditTest.php index f8cf08f5474944f81af73ecf0565e9cc6672e9e9..480f84e43b8b62e5153bacc8b2e8537aab7a206c 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Attribute/EditTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Attribute/EditTest.php @@ -199,7 +199,7 @@ class EditTest extends \PHPUnit_Framework_TestCase $this->blockTemplate->expects($this->any())->method('setIsPopup')->willReturnSelf(); - $this->assertSame($this->resultPage, $this->editController->execute()); + $this->assertSame($this->resultPage, $this->editController->executeInternal()); } public function testExecuteNoPopup() @@ -250,6 +250,6 @@ class EditTest extends \PHPUnit_Framework_TestCase $this->blockTemplate->expects($this->any())->method('setIsPopup')->willReturnSelf(); - $this->assertSame($this->resultPage, $this->editController->execute()); + $this->assertSame($this->resultPage, $this->editController->executeInternal()); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/MassStatusTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/MassStatusTest.php index 47dd99f5ce0230e7cbb8d9598b7381ff4d0da820..9a66cfdd37ec32f85e6ef8b7d80828cfddd6e766 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/MassStatusTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/MassStatusTest.php @@ -80,6 +80,6 @@ class MassStatusTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Pro public function testMassStatusAction() { $this->priceProcessor->expects($this->once())->method('reindexList'); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php index 215be1b4d16dab3f97d5135ffd6f6729d4c81a48..8dd5602000f859be53207a26963ef55d38b57d23 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php @@ -76,7 +76,7 @@ class NewActionTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Prod $this->action->getRequest()->expects($this->any())->method('getParam')->willReturn(true); $this->action->getRequest()->expects($this->any())->method('getFullActionName') ->willReturn('catalog_product_new'); - $this->action->execute(); + $this->action->executeInternal(); } public function testExecuteObtainsProductDataFromSession() @@ -90,6 +90,6 @@ class NewActionTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Prod $this->product->expects($this->once())->method('addData')->with(['name' => 'test-name', 'stock_data' => null]); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/SaveTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/SaveTest.php index 17a99b3ab8f5210ca601190541b362d510372123..4a9d892060a27c2bc116738abfcc86e882687ad3 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/SaveTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/SaveTest.php @@ -120,7 +120,7 @@ class SaveTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\ProductTe $this->session->expects($this->once())->method('setProductData')->with($productData); $this->resultRedirect->expects($this->once())->method('setPath')->with('catalog/*/new'); - $this->action->execute(); + $this->action->executeInternal(); } /** diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ShowUpdateResultTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ShowUpdateResultTest.php index c9209c3f0a793492697d6e2962d1bbd30f8e23dc..e5c1e4f425f4a1dbc2fdaa2274589384e22d93cc 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ShowUpdateResultTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ShowUpdateResultTest.php @@ -146,6 +146,6 @@ class ShowUpdateResultTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Catalog\Controller\Adminhtml\Product\ShowUpdateResult $controller */ $controller = new ShowUpdateResult($context, $productBuilder, $productCompositeHelper); - $controller->execute(); + $controller->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php index 9c58d09dfe4434cef1a398214de2a3fb6082dc06..709cd8db94148761a91e2f82ed9ade547344b542 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php @@ -132,7 +132,7 @@ class ValidateTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Produ $this->request->expects($this->any())->method('getPost')->willReturnMap([['set', null, 9]]); $this->product->expects($this->once())->method('setAttributeSetId')->with(9); - $this->action->execute(); + $this->action->executeInternal(); } public function testAttributeSetIsObtainedFromGetWhenThereIsNoOneInPost() @@ -141,6 +141,6 @@ class ValidateTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Produ $this->request->expects($this->any())->method('getPost')->willReturnMap([['set', null, null]]); $this->product->expects($this->once())->method('setAttributeSetId')->with(4); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Category/ViewTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Category/ViewTest.php index 735c13b0483115a6013d9e6a45eff449c58747c7..eacdcc133285311e11860294119a8942c6e8821c 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Category/ViewTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Category/ViewTest.php @@ -197,6 +197,6 @@ class ViewTest extends \PHPUnit_Framework_TestCase $this->catalogDesign->expects($this->any())->method('getDesignSettings')->will($this->returnValue($settings)); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Product/Compare/IndexTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Product/Compare/IndexTest.php index 134776df35391e9a3a9bcc466d382dc438165f87..da0c0c7bea7b15372ba22e1b3c4c8e515e469664 100644 --- a/app/code/Magento/Catalog/Test/Unit/Controller/Product/Compare/IndexTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Controller/Product/Compare/IndexTest.php @@ -154,7 +154,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); $this->listCompareMock->expects($this->never())->method('addProducts'); $this->redirectFactoryMock->expects($this->never())->method('create'); - $this->index->execute(); + $this->index->executeInternal(); } public function testExecuteWithItems() @@ -180,6 +180,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->redirectFactoryMock->expects($this->once()) ->method('create') ->willReturn($redirect); - $this->index->execute(); + $this->index->executeInternal(); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/ReaderTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/ReaderTest.php index 3121a3036b9206ee95938e1c6ce7dca9e61ea27f..eceaee7d0dc29820609f4dffbf50d07fd09e31e4 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/ReaderTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/ReaderTest.php @@ -73,7 +73,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->_schemaLocator = new \Magento\Catalog\Model\Attribute\Config\SchemaLocator($moduleReader); $this->_validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $this->_validationState->expects($this->once())->method('isValidated')->will($this->returnValue(false)); + $this->_validationState->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(false); $this->_model = new \Magento\Catalog\Model\Attribute\Config\Reader( $this->_fileResolverMock, diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/XsdTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/XsdTest.php index 033cd5038928fa41488ae0838cda7896ab01efee..da8c9b003331ff48b9b8018e6df3e290a0fefc2d 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/XsdTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Attribute/Config/XsdTest.php @@ -27,7 +27,10 @@ class XsdTest extends \PHPUnit_Framework_TestCase */ public function testExemplarXml($fixtureXml, array $expectedErrors) { - $dom = new \Magento\Framework\Config\Dom($fixtureXml, [], null, null, '%message%'); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, '%message%'); $actualResult = $dom->validate($this->_schemaFile, $actualErrors); $this->assertEquals(empty($expectedErrors), $actualResult); $this->assertEquals($expectedErrors, $actualErrors); diff --git a/app/code/Magento/Catalog/Test/Unit/Model/CategoryLinkManagementTest.php b/app/code/Magento/Catalog/Test/Unit/Model/CategoryLinkManagementTest.php index 9e75726f9dfa284355307d81760d848aa2d7de6e..4be4d33c4fcf2852cb23586fbdf505e387b0682b 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/CategoryLinkManagementTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/CategoryLinkManagementTest.php @@ -44,7 +44,7 @@ class CategoryLinkManagementTest extends \PHPUnit_Framework_TestCase { $categoryId = 42; $productId = 55; - $productsPosition = [$productId => 25]; + $position = 25; $productSku = 'testSku'; $categoryProductLinkMock = $this->getMock('\Magento\Catalog\Api\Data\CategoryProductLinkInterface'); $categoryMock = $this->getMock( @@ -56,13 +56,14 @@ class CategoryLinkManagementTest extends \PHPUnit_Framework_TestCase ); $productMock = $this->getMock('\Magento\Catalog\Model\Product', [], [], '', false); $productMock->expects($this->once())->method('getSku')->willReturn($productSku); + $productMock->expects($this->once())->method('getData')->with('cat_index_position')->willReturn($position); $items = [$productId => $productMock]; - $productsMock = $this->getMock('\Magento\Framework\Data\Collection\AbstractDb', [], [], '', false); + $productsMock = $this->getMock('Magento\Catalog\Model\ResourceModel\Product\Collection', [], [], '', false); $this->categoryRepositoryMock->expects($this->once())->method('get')->with($categoryId) ->willReturn($categoryMock); - $categoryMock->expects($this->once())->method('getProductsPosition')->willReturn($productsPosition); $categoryMock->expects($this->once())->method('getProductCollection')->willReturn($productsMock); $categoryMock->expects($this->once())->method('getId')->willReturn($categoryId); + $productsMock->expects($this->once())->method('addFieldToSelect')->with('position')->willReturnSelf(); $productsMock->expects($this->once())->method('getItems')->willReturn($items); $this->productLinkFactoryMock->expects($this->once())->method('create')->willReturn($categoryProductLinkMock); $categoryProductLinkMock->expects($this->once()) @@ -71,7 +72,7 @@ class CategoryLinkManagementTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); $categoryProductLinkMock->expects($this->once()) ->method('setPosition') - ->with(25) + ->with($position) ->willReturnSelf(); $categoryProductLinkMock->expects($this->once()) ->method('setCategoryId') diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Config/Source/Product/Options/TypeTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Config/Source/Product/Options/TypeTest.php index aa686d39ce8d9e1bcc08a00a1bcc6ab1bbb997c7..0696faaa9343593ec21d5108a3ccd5c8e98f1850 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Config/Source/Product/Options/TypeTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Config/Source/Product/Options/TypeTest.php @@ -51,7 +51,11 @@ class TypeTest extends \PHPUnit_Framework_TestCase ]; $expect = [ ['value' => '', 'label' => __('-- Please select --')], - ['label' => 'optionLabel', 'value' => [['label' => 'typeLabel', 'value' => 'typeName']]], + [ + 'label' => 'optionLabel', + 'optgroup-name' => 'optionLabel', + 'value' => [['label' => 'typeLabel', 'value' => 'typeName']] + ], ]; $this->productOptionConfig->expects($this->any())->method('getAll')->will($this->returnValue($allOptions)); diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php index 3e8a85a77166a9facfa71e6aa0b011cd07bde981..cc65bb7803ba8d52983564708deb9ee0cdb779f4 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php @@ -58,7 +58,7 @@ class AttributeManagementTest extends \PHPUnit_Framework_TestCase public function testGetList() { - $attributeSetName = 'Default Product Template'; + $attributeSetName = 'Default Attribute Set'; $expectedResult = [ $this->getMock('\Magento\Catalog\Api\Data\ProductAttributeInterface'), ]; diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php index c52c96470fd632390d55fa6f6f4f142c6e5e0f5d..e80bbd868262801cf8498ec289dc9d8473be21ed 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php @@ -250,6 +250,15 @@ class ProductTest extends \PHPUnit_Framework_TestCase ->setMethods(['setProduct', 'saveOptions', '__wakeup', '__sleep']) ->disableOriginalConstructor()->getMock(); + $optionFactory = $this->getMock( + 'Magento\Catalog\Model\Product\OptionFactory', + ['create'], + [], + '', + false + ); + $optionFactory->expects($this->any())->method('create')->willReturn($this->optionInstanceMock); + $this->resource = $this->getMockBuilder('Magento\Catalog\Model\ResourceModel\Product') ->disableOriginalConstructor() ->getMock(); @@ -347,7 +356,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase 'catalogProductType' => $this->productTypeInstanceMock, 'productFlatIndexerProcessor' => $this->productFlatProcessor, 'productPriceIndexerProcessor' => $this->productPriceProcessor, - 'catalogProductOption' => $this->optionInstanceMock, + 'catalogProductOptionFactory' => $optionFactory, 'storeManager' => $storeManager, 'resource' => $this->resource, 'registry' => $this->registry, @@ -1241,6 +1250,14 @@ class ProductTest extends \PHPUnit_Framework_TestCase $optionInstanceMock = $this->getMockBuilder('Magento\Catalog\Model\Product\Option') ->disableOriginalConstructor() ->getMock(); + $optionFactory = $this->getMock( + 'Magento\Catalog\Model\Product\OptionFactory', + ['create'], + [], + '', + false + ); + $optionFactory->expects($this->any())->method('create')->willReturn($optionInstanceMock); $joinProcessorMock = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface') ->disableOriginalConstructor() ->getMock(); @@ -1249,7 +1266,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase $productModel = $this->objectManagerHelper->getObject( 'Magento\Catalog\Model\Product', [ - 'catalogProductOption' => $optionInstanceMock, + 'catalogProductOptionFactory' => $optionFactory, 'joinProcessor' => $joinProcessorMock ] ); diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Eav/AttributeTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Eav/AttributeTest.php index ab8d0328ca6091522c1180ee7f3533936962a3ad..38e97bbc1087700505cc54efc3501074a5c1d6d5 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Eav/AttributeTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Eav/AttributeTest.php @@ -8,8 +8,6 @@ namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Eav; -use \Magento\Catalog\Model\ResourceModel\Eav\Attribute; - class AttributeTest extends \PHPUnit_Framework_TestCase { /** @@ -131,9 +129,9 @@ class AttributeTest extends \PHPUnit_Framework_TestCase { $this->_processor->expects($this->once())->method('markIndexerAsInvalid'); - $this->_model->setOrigData('is_global', \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE); + $this->_model->setOrigData('is_global', \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE); $this->_model->setOrigData('used_in_product_listing', 1); - $this->_model->setIsGlobal(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL); + $this->_model->setIsGlobal(\Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL); $this->_model->afterSave(); } @@ -172,7 +170,7 @@ class AttributeTest extends \PHPUnit_Framework_TestCase 'indexerEavProcessor' => $this->_eavProcessor, 'resource' => $this->resourceMock, 'data' => [ - 'is_global' => Attribute::SCOPE_GLOBAL + 'is_global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL ] ] ); @@ -190,7 +188,7 @@ class AttributeTest extends \PHPUnit_Framework_TestCase 'indexerEavProcessor' => $this->_eavProcessor, 'resource' => $this->resourceMock, 'data' => [ - 'is_global' => Attribute::SCOPE_WEBSITE + 'is_global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE ] ] ); diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/ProductTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/ProductTest.php index 9967344b70e8da0c9f50a1995647fa7afb3fd96d..d3c8792274104fc65aabdc4c72fce36acfc411b3 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/ProductTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/ProductTest.php @@ -56,7 +56,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase public function testValidateWrongAttributeSet() { $productTypeId = 4; - $expectedErrorMessage = ['attribute_set' => 'Invalid product template entity type']; + $expectedErrorMessage = ['attribute_set' => 'Invalid attribute set entity type']; $productMock = $this->getMock( '\Magento\Framework\DataObject', diff --git a/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php b/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php index 58de2b262c8ab7489b6f37691e592484dd7d624b..ab061a2c756c3a5a4eb5aa312312459e163720a1 100644 --- a/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php +++ b/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php @@ -55,6 +55,9 @@ class ColumnFactory 'dataType' => $this->getDataType($attribute), 'add_field' => true, 'visible' => $attribute->getIsVisibleInGrid(), + 'filter' => ($attribute->getIsFilterableInGrid()) + ? $this->getFilterType($attribute->getFrontendInput()) + : null, ], $config); if ($attribute->usesSource()) { @@ -92,4 +95,17 @@ class ColumnFactory ? $this->dataTypeMap[$attribute->getFrontendInput()] : $this->dataTypeMap['default']; } + + /** + * Retrieve filter type by $frontendInput + * + * @param string $frontendInput + * @return string + */ + protected function getFilterType($frontendInput) + { + $filtersMap = ['date' => 'dateRange']; + $result = array_replace_recursive($this->dataTypeMap, $filtersMap); + return isset($result[$frontendInput]) ? $result[$frontendInput] : $result['default']; + } } diff --git a/app/code/Magento/Catalog/Ui/Component/Listing/Columns/Price.php b/app/code/Magento/Catalog/Ui/Component/Listing/Columns/Price.php index 2c4af877568c3d9d33dfb033d034c254e03b376f..bcfef825f53453c3df348a1ea0313aebca153cac 100644 --- a/app/code/Magento/Catalog/Ui/Component/Listing/Columns/Price.php +++ b/app/code/Magento/Catalog/Ui/Component/Listing/Columns/Price.php @@ -53,14 +53,12 @@ class Price extends \Magento\Ui\Component\Listing\Columns\Column $store = $this->storeManager->getStore( $this->context->getFilterParam('store_id', \Magento\Store\Model\Store::DEFAULT_STORE_ID) ); - $currencyCode = $store->getCurrentCurrencyCode(); - $currencyRate = $store->getCurrentCurrencyRate(); - $currency = $this->localeCurrency->getCurrency($currencyCode); + $currency = $this->localeCurrency->getCurrency($store->getBaseCurrencyCode()); $fieldName = $this->getData('name'); foreach ($dataSource['data']['items'] as & $item) { if (isset($item[$fieldName])) { - $item[$fieldName] = $currency->toCurrency(sprintf("%f", $item[$fieldName] * $currencyRate)); + $item[$fieldName] = $currency->toCurrency(sprintf("%f", $item[$fieldName])); } } } diff --git a/app/code/Magento/Catalog/etc/acl.xml b/app/code/Magento/Catalog/etc/acl.xml index 0811d1393129b0dc6ef29ae61fc8793474b6bd78..0fc34da2584446847da5ab5234563d05c0ee8d46 100644 --- a/app/code/Magento/Catalog/etc/acl.xml +++ b/app/code/Magento/Catalog/etc/acl.xml @@ -24,7 +24,7 @@ <resource id="Magento_Backend::stores_attributes"> <resource id="Magento_Catalog::attributes_attributes" title="Product" sortOrder="30" /> <resource id="Magento_Catalog::update_attributes" title="Update Attributes" sortOrder="35" /> - <resource id="Magento_Catalog::sets" title="Product Template" sortOrder="40"/> + <resource id="Magento_Catalog::sets" title="Attribute Set" sortOrder="40"/> </resource> </resource> </resource> diff --git a/app/code/Magento/Catalog/etc/adminhtml/menu.xml b/app/code/Magento/Catalog/etc/adminhtml/menu.xml index 0d9783b0fea0af781b38b548aa6a26cf8abf00d7..53db61bd3a1ccdf477672bc10d74c00c76e8156f 100644 --- a/app/code/Magento/Catalog/etc/adminhtml/menu.xml +++ b/app/code/Magento/Catalog/etc/adminhtml/menu.xml @@ -11,7 +11,7 @@ <add id="Magento_Catalog::catalog_products" title="Catalog" module="Magento_Catalog" sortOrder="10" parent="Magento_Catalog::inventory" action="catalog/product/" resource="Magento_Catalog::products"/> <add id="Magento_Catalog::catalog_categories" title="Categories" module="Magento_Catalog" sortOrder="20" parent="Magento_Catalog::inventory" action="catalog/category/" resource="Magento_Catalog::categories"/> <add id="Magento_Catalog::catalog_attributes_attributes" title="Product" module="Magento_Catalog" sortOrder="30" parent="Magento_Backend::stores_attributes" action="catalog/product_attribute/" resource="Magento_Catalog::attributes_attributes"/> - <add id="Magento_Catalog::catalog_attributes_sets" title="Product Template" module="Magento_Catalog" sortOrder="40" parent="Magento_Backend::stores_attributes" action="catalog/product_set/" resource="Magento_Catalog::sets"/> + <add id="Magento_Catalog::catalog_attributes_sets" title="Attribute Set" module="Magento_Catalog" sortOrder="40" parent="Magento_Backend::stores_attributes" action="catalog/product_set/" resource="Magento_Catalog::sets"/> <add id="Magento_Catalog::inventory" title="Inventory" module="Magento_Catalog" sortOrder="10" parent="Magento_Catalog::catalog" dependsOnModule="Magento_Catalog" resource="Magento_Catalog::catalog"/> </menu> diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml index 7bd251153314e365e0b9ed8c27de9939ac8f5a8a..3ffee9360469843e9db628e2ce7fec5b0316c97c 100644 --- a/app/code/Magento/Catalog/etc/di.xml +++ b/app/code/Magento/Catalog/etc/di.xml @@ -459,6 +459,8 @@ <preference for="Magento\Catalog\Api\ProductLinkManagementInterface" type="Magento\Catalog\Model\ProductLink\Management" /> <preference for="Magento\Catalog\Api\Data\ProductLinkInterface" type="Magento\Catalog\Model\ProductLink\Link" /> <preference for="\Magento\Catalog\Api\CategoryLinkManagementInterface" type="\Magento\Catalog\Model\CategoryLinkManagement" /> + <preference for="Magento\Catalog\Api\Data\ProductWebsiteLinkInterface" type="Magento\Catalog\Model\ProductWebsiteLink" /> + <preference for="Magento\Catalog\Api\ProductWebsiteLinkRepositoryInterface" type="Magento\Catalog\Model\ProductWebsiteLinkRepository" /> <preference for="\Magento\Catalog\Api\CategoryLinkRepositoryInterface" type="\Magento\Catalog\Model\CategoryLinkRepository" /> <preference for="Magento\Catalog\Api\Data\ProductCustomOptionInterface" type="Magento\Catalog\Model\Product\Option" /> <preference for="Magento\Catalog\Api\ProductCustomOptionRepositoryInterface" type="\Magento\Catalog\Model\Product\Option\Repository" /> diff --git a/app/code/Magento/Catalog/etc/module.xml b/app/code/Magento/Catalog/etc/module.xml index ee04bbc7431f4d853a6bcd6b81a5c129f19c3794..e5bc1089fc9f836064bad46537853bbc6cdf4c83 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.0.2"> + <module name="Magento_Catalog" setup_version="2.0.3"> <sequence> <module name="Magento_Eav"/> <module name="Magento_Cms"/> diff --git a/app/code/Magento/Catalog/etc/webapi.xml b/app/code/Magento/Catalog/etc/webapi.xml index 24492cbc019b977e402a81c66b1f2f81163b2a2a..d447b748a9ef4139f8777627c08274165383599c 100644 --- a/app/code/Magento/Catalog/etc/webapi.xml +++ b/app/code/Magento/Catalog/etc/webapi.xml @@ -385,4 +385,24 @@ <resource ref="Magento_Catalog::categories" /> </resources> </route> + + <!-- Product Website Links --> + <route url="/V1/products/:sku/websites" method="POST"> + <service class="Magento\Catalog\Api\ProductWebsiteLinkRepositoryInterface" method="save" /> + <resources> + <resource ref="Magento_Catalog::products" /> + </resources> + </route> + <route url="/V1/products/:sku/websites" method="PUT"> + <service class="Magento\Catalog\Api\ProductWebsiteLinkRepositoryInterface" method="save" /> + <resources> + <resource ref="Magento_Catalog::products" /> + </resources> + </route> + <route url="/V1/products/:sku/websites/:websiteId" method="DELETE"> + <service class="Magento\Catalog\Api\ProductWebsiteLinkRepositoryInterface" method="deleteById" /> + <resources> + <resource ref="Magento_Catalog::products" /> + </resources> + </route> </routes> diff --git a/app/code/Magento/Catalog/i18n/de_DE.csv b/app/code/Magento/Catalog/i18n/de_DE.csv index ecbd2cb02116bf9af5c3f6ac5bae02811a89a110..13f728de1c48bf5b7d2129e11186f94fcb71780a 100644 --- a/app/code/Magento/Catalog/i18n/de_DE.csv +++ b/app/code/Magento/Catalog/i18n/de_DE.csv @@ -160,7 +160,9 @@ Empty,Leer "Based On","Basierend auf" "Add New Attribute Set","Neuer Eigenschaftensatz hinzufügen" "Add New Set","Neuen Satz hinzufügen" +"Attribute Sets","Attribute Sets" "Product Templates","Product Templates" +"Product Template","Product Template" "Close Window","Fenster Schließen" "New Product","Neues Produkt" "Save & Edit","Save & Edit" @@ -280,6 +282,7 @@ Categories,Kategorien "This attribute set no longer exists.","Dieses Eigenschaftenset existiert nicht mehr." "You saved the attribute set.","You saved the attribute set." "An error occurred while saving the attribute set.","Beim Speichern des Eigenschaftensatzes ist ein Fehler aufgetreten." +"New Attribute Set","New Attribute Set" "New Product Template","New Product Template" "The attribute set has been removed.","The attribute set has been removed." "An error occurred while deleting this set.","An error occurred while deleting this set." diff --git a/app/code/Magento/Catalog/i18n/en_US.csv b/app/code/Magento/Catalog/i18n/en_US.csv index 2cfe7083932dd18f5c4e4082eb80fe321b2ee809..b692356a48f6e8fcbc7090a36f1de08bd452636e 100644 --- a/app/code/Magento/Catalog/i18n/en_US.csv +++ b/app/code/Magento/Catalog/i18n/en_US.csv @@ -160,7 +160,9 @@ Empty,Empty "Based On","Based On" "Add New Attribute Set","Add New Attribute Set" "Add New Set","Add New Set" +"Attribute Sets","Attribute Sets" "Product Templates","Product Templates" +"Product Template","Product Template" "Close Window","Close Window" "New Product","New Product" "Save & Edit","Save & Edit" @@ -280,6 +282,7 @@ Categories,Categories "This attribute set no longer exists.","This attribute set no longer exists." "You saved the attribute set.","You saved the attribute set." "An error occurred while saving the attribute set.","An error occurred while saving the attribute set." +"New Attribute Set","New Attribute Set" "New Product Template","New Product Template" "The attribute set has been removed.","The attribute set has been removed." "An error occurred while deleting this set.","An error occurred while deleting this set." @@ -630,3 +633,24 @@ Set,Set none,none Overview,Overview "Field ""%1"" was not found in DO ""%2"".","Field ""%1"" was not found in DO ""%2""." +"Is Active","Is Active" +"URL Key","URL Key" +"Description","Description" +"Image","Image" +"Page Title","Page Title" +"Meta Keywords","Meta Keywords" +"Meta Description","Meta Description" +"Include in Navigation Menu","Include in Navigation Menu" +"Display Mode","Display Mode" +"CMS Block","CMS Block" +"Is Anchor","Is Anchor" +"Available Product Listing Sort By","Available Product Listing Sort By" +"Default Product Listing Sort By","Default Product Listing Sort By" +"Layered Navigation Price Step","Layered Navigation Price Step" +"Use Parent Category Settings","Use Parent Category Settings" +"Apply To Products","Apply To Products" +"Active From","Active From" +"Active To","Active To" +"Page Layout","Page Layout" +"Custom Layout Update","Custom Layout Update" +"Name","Name" diff --git a/app/code/Magento/Catalog/i18n/es_ES.csv b/app/code/Magento/Catalog/i18n/es_ES.csv index 83b48a5ad10cb4176b43d2cd321bb4e2a15c1e94..b80323c57f1d54b730d2396e535efec64cef92b2 100644 --- a/app/code/Magento/Catalog/i18n/es_ES.csv +++ b/app/code/Magento/Catalog/i18n/es_ES.csv @@ -160,7 +160,9 @@ Empty,VacÃo(a) "Based On","Basado en" "Add New Attribute Set","Agregar nuevo conjunto de atributos" "Add New Set","Agregar nuevo conjunto" +"Attribute Sets","Attribute Sets" "Product Templates","Product Templates" +"Product Template","Product Template" "Close Window","Cerrar Ventana" "New Product","Nuevo producto" "Save & Edit","Save & Edit" @@ -280,6 +282,7 @@ Categories,CategorÃas "This attribute set no longer exists.","Este conjunto de atributos ya no existe." "You saved the attribute set.","You saved the attribute set." "An error occurred while saving the attribute set.","Se produjo un error mientras se guardaba el conjunto de atributos." +"New Attribute Set","New Attribute Set" "New Product Template","New Product Template" "The attribute set has been removed.","The attribute set has been removed." "An error occurred while deleting this set.","An error occurred while deleting this set." diff --git a/app/code/Magento/Catalog/i18n/fr_FR.csv b/app/code/Magento/Catalog/i18n/fr_FR.csv index 62cb82be609505db81ff49c6c1300a2416c2ed6c..1ea1cd2d717d2d0c1a0c0362bb912878ef85fc33 100644 --- a/app/code/Magento/Catalog/i18n/fr_FR.csv +++ b/app/code/Magento/Catalog/i18n/fr_FR.csv @@ -160,7 +160,9 @@ Empty,Vide "Based On","Basé sur" "Add New Attribute Set","Ajouter un nouveau jeu d'attributs" "Add New Set","Ajouter une nouvelle série" +"Attribute Sets","Attribute Sets" "Product Templates","Product Templates" +"Product Template","Product Template" "Close Window","Fermer la fenêtre" "New Product","Nouveau produit" "Save & Edit","Save & Edit" @@ -280,6 +282,7 @@ Categories,catégories "This attribute set no longer exists.","La série d'attributs n'existe plus." "You saved the attribute set.","You saved the attribute set." "An error occurred while saving the attribute set.","Une erreur est survenue pendant la sauvegarde de la série d'attributs." +"New Attribute Set","New Attribute Set" "New Product Template","New Product Template" "The attribute set has been removed.","The attribute set has been removed." "An error occurred while deleting this set.","An error occurred while deleting this set." diff --git a/app/code/Magento/Catalog/i18n/nl_NL.csv b/app/code/Magento/Catalog/i18n/nl_NL.csv index ee1eb9baee9d9cad43ceabb2583b62b7a104c181..5b99980e6ecae088a5ded2b78d6adca58bb4f413 100644 --- a/app/code/Magento/Catalog/i18n/nl_NL.csv +++ b/app/code/Magento/Catalog/i18n/nl_NL.csv @@ -160,7 +160,9 @@ Empty,Leeg "Based On","Gebaseerd op" "Add New Attribute Set","Voeg Nieuwe Attribuut Set toe" "Add New Set","Voeg Nieuwe Reeks Toe" +"Attribute Sets","Attribute Sets" "Product Templates","Product Templates" +"Product Template","Product Template" "Close Window","Venster Sluiten" "New Product","Nieuw Product" "Save & Edit","Save & Edit" @@ -280,6 +282,7 @@ Categories,Categoriën "This attribute set no longer exists.","Deze attribuutset bestaat niet meer." "You saved the attribute set.","You saved the attribute set." "An error occurred while saving the attribute set.","Er is een fout opgetreden tijdens het opslaan van de attribuut set." +"New Attribute Set","New Attribute Set" "New Product Template","New Product Template" "The attribute set has been removed.","The attribute set has been removed." "An error occurred while deleting this set.","An error occurred while deleting this set." diff --git a/app/code/Magento/Catalog/i18n/pt_BR.csv b/app/code/Magento/Catalog/i18n/pt_BR.csv index 3e0887c87547d57e94da6a9b472d1ee69de8e43a..f539953fb7554f505e900850da9d5a9c0bc3543b 100644 --- a/app/code/Magento/Catalog/i18n/pt_BR.csv +++ b/app/code/Magento/Catalog/i18n/pt_BR.csv @@ -160,7 +160,9 @@ Empty,Vazio "Based On","Baseado Em" "Add New Attribute Set","Adicionar Novo Conjunto de Atributos" "Add New Set","Adicionar Novo Conjunto" +"Attribute Sets","Attribute Sets" "Product Templates","Product Templates" +"Product Template","Product Template" "Close Window","Fechar Janela" "New Product","Novo Produto" "Save & Edit","Save & Edit" @@ -280,6 +282,7 @@ Categories,Categorias "This attribute set no longer exists.","Este conjunto de atributos não existe mais." "You saved the attribute set.","You saved the attribute set." "An error occurred while saving the attribute set.","Ocorreu um erro ao salvar o conjunto de atributos." +"New Attribute Set","New Attribute Set" "New Product Template","New Product Template" "The attribute set has been removed.","The attribute set has been removed." "An error occurred while deleting this set.","An error occurred while deleting this set." diff --git a/app/code/Magento/Catalog/i18n/zh_Hans_CN.csv b/app/code/Magento/Catalog/i18n/zh_Hans_CN.csv index 4774b64706d9a98e98551936c7629de04c5050ac..5180add5db942ca46a9d3159b7c7858e4625ecd7 100644 --- a/app/code/Magento/Catalog/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Catalog/i18n/zh_Hans_CN.csv @@ -160,7 +160,9 @@ Empty,空 "Based On",基于 "Add New Attribute Set",æ·»åŠ æ–°å±žæ€§é›† "Add New Set",æ·»åŠ æ–°é›† +"Attribute Sets","Attribute Sets" "Product Templates","Product Templates" +"Product Template","Product Template" "Close Window",å…³é—çª—å£ "New Product",æ–°äº§å“ "Save & Edit","Save & Edit" @@ -280,6 +282,7 @@ Categories,分类 "This attribute set no longer exists.",该属性已ä¸å˜åœ¨ã€‚ "You saved the attribute set.","You saved the attribute set." "An error occurred while saving the attribute set.",ä¿å˜å±žæ€§é›†æ—¶å‘生错误。 +"New Attribute Set","New Attribute Set" "New Product Template","New Product Template" "The attribute set has been removed.","The attribute set has been removed." "An error occurred while deleting this set.","An error occurred while deleting this set." diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/checkboxes/tree.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/checkboxes/tree.phtml index 15e6732c51b009bebb8da26bf44e122aee819051..25aaaea0ffe2b98a6e46a7e133c53b743603530e 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/checkboxes/tree.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/checkboxes/tree.phtml @@ -10,9 +10,7 @@ <?php $_divId = 'tree-div_' . time() ?> <div id="<?php /* @escapeNotVerified */ echo $_divId ?>" class="tree"></div> -<!--[if IE]> <script id="ie-deferred-loader" defer="defer" src=""></script> -<![endif]--> <script> require([ 'jquery', diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/tree.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/tree.phtml index db9087984db1f0ff501b540055618e949a599cb2..894a4d5bc63fcdf67973f12e5e7bdc25cebe947c 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/tree.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/tree.phtml @@ -35,9 +35,7 @@ <div><?php /* @escapeNotVerified */ echo __('This operation can take a long time'); ?></div> </div> </div> - <!--[if IE]> <script id="ie-deferred-loader" defer="defer" src=""></script> - <![endif]--> <script> var tree; require([ diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/widget/tree.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/widget/tree.phtml index 9e303fe921dfd328453c0f736a107fa4be70e6fa..2549cd64c5c7a1ee489804e48c4feed2a3364915 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/widget/tree.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/category/widget/tree.phtml @@ -10,9 +10,8 @@ <?php $_divId = 'tree' . $block->getId() ?> <div id="<?php /* @escapeNotVerified */ echo $_divId ?>" class="tree"></div> -<!--[if IE]> <script id="ie-deferred-loader" defer="defer" src=""></script> -<![endif]--> +<![]--> <script> require(['jquery', "prototype", "extjs/ext-tree-checkbox"], function(jQuery){ diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml index 06edcfbaa2588ae285fac4a456ec0ae5c05b8846..f1bba6cc3c07ca0603e149afc8f0ad24b342a467 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml @@ -38,9 +38,7 @@ <span class="title"><?php /* @escapeNotVerified */ echo __('Unassigned Attributes') ?></span> </div> <div id="tree-div2" class="attribute-set-tree"></div> - <!--[if IE]> <script id="ie-deferred-loader" defer="defer" src=""></script> - <![endif]--> <script> define("tree-panel", [ @@ -354,7 +352,7 @@ rightBeforeAppend : function(tree, nodeThis, node, newParent) { if (node.attributes.is_user_defined == 0) { alert({ - content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('You can\'t remove attributes from this product template.')) ?>' + content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('You can\'t remove attributes from this attribute set.')) ?>' }); return false; } else { @@ -370,7 +368,7 @@ if (node.attributes.is_unassignable == 0) { alert({ - content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('You can\'t remove attributes from this product template.')) ?>' + content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('You can\'t remove attributes from this attribute set.')) ?>' }); return false; } else { diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit.phtml index 3bce181616dab3a8a99102a7105ba6dea9bd880e..30048cce246460ab521b5d608865acea320ea488 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit.phtml @@ -21,7 +21,7 @@ </button> <ul class="dropdown-menu"> <li><input type="text" id="product-template-suggest" class="search" - placeholder="start typing to search template"/></li> + placeholder="<?php /* @noEscape */ echo __('start typing to search template'); ?>"/></li> </ul> </div> </div> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml index 67b1e95e3084663f375efad98714f295ac897c41..6ed486f4c0b4ae21234947626e3f2749aa226d57 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml @@ -9,7 +9,7 @@ ?> <?php /** @var $block \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Options */ ?> -<div class="fieldset-wrapper" id="product-custom-options-wrapper"> +<div class="fieldset-wrapper" id="product-custom-options-wrapper" data-block="product-custom-options"> <div class="fieldset-wrapper-title"> <strong class="title"> <span><?php /* @escapeNotVerified */ echo __('Custom Options') ?></span> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml index 3403d4447f82f705375a32e5467793aabd2dff4d..778c8657a83c25d67548a80f156d9f3e674cd39c 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml @@ -88,7 +88,7 @@ require([ ], function(jQuery){ jQuery(function ($) { - var fieldSet = $('#Custom_Options'); + var fieldSet = $('[data-block=product-custom-options]'); fieldSet.customOptions(<?php /* @escapeNotVerified */ echo $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode( [ 'fieldId' => $block->getFieldId(), @@ -97,6 +97,7 @@ jQuery(function ($) { 'customOptionsUrl' => $block->getCustomOptionsUrl(), 'isReadonly' => $block->isReadonly(), 'itemCount' => $block->getItemCount(), + 'currentProductId' => $block->getCurrentProductId(), ] )?>); //adding data to templates diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/attribute/search.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/attribute/search.phtml index d3c382f9276b8a2d9df9ec1473fbe1707779fc42..8d2cca19f20cae71303e2da1d50f12569dfd41fe 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/attribute/search.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/attribute/search.phtml @@ -17,7 +17,7 @@ <input data-role="product-attribute-search" data-group="<?php echo $block->escapeHtml($block->getGroupCode()); ?>" class="search" type="text" - placeholder="start typing to search attribute"/> + placeholder="<?php /* @noEscape */ echo __('start typing to search attribute'); ?>" /> </div> </div> diff --git a/app/code/Magento/Catalog/view/adminhtml/web/catalog/base-image-uploader.js b/app/code/Magento/Catalog/view/adminhtml/web/catalog/base-image-uploader.js index de62ea60219a74287c9d2846849f8a9d297a1c08..2d02bf2b97f6936ec58b070430304285b178e986 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/catalog/base-image-uploader.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/catalog/base-image-uploader.js @@ -38,7 +38,7 @@ define([ var findElement = function (data) { return $container.find('.image:not(.image-placeholder)').filter(function () { - if(!$(this).data('image')) { + if (!$(this).data('image')) { return false; } return $(this).data('image').file === data.file; diff --git a/app/code/Magento/Catalog/view/adminhtml/web/catalog/category/edit.js b/app/code/Magento/Catalog/view/adminhtml/web/catalog/category/edit.js index b56225bc6ea298dc8a74c20ffb87e01929806021..51fed1ebfec00a9f7ac1b63f5756badb8dcebcbd 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/catalog/category/edit.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/catalog/category/edit.js @@ -20,7 +20,7 @@ define([ var params = {}; var fields = $('category_edit_form').getElementsBySelector('input', 'select'); - for(var i=0;i<fields.length;i++){ + for (var i=0; i<fields.length; i++) { if (!fields[i].name) { continue; } diff --git a/app/code/Magento/Catalog/view/adminhtml/web/catalog/product/composite/configure.js b/app/code/Magento/Catalog/view/adminhtml/web/catalog/product/composite/configure.js index 1b5fbe954b89d8bb5edab7477dc7785c0f4ca6c3..f63c2a7d8f712d8160a532143cd12072c7d39e58 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/catalog/product/composite/configure.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/catalog/product/composite/configure.js @@ -703,7 +703,9 @@ define([ mageData.scripts.map(function(script) { return eval(script); }); - } catch (e) {} + } catch (e) { + + } this.restorePhase = false; } break; diff --git a/app/code/Magento/Catalog/view/adminhtml/web/js/custom-options.js b/app/code/Magento/Catalog/view/adminhtml/web/js/custom-options.js index d68497046a5bf00619fc2db9109ffb8869b7eed2..ae23c3476b8b71df0fd2ff600672c80279247b3b 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/js/custom-options.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/js/custom-options.js @@ -179,7 +179,7 @@ define([ }); importContainer.load( this.options.productGridUrl, - {form_key: this.options.formKey}, + {form_key: this.options.formKey, current_product_id : this.options.currentProductId}, function () { importContainer.modal('openModal'); } @@ -194,7 +194,8 @@ define([ var widget = this, currentElement = $(event.target), parentId = '#' + currentElement.closest('.fieldset-alt').attr('id'), - group = currentElement.find('[value="' + currentElement.val() + '"]').closest('optgroup').attr('label'), + group = currentElement.find('[value="' + currentElement.val() + '"]') + .closest('optgroup').attr('data-optgroup-name'), previousGroup = $(parentId + '_previous_group').val(), previousBlock = $(parentId + '_type_' + previousGroup), tmpl; diff --git a/app/code/Magento/Catalog/view/adminhtml/web/js/options.js b/app/code/Magento/Catalog/view/adminhtml/web/js/options.js index 0734c4362c52842538493da8a6f9592ab3ffdaf6..3928decacf495b96aa38241cf646061a2c0143bf 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/js/options.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/js/options.js @@ -11,7 +11,9 @@ define([ 'mage/template', 'uiRegistry', 'jquery/ui', - 'prototype' + 'prototype', + 'form', + 'validation' ], function (jQuery, mageTemplate, rg) { 'use strict'; diff --git a/app/code/Magento/Catalog/view/adminhtml/web/js/product-gallery.js b/app/code/Magento/Catalog/view/adminhtml/web/js/product-gallery.js index 45ee5c2d5c909d298fad5c793d6b848889f11725..4fef5dbb06679ba3dd13ca74b0b19be9d31a20d6 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/js/product-gallery.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/js/product-gallery.js @@ -301,7 +301,7 @@ define([ * @private */ _onOpenDialog: function(e, imageData) { - if(imageData.media_type && imageData.media_type != 'image') { + if (imageData.media_type && imageData.media_type != 'image') { return; } this._showDialog(imageData); @@ -315,7 +315,7 @@ define([ _showDialog: function (imageData) { var $imageContainer = this.findElement(imageData); var dialogElement = $imageContainer.data('dialog'); - if(!this.dialogTmpl) { + if (!this.dialogTmpl) { alert('System problem!'); return; } diff --git a/app/code/Magento/Catalog/view/frontend/web/js/catalog-add-to-cart.js b/app/code/Magento/Catalog/view/frontend/web/js/catalog-add-to-cart.js index 02898a8e87fff11dbfb6607fd39224bcdf9d3395..dadc7e8bbb20efe31c9a06a558688c3a622fbc93 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/catalog-add-to-cart.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/catalog-add-to-cart.js @@ -46,7 +46,7 @@ define([ submitForm: function(form) { var self = this; - if (form.has('input[type="file"]').length && form.find('input[type="file"]').val() !== '') { + if (form.has('input[type="file"]').length && form.find('input[type="file"]').val() !== '') { self.element.off('submit'); form.submit(); } else { diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index a2a98fcdbc51ed0b8c57a0a779da126b43bdff50..24475736833f8cbcbda2528614e5f3d3573b2e53 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -207,7 +207,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ValidatorInterface::ERROR_INVALID_SCOPE => 'Invalid value in Scope column', ValidatorInterface::ERROR_INVALID_WEBSITE => 'Invalid value in Website column (website does not exists?)', ValidatorInterface::ERROR_INVALID_STORE => 'Invalid value in Store column (store doesn\'t exist?)', - ValidatorInterface::ERROR_INVALID_ATTR_SET => 'Invalid value for Product Template column (set doesn\'t exist?)', + ValidatorInterface::ERROR_INVALID_ATTR_SET => 'Invalid value for Attribute Set column (set doesn\'t exist?)', ValidatorInterface::ERROR_INVALID_TYPE => 'Product Type is invalid or not supported', ValidatorInterface::ERROR_INVALID_CATEGORY => 'Category does not exists', ValidatorInterface::ERROR_VALUE_IS_REQUIRED => 'Please make sure attribute "%s" is not empty.', @@ -217,7 +217,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ValidatorInterface::ERROR_CHANGE_TYPE => 'Product type change is not allowed', ValidatorInterface::ERROR_DUPLICATE_SCOPE => 'Duplicate scope', ValidatorInterface::ERROR_DUPLICATE_SKU => 'Duplicate SKU', - ValidatorInterface::ERROR_CHANGE_ATTR_SET => 'Product template change is not allowed', + ValidatorInterface::ERROR_CHANGE_ATTR_SET => 'Attribute set change is not allowed', ValidatorInterface::ERROR_TYPE_UNSUPPORTED => 'Product type is not supported', ValidatorInterface::ERROR_ROW_IS_ORPHAN => 'Orphan rows that will be skipped due default row errors', ValidatorInterface::ERROR_INVALID_TIER_PRICE_QTY => 'Tier Price data price or quantity value is invalid', diff --git a/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php b/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php index 7ae7f318a2f9cf67bbfb05b1558209afc5142129..b65a601444c1b768b3f91382b494aee58dc02dbe 100644 --- a/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php +++ b/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php @@ -188,6 +188,7 @@ class Stock extends \Magento\Framework\Data\Form\Element\Select '{$inStockFieldId}': 'inventory_stock_availability' }; + var qtyDefaultValue = qty.val(); var disabler = function(event) { if (typeof(event) === 'undefined') { return; @@ -197,8 +198,13 @@ class Stock extends \Magento\Framework\Data\Form\Element\Select if (stockBeforeDisable.result !== false) { var manageStockValue = {$isNewProduct} ? (qty.val() === '' ? 0 : 1) - : parseInt(manageStockField.val()), - stockAssociations = $('#' + fieldsAssociations['{$inStockFieldId}']); + : parseInt(manageStockField.val()); + if ({$isNewProduct} && qtyDefaultValue !== null && qtyDefaultValue === qty.val()) { + manageStockValue = parseInt(manageStockField.val()); + } else { + qtyDefaultValue = null; + } + var stockAssociations = $('#' + fieldsAssociations['{$inStockFieldId}']); stockAvailabilityField.prop('disabled', !manageStockValue); stockAssociations.prop('disabled', !manageStockValue); if ($(event.currentTarget).attr('id') === qty.attr('id') && event.type != 'change') { diff --git a/app/code/Magento/CatalogInventory/Model/Config/Backend/AbstractValue.php b/app/code/Magento/CatalogInventory/Model/Config/Backend/AbstractValue.php index 5f38c7074b6c5819fe50b7e444fcec546be1e34d..a96bccea9eae7b25d4d36c1d4b724c225cdce447 100644 --- a/app/code/Magento/CatalogInventory/Model/Config/Backend/AbstractValue.php +++ b/app/code/Magento/CatalogInventory/Model/Config/Backend/AbstractValue.php @@ -25,6 +25,7 @@ abstract class AbstractValue extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\CatalogInventory\Api\StockIndexInterface $stockIndex * @param \Magento\CatalogInventory\Model\Indexer\Stock\Processor $stockIndexerProcessor * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -35,6 +36,7 @@ abstract class AbstractValue extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\CatalogInventory\Api\StockIndexInterface $stockIndex, \Magento\CatalogInventory\Model\Indexer\Stock\Processor $stockIndexerProcessor, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -43,6 +45,6 @@ abstract class AbstractValue extends \Magento\Framework\App\Config\Value ) { $this->_stockIndexerProcessor = $stockIndexerProcessor; $this->stockIndex = $stockIndex; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } } diff --git a/app/code/Magento/CatalogInventory/Model/Config/Backend/Backorders.php b/app/code/Magento/CatalogInventory/Model/Config/Backend/Backorders.php index d5a890c3d54a38f2a726fc2fa598424c55635f09..383a8b911d8a1b7d12b976d3e4502c0c6f0f01ae 100644 --- a/app/code/Magento/CatalogInventory/Model/Config/Backend/Backorders.php +++ b/app/code/Magento/CatalogInventory/Model/Config/Backend/Backorders.php @@ -28,6 +28,6 @@ class Backorders extends AbstractValue $this->stockIndex->rebuild(); $this->_stockIndexerProcessor->markIndexerAsInvalid(); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/CatalogInventory/Model/Config/Backend/Managestock.php b/app/code/Magento/CatalogInventory/Model/Config/Backend/Managestock.php index 4b377112acc79ce3314d624c2acca1a1ec1966d8..efbc166208a123151b6141cef4ee2990f3efcba3 100644 --- a/app/code/Magento/CatalogInventory/Model/Config/Backend/Managestock.php +++ b/app/code/Magento/CatalogInventory/Model/Config/Backend/Managestock.php @@ -23,6 +23,6 @@ class Managestock extends AbstractValue $this->stockIndex->rebuild(); $this->_stockIndexerProcessor->markIndexerAsInvalid(); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/CatalogInventory/Model/System/Config/Backend/Minsaleqty.php b/app/code/Magento/CatalogInventory/Model/System/Config/Backend/Minsaleqty.php index eddd3316cd8828993052fd175e05e8695f149f63..32e82b9d33f698bb2909e060095e9a0e7bb899b8 100644 --- a/app/code/Magento/CatalogInventory/Model/System/Config/Backend/Minsaleqty.php +++ b/app/code/Magento/CatalogInventory/Model/System/Config/Backend/Minsaleqty.php @@ -21,6 +21,7 @@ class Minsaleqty extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\CatalogInventory\Helper\Minsaleqty $catalogInventoryMinsaleqty * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -30,13 +31,14 @@ class Minsaleqty extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\CatalogInventory\Helper\Minsaleqty $catalogInventoryMinsaleqty, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_catalogInventoryMinsaleqty = $catalogInventoryMinsaleqty; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php index abe88aa2fccf4da8acfe004f452e9caccc5e6378..df2b1a38b58fbbad0ef47e279b2efda89ef3d6ef 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php @@ -16,7 +16,7 @@ class ApplyRules extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $errorMessage = __('We can\'t apply the rules.'); try { diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Chooser.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Chooser.php index 34d7481851249340c6d6572b05daa82c5101e65a..ac908bffe6d05bc2010800d32b9a7cd2f49fcaad 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Chooser.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Chooser.php @@ -11,7 +11,7 @@ class Chooser extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog /** * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('attribute') == 'sku') { $type = 'Magento\CatalogRule\Block\Adminhtml\Promo\Widget\Chooser\Sku'; diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php index 41cca27abd82f0a5d04904274b6987156771ead2..dd14365e464f3595d39853b89cc42d4a43aeb98a 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog /** * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); if ($id) { diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php index 97495f7d0d48fafceae85d8640e4ad125429e0ec..1f2f29390f7523434e9610af5879432a0387628f 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php @@ -11,7 +11,7 @@ class Edit extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog /** * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $model = $this->_objectManager->create('Magento\CatalogRule\Model\Rule'); diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php index fd6533a042c35fb88550397bdf88156ec2f2d603..9eb60fc13cdca8ff38c4c5354733504d6074381e 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog /** * @return void */ - public function execute() + public function executeInternal() { $dirtyRules = $this->_objectManager->create('Magento\CatalogRule\Model\Flag')->loadSelf(); if ($dirtyRules->getState()) { diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewAction.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewAction.php index fe944cf16f49c65b831c2471f12f6c8ff04bf439..f3a42f0c95566d235661ad10b102702f8ab4ddd6 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewAction.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewAction.php @@ -11,7 +11,7 @@ class NewAction extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog /** * @return void */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewActionHtml.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewActionHtml.php index 2a1d8aaf878d02f4c8f2535072f77d0ed855f4e3..a588a5e00ada01beb141ac26dfa1ffb13e3cb94f 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewActionHtml.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewActionHtml.php @@ -13,7 +13,7 @@ class NewActionHtml extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Cata /** * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $typeArr = explode('|', str_replace('-', '/', $this->getRequest()->getParam('type'))); diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewConditionHtml.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewConditionHtml.php index 977806d176b76de023ea2b121daf52ed18e857a8..5a58180e4486dbde8000cd84730b41912fb2f6c0 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewConditionHtml.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewConditionHtml.php @@ -13,7 +13,7 @@ class NewConditionHtml extends \Magento\CatalogRule\Controller\Adminhtml\Promo\C /** * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $typeArr = explode('|', str_replace('-', '/', $this->getRequest()->getParam('type'))); diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php index 16415977b5582cc796ea62f0a58c0d3b2657c73f..2ac65d736b44c89f0cf72ac442d8b736a9d6e5c2 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php @@ -14,7 +14,7 @@ class Save extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getPostValue()) { try { diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Index.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Index.php index 646e3cf6c377e667a433df697c46507c52aeb3f6..4b8f29d14440d0ff2b93a868380689ed415fe86e 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Index.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Index.php @@ -19,7 +19,7 @@ class Index extends \Magento\Backend\App\Action /** * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_CatalogRule::promo'); diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/CategoriesJson.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/CategoriesJson.php index 592d6f0bbc280326d43aa920f99fee2b8625486d..ae1c964761ff32297efcdc7bde66684ed38f696c 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/CategoriesJson.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/CategoriesJson.php @@ -68,7 +68,7 @@ class CategoriesJson extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Wid * * @return void */ - public function execute() + public function executeInternal() { $categoryId = (int)$this->getRequest()->getPost('id'); if ($categoryId) { diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/Chooser.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/Chooser.php index ea081c9c436568f828388c70c164b354e97a469c..7c764a2452ce1eff00d95351f261dbce96f717ce 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/Chooser.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Widget/Chooser.php @@ -13,7 +13,7 @@ class Chooser extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Widget * * @return void */ - public function execute() + public function executeInternal() { $request = $this->getRequest(); diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php index 66f3affdcea910662767f599d9bf3767194a7ba0..dcd36cfaf3086a4b739ada152ab23ee06bf8839d 100644 --- a/app/code/Magento/CatalogRule/Model/Rule.php +++ b/app/code/Magento/CatalogRule/Model/Rule.php @@ -342,6 +342,10 @@ class Rule extends \Magento\Rule\Model\AbstractModel $map = []; $websites = $this->_storeManager->getWebsites(true); foreach ($websites as $website) { + // Continue if website has no store to be able to create catalog rule for website without store + if ($website->getDefaultStore() === null) { + continue; + } $map[$website->getId()] = $website->getDefaultStore()->getId(); } return $map; diff --git a/app/code/Magento/CatalogSearch/Controller/Advanced/Index.php b/app/code/Magento/CatalogSearch/Controller/Advanced/Index.php index dfc0013e6e23f17c6b97d655a03859011d25eeae..961a4cd73d76d341756916ad7129d9e8c4d10321 100644 --- a/app/code/Magento/CatalogSearch/Controller/Advanced/Index.php +++ b/app/code/Magento/CatalogSearch/Controller/Advanced/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\Framework\App\Action\Action /** * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_view->renderLayout(); diff --git a/app/code/Magento/CatalogSearch/Controller/Advanced/Result.php b/app/code/Magento/CatalogSearch/Controller/Advanced/Result.php index d98ff86f779b529fe3f65207f3aabd7bf6c560b8..e5c71f294f640ce85036dfbb4c3f702e465f3c8b 100644 --- a/app/code/Magento/CatalogSearch/Controller/Advanced/Result.php +++ b/app/code/Magento/CatalogSearch/Controller/Advanced/Result.php @@ -47,7 +47,7 @@ class Result extends \Magento\Framework\App\Action\Action /** * @return void */ - public function execute() + public function executeInternal() { try { $this->_catalogSearchAdvanced->addFilters($this->getRequest()->getQueryValue()); diff --git a/app/code/Magento/CatalogSearch/Controller/Result/Index.php b/app/code/Magento/CatalogSearch/Controller/Result/Index.php index 4a682161c6d6bc8edc3d0ed80a7b45e00f0b1a5c..92221b02af48d293b782bde2d845c7973e2f861a 100644 --- a/app/code/Magento/CatalogSearch/Controller/Result/Index.php +++ b/app/code/Magento/CatalogSearch/Controller/Result/Index.php @@ -65,7 +65,7 @@ class Index extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $this->layerResolver->create(Resolver::CATALOG_LAYER_SEARCH); /* @var $query \Magento\Search\Model\Query */ diff --git a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Dynamic/DataProvider.php b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Dynamic/DataProvider.php index b486feeafb601bd65ce186d80dc76de39bc63b97..cedd874dbdee0566f38dbdbae7fc9b5a589a1205 100644 --- a/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Dynamic/DataProvider.php +++ b/app/code/Magento/CatalogSearch/Model/Adapter/Mysql/Dynamic/DataProvider.php @@ -135,7 +135,10 @@ class DataProvider implements DataProviderInterface $column = $select->getPart(Select::COLUMNS)[0]; $select->reset(Select::COLUMNS); $rangeExpr = new \Zend_Db_Expr( - $this->connection->quoteInto('(FLOOR(' . $column[1] . ' / ? ) + 1)', $range) + $this->connection->getIfNullSql( + $this->connection->quoteInto('FLOOR(' . $column[1] . ' / ? ) + 1', $range), + 1 + ) ); $select diff --git a/app/code/Magento/CatalogSearch/Model/Adminhtml/System/Config/Backend/Engine.php b/app/code/Magento/CatalogSearch/Model/Adminhtml/System/Config/Backend/Engine.php index 4e25ed12fc3241f10748f3eb3f5c82cb0bb63490..7860a0e3e15fd995c4fd7459706e3790679f7a13 100644 --- a/app/code/Magento/CatalogSearch/Model/Adminhtml/System/Config/Backend/Engine.php +++ b/app/code/Magento/CatalogSearch/Model/Adminhtml/System/Config/Backend/Engine.php @@ -17,6 +17,7 @@ class Engine extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -26,13 +27,14 @@ class Engine extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->indexerRegistry = $indexerRegistry; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/CatalogSearch/Model/Advanced.php b/app/code/Magento/CatalogSearch/Model/Advanced.php index 277e092dec29124a083a8507dfe988634d3156f0..ec96c0deb3aa2859953909864bc859956312114d 100644 --- a/app/code/Magento/CatalogSearch/Model/Advanced.php +++ b/app/code/Magento/CatalogSearch/Model/Advanced.php @@ -166,7 +166,6 @@ class Advanced extends \Magento\Framework\Model\AbstractModel public function addFilters($values) { $attributes = $this->getAttributes(); - $hasConditions = false; $allConditions = []; foreach ($attributes as $attribute) { @@ -225,7 +224,7 @@ class Advanced extends \Magento\Framework\Model\AbstractModel if ($allConditions) { $this->_registry->register('advanced_search_conditions', $allConditions); $this->getProductCollection()->addFieldsToFilter($allConditions); - } elseif (!$hasConditions) { + } else { throw new LocalizedException(__('Please specify at least one search term.')); } diff --git a/app/code/Magento/CatalogSearch/Model/Advanced/Request/Builder.php b/app/code/Magento/CatalogSearch/Model/Advanced/Request/Builder.php index 5e0eb83f4ebabdfd6b28b4aadbf063e39b9ae51a..138916f0767ad878fbb0736ea2b5f289a19cb7c7 100644 --- a/app/code/Magento/CatalogSearch/Model/Advanced/Request/Builder.php +++ b/app/code/Magento/CatalogSearch/Model/Advanced/Request/Builder.php @@ -27,7 +27,7 @@ class Builder extends RequestBuilder } elseif (!is_array($attributeValue)) { $this->bind($attributeCode, $attributeValue); } elseif (isset($attributeValue['like'])) { - $this->bind($attributeCode, trim($attributeValue['like'], '%')); + $this->bind($attributeCode, $attributeValue['like']); } elseif (isset($attributeValue['in'])) { $this->bind($attributeCode, $attributeValue['in']); } elseif (isset($attributeValue['in_set'])) { diff --git a/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced.php b/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced.php index 4dafffbf8dfabd33dece9493b9e6d99eef0f0384..8f4b8de898f2ecadb3c0eb09cde770b60b0da2ae 100644 --- a/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced.php +++ b/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced.php @@ -81,7 +81,7 @@ class Advanced extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb } else { if (strlen($value) > 0) { if (in_array($attribute->getBackendType(), ['varchar', 'text', 'static'])) { - $condition = ['like' => '%' . $value . '%']; // text search + $condition = ['like' => $value]; // text search } else { $condition = $value; } diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Controller/Advanced/ResultTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Controller/Advanced/ResultTest.php index 529b92bf4364a0ef8f8b8ec01c6e7e28f9fcf874..f90be4e218ff88e2e4bd3218b8064aa9a912a1e3 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Controller/Advanced/ResultTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Controller/Advanced/ResultTest.php @@ -50,6 +50,6 @@ class ResultTest extends \PHPUnit_Framework_TestCase 'Magento\CatalogSearch\Controller\Advanced\Result', ['context' => $context, 'catalogSearchAdvanced' => $catalogSearchAdvanced] ); - $instance->execute(); + $instance->executeInternal(); } } diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Advanced/Request/BuilderTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Advanced/Request/BuilderTest.php index 2b7788e245be3bd6aaafb3aa145b4cd9f55150cb..0c3377d2b13c650e9bc4ce0cb73b7ec246ef1642 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Advanced/Request/BuilderTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Advanced/Request/BuilderTest.php @@ -182,7 +182,7 @@ class BuilderTest extends \PHPUnit_Framework_TestCase ]; $this->requestBuilder->bindRequestValue('from_to', ['from' => 10, 'to' => 20]); $this->requestBuilder->bindRequestValue('not_array', 130); - $this->requestBuilder->bindRequestValue('like', ['like' => '%search_text%']); + $this->requestBuilder->bindRequestValue('like', ['like' => 'search_text']); $this->requestBuilder->bindRequestValue('in', ['in' => 23]); $this->requestBuilder->bindRequestValue('in_set', ['in_set' => [12, 23, 34, 45]]); $this->requestBuilder->setRequestName($requestName); diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Indexer/Fulltext/Plugin/ProductTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Indexer/Fulltext/Plugin/ProductTest.php index 49f37b71f1a10762efbad1272b9175b920c1edc2..cb6c83ea3dc45c276abae65dab8d6284ff2316bb 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Indexer/Fulltext/Plugin/ProductTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Indexer/Fulltext/Plugin/ProductTest.php @@ -16,10 +16,20 @@ class ProductTest extends \PHPUnit_Framework_TestCase protected $indexerMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Product + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\ResourceModel\Product */ protected $subjectMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Product + */ + protected $productMock; + + /** + * @var \Closure + */ + protected $proceed; + /** * @var \Magento\Framework\Indexer\IndexerRegistry|\PHPUnit_Framework_MockObject_MockObject */ @@ -32,8 +42,8 @@ class ProductTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->subjectMock = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false); - + $this->productMock = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false); + $this->subjectMock = $this->getMock('Magento\Catalog\Model\ResourceModel\Product', [], [], '', false); $this->indexerMock = $this->getMockForAbstractClass( 'Magento\Framework\Indexer\IndexerInterface', [], @@ -43,7 +53,6 @@ class ProductTest extends \PHPUnit_Framework_TestCase true, ['getId', 'getState', '__wakeup'] ); - $this->indexerRegistryMock = $this->getMock( 'Magento\Framework\Indexer\IndexerRegistry', ['get'], @@ -52,6 +61,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase false ); + $this->proceed = function () { + return $this->subjectMock; + }; + $this->model = new Product($this->indexerRegistryMock); } @@ -61,9 +74,12 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->indexerMock->expects($this->once())->method('reindexRow')->with(1); $this->prepareIndexer(); - $this->subjectMock->expects($this->once())->method('getId')->will($this->returnValue(1)); + $this->productMock->expects($this->once())->method('getId')->will($this->returnValue(1)); - $this->assertEquals($this->subjectMock, $this->model->afterSave($this->subjectMock)); + $this->assertEquals( + $this->subjectMock, + $this->model->aroundSave($this->subjectMock, $this->proceed, $this->productMock) + ); } public function testAfterSaveScheduled() @@ -72,9 +88,12 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->indexerMock->expects($this->never())->method('reindexRow'); $this->prepareIndexer(); - $this->subjectMock->expects($this->once())->method('getId')->will($this->returnValue(1)); + $this->productMock->expects($this->once())->method('getId')->will($this->returnValue(1)); - $this->assertEquals($this->subjectMock, $this->model->afterSave($this->subjectMock)); + $this->assertEquals( + $this->subjectMock, + $this->model->aroundSave($this->subjectMock, $this->proceed, $this->productMock) + ); } public function testAfterDeleteNonScheduled() @@ -83,9 +102,12 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->indexerMock->expects($this->once())->method('reindexRow')->with(1); $this->prepareIndexer(); - $this->subjectMock->expects($this->once())->method('getId')->will($this->returnValue(1)); + $this->productMock->expects($this->once())->method('getId')->will($this->returnValue(1)); - $this->assertEquals($this->subjectMock, $this->model->afterDelete($this->subjectMock)); + $this->assertEquals( + $this->subjectMock, + $this->model->aroundDelete($this->subjectMock, $this->proceed, $this->productMock) + ); } public function testAfterDeleteScheduled() @@ -94,9 +116,12 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->indexerMock->expects($this->never())->method('reindexRow'); $this->prepareIndexer(); - $this->subjectMock->expects($this->once())->method('getId')->will($this->returnValue(1)); + $this->productMock->expects($this->once())->method('getId')->will($this->returnValue(1)); - $this->assertEquals($this->subjectMock, $this->model->afterDelete($this->subjectMock)); + $this->assertEquals( + $this->subjectMock, + $this->model->aroundDelete($this->subjectMock, $this->proceed, $this->productMock) + ); } protected function prepareIndexer() diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/AdvancedTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/AdvancedTest.php index 94bc0686cd20a4d91e2fa410cb2194e6219b40f7..93c29b5078720b839508d290ccc9b74b3ff99378 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/AdvancedTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/AdvancedTest.php @@ -54,7 +54,7 @@ class AdvancedTest extends PHPUnit_Framework_TestCase { return [ ['string', 'string', 'string'], - ['varchar', 'string', ['like' => '%string%']], + ['varchar', 'string', ['like' => 'string']], ['varchar', ['test'], ['in_set' => ['test']]], ['select', ['test'], ['in' => ['test']]], ['range', ['from' => 1], ['from' => 1]], diff --git a/app/code/Magento/CatalogSearch/etc/adminhtml/system.xml b/app/code/Magento/CatalogSearch/etc/adminhtml/system.xml index 64c40be45f2dd9e0c9d094663c10c951635d8c30..cef7804d7c308eff05bae30791939332188a213f 100644 --- a/app/code/Magento/CatalogSearch/etc/adminhtml/system.xml +++ b/app/code/Magento/CatalogSearch/etc/adminhtml/system.xml @@ -27,11 +27,6 @@ <label>Maximum Query Length</label> <validate>validate-digits</validate> </field> - <field id="use_layered_navigation_count" translate="label comment" type="text" sortOrder="25" showInDefault="1" showInWebsite="1" showInStore="1"> - <label>Apply Layered Navigation if Search Results are Less Than</label> - <validate>validate-digits</validate> - <comment>Enter "0" to enable layered navigation for any number of results.</comment> - </field> </group> </section> </system> diff --git a/app/code/Magento/CatalogSearch/etc/config.xml b/app/code/Magento/CatalogSearch/etc/config.xml index 8ff9c9f527dad85252d1b01a6468c5fc889b4af5..c4183bb54245dc8e98ee8a315c688ed4d4247066 100644 --- a/app/code/Magento/CatalogSearch/etc/config.xml +++ b/app/code/Magento/CatalogSearch/etc/config.xml @@ -15,7 +15,6 @@ <engine>mysql</engine> <min_query_length>1</min_query_length> <max_query_length>128</max_query_length> - <use_layered_navigation_count>0</use_layered_navigation_count> </search> </catalog> </default> diff --git a/app/code/Magento/CatalogSearch/etc/adminhtml/events.xml b/app/code/Magento/CatalogSearch/etc/events.xml similarity index 100% rename from app/code/Magento/CatalogSearch/etc/adminhtml/events.xml rename to app/code/Magento/CatalogSearch/etc/events.xml diff --git a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlPathGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlPathGenerator.php index d978d726a58c7c889309cd4d0d21402124e2eee7..69b955cf78a3927f3da912ca61f34c1c83f82ecf 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlPathGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/CategoryUrlPathGenerator.php @@ -73,7 +73,9 @@ class CategoryUrlPathGenerator return $category->getUrlPath(); } if ($this->isNeedToGenerateUrlPathForParent($category)) { - $parentPath = $this->getUrlPath($this->categoryRepository->get($category->getParentId())); + $parentPath = $this->getUrlPath( + $this->categoryRepository->get($category->getParentId(), $category->getStoreId()) + ); $path = $parentPath === '' ? $path : $parentPath . '/' . $path; } return $path; @@ -141,7 +143,7 @@ class CategoryUrlPathGenerator * @param \Magento\Catalog\Model\Category $category * @return string */ - public function generateUrlKey($category) + public function getUrlKey($category) { $urlKey = $category->getUrlKey(); return $category->formatUrlKey($urlKey === '' || $urlKey === null ? $category->getName() : $urlKey); diff --git a/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlPathGenerator.php b/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlPathGenerator.php index 90e65b9094f5e01163510cbfea5e8db9ea8cd2f1..7656610422d4a4084b6ff56d3cbe23224d9aed3e 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlPathGenerator.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/ProductUrlPathGenerator.php @@ -114,7 +114,7 @@ class ProductUrlPathGenerator * @param \Magento\Catalog\Model\Product $product * @return string */ - public function generateUrlKey($product) + public function getUrlKey($product) { return $product->getUrlKey() === false ? false : $this->prepareProductUrlKey($product); } diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php index e72b5df170485db13ce1e9d931f0bb48552d4163..1a903432cc1eee43fbf22919b81c1a004ac20b97 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php @@ -7,9 +7,11 @@ namespace Magento\CatalogUrlRewrite\Observer; use Magento\Catalog\Model\Category; use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator; +use Magento\CatalogUrlRewrite\Service\V1\StoreViewService; use Magento\Framework\Event\Observer; use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider; use Magento\Framework\Event\ObserverInterface; +use Magento\Store\Model\Store; class CategoryUrlPathAutogeneratorObserver implements ObserverInterface { @@ -19,16 +21,22 @@ class CategoryUrlPathAutogeneratorObserver implements ObserverInterface /** @var \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider */ protected $childrenCategoriesProvider; + /** @var StoreViewService */ + protected $storeViewService; + /** * @param CategoryUrlPathGenerator $categoryUrlPathGenerator * @param ChildrenCategoriesProvider $childrenCategoriesProvider + * @param \Magento\CatalogUrlRewrite\Service\V1\StoreViewService $storeViewService */ public function __construct( CategoryUrlPathGenerator $categoryUrlPathGenerator, - ChildrenCategoriesProvider $childrenCategoriesProvider + ChildrenCategoriesProvider $childrenCategoriesProvider, + StoreViewService $storeViewService ) { $this->categoryUrlPathGenerator = $categoryUrlPathGenerator; $this->childrenCategoriesProvider = $childrenCategoriesProvider; + $this->storeViewService = $storeViewService; } /** @@ -40,7 +48,7 @@ class CategoryUrlPathAutogeneratorObserver implements ObserverInterface /** @var Category $category */ $category = $observer->getEvent()->getCategory(); if ($category->getUrlKey() !== false) { - $category->setUrlKey($this->categoryUrlPathGenerator->generateUrlKey($category)) + $category->setUrlKey($this->categoryUrlPathGenerator->getUrlKey($category)) ->setUrlPath($this->categoryUrlPathGenerator->getUrlPath($category)); if (!$category->isObjectNew()) { $category->getResource()->saveAttribute($category, 'url_path'); @@ -57,10 +65,48 @@ class CategoryUrlPathAutogeneratorObserver implements ObserverInterface */ protected function updateUrlPathForChildren(Category $category) { - foreach ($this->childrenCategoriesProvider->getChildren($category, true) as $childCategory) { - $childCategory->unsUrlPath(); - $childCategory->setUrlPath($this->categoryUrlPathGenerator->getUrlPath($childCategory)); - $childCategory->getResource()->saveAttribute($childCategory, 'url_path'); + $children = $this->childrenCategoriesProvider->getChildren($category, true); + + if ($this->isGlobalScope($category->getStoreId())) { + foreach ($children as $child) { + foreach ($category->getStoreIds() as $storeId) { + if ($this->storeViewService->doesEntityHaveOverriddenUrlPathForStore( + $storeId, + $child->getId(), + Category::ENTITY + )) { + $child->setStoreId($storeId); + $this->updateUrlPathForCategory($child); + } + } + } + } else { + foreach ($children as $child) { + $child->setStoreId($category->getStoreId()); + $this->updateUrlPathForCategory($child); + } } } + + /** + * Check is global scope + * + * @param int|null $storeId + * @return bool + */ + protected function isGlobalScope($storeId) + { + return null === $storeId || $storeId == Store::DEFAULT_STORE_ID; + } + + /** + * @param Category $category + * @return void + */ + protected function updateUrlPathForCategory(Category $category) + { + $category->unsUrlPath(); + $category->setUrlPath($this->categoryUrlPathGenerator->getUrlPath($category)); + $category->getResource()->saveAttribute($category, 'url_path'); + } } diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/ProductToWebsiteChangeObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/ProductToWebsiteChangeObserver.php new file mode 100644 index 0000000000000000000000000000000000000000..cd094719838136b954de00b78e411e0ee7148461 --- /dev/null +++ b/app/code/Magento/CatalogUrlRewrite/Observer/ProductToWebsiteChangeObserver.php @@ -0,0 +1,78 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogUrlRewrite\Observer; + +use Magento\Catalog\Api\ProductRepositoryInterface; +use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator; +use Magento\Framework\App\RequestInterface; +use Magento\Framework\Event\ObserverInterface; +use Magento\Store\Model\Store; +use Magento\UrlRewrite\Model\UrlPersistInterface; +use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; + +class ProductToWebsiteChangeObserver implements ObserverInterface +{ + /** + * @var ProductUrlRewriteGenerator + */ + protected $productUrlRewriteGenerator; + + /** + * @var UrlPersistInterface + */ + protected $urlPersist; + + /** + * @var ProductRepositoryInterface + */ + protected $productRepository; + + /** + * @var RequestInterface + */ + protected $request; + + /** + * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator + * @param UrlPersistInterface $urlPersist + * @param ProductRepositoryInterface $productRepository + * @param RequestInterface $request + */ + public function __construct( + ProductUrlRewriteGenerator $productUrlRewriteGenerator, + UrlPersistInterface $urlPersist, + ProductRepositoryInterface $productRepository, + RequestInterface $request + ) { + $this->productUrlRewriteGenerator = $productUrlRewriteGenerator; + $this->urlPersist = $urlPersist; + $this->productRepository = $productRepository; + $this->request = $request; + } + + /** + * Generate urls for UrlRewrite and save it in storage + * + * @param \Magento\Framework\Event\Observer $observer + * @return void + */ + public function execute(\Magento\Framework\Event\Observer $observer) + { + foreach ($observer->getEvent()->getProducts() as $productId) { + $product = $this->productRepository->getById( + $productId, + false, + $this->request->getParam('store_id', Store::DEFAULT_STORE_ID) + ); + + $this->urlPersist->deleteByData([ + UrlRewrite::ENTITY_ID => $product->getId(), + UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, + ]); + $this->urlPersist->replace($this->productUrlRewriteGenerator->generate($product)); + } + } +} diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/ProductUrlKeyAutogeneratorObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/ProductUrlKeyAutogeneratorObserver.php index 5a3cd8bb47a0a04cf66aa595990b34486719c88d..525cc1568a77c2688aabc38a45092d9d9e0a18e5 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/ProductUrlKeyAutogeneratorObserver.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/ProductUrlKeyAutogeneratorObserver.php @@ -31,6 +31,6 @@ class ProductUrlKeyAutogeneratorObserver implements ObserverInterface { /** @var Product $product */ $product = $observer->getEvent()->getProduct(); - $product->setUrlKey($this->productUrlPathGenerator->generateUrlKey($product)); + $product->setUrlKey($this->productUrlPathGenerator->getUrlKey($product)); } } diff --git a/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php b/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php index 958e882c46013b2153bb3a782c779fdd960acfb9..71e33a74111018446eec2532f4654d90e6d0b98a 100644 --- a/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php +++ b/app/code/Magento/CatalogUrlRewrite/Service/V1/StoreViewService.php @@ -46,14 +46,43 @@ class StoreViewService */ public function doesEntityHaveOverriddenUrlKeyForStore($storeId, $entityId, $entityType) { - $attribute = $this->eavConfig->getAttribute($entityType, 'url_key'); + return $this->doesEntityHaveOverriddenUrlAttributeForStore($storeId, $entityId, $entityType, 'url_key'); + } + + /** + * Check that entity has overridden url path for specific store + * + * @param int $storeId + * @param int $entityId + * @param string $entityType + * @throws \InvalidArgumentException + * @return bool + */ + public function doesEntityHaveOverriddenUrlPathForStore($storeId, $entityId, $entityType) + { + return $this->doesEntityHaveOverriddenUrlAttributeForStore($storeId, $entityId, $entityType, 'url_path'); + } + + /** + * Check that entity has overridden url attribute for specific store + * + * @param int $storeId + * @param int $entityId + * @param string $entityType + * @param mixed $attributeName + * @throws \InvalidArgumentException + * @return bool + */ + protected function doesEntityHaveOverriddenUrlAttributeForStore($storeId, $entityId, $entityType, $attributeName) + { + $attribute = $this->eavConfig->getAttribute($entityType, $attributeName); if (!$attribute) { throw new \InvalidArgumentException(sprintf('Cannot retrieve attribute for entity type "%s"', $entityType)); } $select = $this->connection->select() - ->from($attribute->getBackendTable(), 'store_id') - ->where('attribute_id = ?', $attribute->getId()) - ->where('entity_id = ?', $entityId); + ->from($attribute->getBackendTable(), 'store_id') + ->where('attribute_id = ?', $attribute->getId()) + ->where('entity_id = ?', $entityId); return in_array($storeId, $this->connection->fetchCol($select)); } diff --git a/app/code/Magento/CatalogUrlRewrite/Setup/InstallData.php b/app/code/Magento/CatalogUrlRewrite/Setup/InstallData.php index 56ae25a6bbbb53cf087b73f999dbbae7e0cf9986..46a0f9bea798530b15ecf850bc506afa5b5f3451 100644 --- a/app/code/Magento/CatalogUrlRewrite/Setup/InstallData.php +++ b/app/code/Magento/CatalogUrlRewrite/Setup/InstallData.php @@ -50,7 +50,7 @@ class InstallData implements InstallDataInterface 'input' => 'text', 'required' => false, 'sort_order' => 3, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'General Information', ] ); @@ -62,7 +62,7 @@ class InstallData implements InstallDataInterface 'type' => 'varchar', 'required' => false, 'sort_order' => 17, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, 'group' => 'General Information', ] @@ -77,7 +77,7 @@ class InstallData implements InstallDataInterface 'input' => 'text', 'required' => false, 'sort_order' => 10, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'used_in_product_listing' => true, 'group' => 'Search Engine Optimization', 'is_used_in_grid' => true, @@ -93,7 +93,7 @@ class InstallData implements InstallDataInterface 'type' => 'varchar', 'required' => false, 'sort_order' => 11, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, ] ); diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php index 94dc7f9c33ae26d258eb85148b783efe31941dbf..41300634caaa45df604eda79b1bc075aceb3463b 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlPathGeneratorTest.php @@ -235,7 +235,7 @@ class CategoryUrlPathGeneratorTest extends \PHPUnit_Framework_TestCase /** * @return array */ - public function generateUrlKeyDataProvider() + public function getUrlKeyDataProvider() { return [ ['url-key', null, 'url-key'], @@ -244,17 +244,17 @@ class CategoryUrlPathGeneratorTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider generateUrlKeyDataProvider - * @param string $urlKey - * @param string $name + * @dataProvider getUrlKeyDataProvider + * @param string|null|bool $urlKey + * @param string|null|bool $name * @param string $result */ - public function testGenerateUrlKey($urlKey, $name, $result) + public function testGetUrlKey($urlKey, $name, $result) { $this->category->expects($this->once())->method('getUrlKey')->will($this->returnValue($urlKey)); $this->category->expects($this->any())->method('getName')->will($this->returnValue($name)); $this->category->expects($this->once())->method('formatUrlKey')->will($this->returnArgument(0)); - $this->assertEquals($result, $this->categoryUrlPathGenerator->generateUrlKey($this->category)); + $this->assertEquals($result, $this->categoryUrlPathGenerator->getUrlKey($this->category)); } } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlPathGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlPathGeneratorTest.php index 7b733303bf4d4d16803cd889754af67408136a3d..fe4895c721bb2cda4fc1058ffa58ed5f01805193 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlPathGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductUrlPathGeneratorTest.php @@ -85,11 +85,11 @@ class ProductUrlPathGeneratorTest extends \PHPUnit_Framework_TestCase /** * @dataProvider getUrlPathDataProvider - * @param $urlKey - * @param $productName - * @param $result + * @param string|null|bool $urlKey + * @param string|null|bool $productName + * @param string $result */ - public function testGenerateUrlPath($urlKey, $productName, $result) + public function testGetUrlPath($urlKey, $productName, $result) { $this->product->expects($this->once())->method('getData')->with('url_path') ->will($this->returnValue(null)); @@ -101,19 +101,21 @@ class ProductUrlPathGeneratorTest extends \PHPUnit_Framework_TestCase } /** - * @param $productUrlKey - * @param $expectedUrlKey - * - * @dataProvider generateUrlKeyDataProvider + * @param string|bool $productUrlKey + * @param string|bool $expectedUrlKey + * @dataProvider getUrlKeyDataProvider */ - public function testGenerateUrlKey($productUrlKey, $expectedUrlKey) + public function testGetUrlKey($productUrlKey, $expectedUrlKey) { $this->product->expects($this->any())->method('getUrlKey')->will($this->returnValue($productUrlKey)); $this->product->expects($this->any())->method('formatUrlKey')->will($this->returnValue($productUrlKey)); - $this->assertEquals($expectedUrlKey, $this->productUrlPathGenerator->generateUrlKey($this->product)); + $this->assertEquals($expectedUrlKey, $this->productUrlPathGenerator->getUrlKey($this->product)); } - public function generateUrlKeyDataProvider() + /** + * @return array + */ + public function getUrlKeyDataProvider() { return [ 'URL Key use default' => [false, false], @@ -121,17 +123,10 @@ class ProductUrlPathGeneratorTest extends \PHPUnit_Framework_TestCase ]; } - public function testGetUrlPath() - { - $this->product->expects($this->once())->method('getData')->with('url_path') - ->will($this->returnValue('url-path')); - $this->product->expects($this->never())->method('getUrlKey'); - - $this->assertEquals('url-path', $this->productUrlPathGenerator->getUrlPath($this->product, null)); - } - /** - * + * @param string|null|bool $storedUrlKey + * @param string|null|bool $productName + * @param string $expectedUrlKey * @dataProvider getUrlPathDefaultUrlKeyDataProvider */ public function testGetUrlPathDefaultUrlKey($storedUrlKey, $productName, $expectedUrlKey) @@ -144,13 +139,15 @@ class ProductUrlPathGeneratorTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedUrlKey, $this->productUrlPathGenerator->getUrlPath($this->product, null)); } + /** + * @return array + */ public function getUrlPathDefaultUrlKeyDataProvider() { return [ ['default-store-view-url-key', null, 'default-store-view-url-key'], [false, 'default-store-view-product-name', 'default-store-view-product-name'] ]; - } public function testGetUrlPathWithCategory() diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/CategoryUrlPathAutogeneratorObserverTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/CategoryUrlPathAutogeneratorObserverTest.php index 8088fcf653a18e0699e7533aeb54097ceedc9165..e400fe924c68639c0cd3d9c35fc904b56852bccd 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/CategoryUrlPathAutogeneratorObserverTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/CategoryUrlPathAutogeneratorObserverTest.php @@ -24,6 +24,16 @@ class CategoryUrlPathAutogeneratorObserverTest extends \PHPUnit_Framework_TestCa /** @var \PHPUnit_Framework_MockObject_MockObject */ protected $category; + /** + * @var \Magento\CatalogUrlRewrite\Service\V1\StoreViewService|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeViewService; + + /** + * @var \Magento\Catalog\Model\ResourceModel\Category|\PHPUnit_Framework_MockObject_MockObject + */ + protected $categoryResource; + protected function setUp() { $this->observer = $this->getMock( @@ -33,13 +43,15 @@ class CategoryUrlPathAutogeneratorObserverTest extends \PHPUnit_Framework_TestCa '', false ); + $this->categoryResource = $this->getMock('Magento\Catalog\Model\ResourceModel\Category', [], [], '', false); $this->category = $this->getMock( 'Magento\Catalog\Model\Category', - ['setUrlKey', 'setUrlPath', 'dataHasChangedFor', 'isObjectNew', 'getResource', 'getUrlKey'], + ['setUrlKey', 'setUrlPath', 'dataHasChangedFor', 'isObjectNew', 'getResource', 'getUrlKey', 'getStoreId'], [], '', false ); + $this->category->expects($this->any())->method('getResource')->willReturn($this->categoryResource); $this->observer->expects($this->any())->method('getEvent')->willReturnSelf(); $this->observer->expects($this->any())->method('getCategory')->willReturn($this->category); $this->categoryUrlPathGenerator = $this->getMock( @@ -53,11 +65,20 @@ class CategoryUrlPathAutogeneratorObserverTest extends \PHPUnit_Framework_TestCa 'Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider' ); + $this->storeViewService = $this->getMock( + 'Magento\CatalogUrlRewrite\Service\V1\StoreViewService', + [], + [], + '', + false + ); + $this->categoryUrlPathAutogeneratorObserver = (new ObjectManagerHelper($this))->getObject( 'Magento\CatalogUrlRewrite\Observer\CategoryUrlPathAutogeneratorObserver', [ 'categoryUrlPathGenerator' => $this->categoryUrlPathGenerator, - 'childrenCategoriesProvider' => $this->childrenCategoriesProvider + 'childrenCategoriesProvider' => $this->childrenCategoriesProvider, + 'storeViewService' => $this->storeViewService, ] ); } @@ -65,7 +86,7 @@ class CategoryUrlPathAutogeneratorObserverTest extends \PHPUnit_Framework_TestCa public function testSetCategoryUrlAndCategoryPath() { $this->category->expects($this->once())->method('getUrlKey')->willReturn('category'); - $this->categoryUrlPathGenerator->expects($this->once())->method('generateUrlKey')->willReturn('urk_key'); + $this->categoryUrlPathGenerator->expects($this->once())->method('getUrlKey')->willReturn('urk_key'); $this->category->expects($this->once())->method('setUrlKey')->with('urk_key')->willReturnSelf(); $this->categoryUrlPathGenerator->expects($this->once())->method('getUrlPath')->willReturn('url_path'); $this->category->expects($this->once())->method('setUrlPath')->with('url_path')->willReturnSelf(); @@ -74,7 +95,7 @@ class CategoryUrlPathAutogeneratorObserverTest extends \PHPUnit_Framework_TestCa $this->categoryUrlPathAutogeneratorObserver->execute($this->observer); } - public function testExecuteWithoutGeneration() + public function testExecuteWithoutUrlKeyAndUrlPathUpdating() { $this->category->expects($this->once())->method('getUrlKey')->willReturn(false); $this->category->expects($this->never())->method('setUrlKey'); @@ -82,30 +103,103 @@ class CategoryUrlPathAutogeneratorObserverTest extends \PHPUnit_Framework_TestCa $this->categoryUrlPathAutogeneratorObserver->execute($this->observer); } - public function testUpdateUrlPathForChildren() + public function testUrlKeyAndUrlPathUpdating() { - $this->category->expects($this->once())->method('getUrlKey')->willReturn('category'); - $this->category->expects($this->once())->method('setUrlKey')->willReturnSelf(); - $this->category->expects($this->once())->method('setUrlPath')->willReturnSelf(); + $this->categoryUrlPathGenerator->expects($this->once())->method('getUrlKey')->with($this->category) + ->willReturn('url_key'); + $this->categoryUrlPathGenerator->expects($this->once())->method('getUrlPath')->with($this->category) + ->willReturn('url_path'); + + $this->category->expects($this->once())->method('getUrlKey')->willReturn('not_formatted_url_key'); + $this->category->expects($this->once())->method('setUrlKey')->with('url_key')->willReturnSelf(); + $this->category->expects($this->once())->method('setUrlPath')->with('url_path')->willReturnSelf(); + // break code execution + $this->category->expects($this->once())->method('isObjectNew')->willReturn(true); + + $this->categoryUrlPathAutogeneratorObserver->execute($this->observer); + } + + public function testUrlPathAttributeNoUpdatingIfCategoryIsNew() + { + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlKey')->willReturn('url_key'); + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlPath')->willReturn('url_path'); + + $this->category->expects($this->any())->method('getUrlKey')->willReturn('not_formatted_url_key'); + $this->category->expects($this->any())->method('setUrlKey')->willReturnSelf(); + $this->category->expects($this->any())->method('setUrlPath')->willReturnSelf(); + + $this->category->expects($this->once())->method('isObjectNew')->willReturn(true); + $this->categoryResource->expects($this->never())->method('saveAttribute'); + + $this->categoryUrlPathAutogeneratorObserver->execute($this->observer); + } + + public function testUrlPathAttributeUpdating() + { + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlKey')->willReturn('url_key'); + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlPath')->willReturn('url_path'); + + $this->category->expects($this->any())->method('getUrlKey')->willReturn('not_formatted_url_key'); + $this->category->expects($this->any())->method('setUrlKey')->willReturnSelf(); + $this->category->expects($this->any())->method('setUrlPath')->willReturnSelf(); $this->category->expects($this->once())->method('isObjectNew')->willReturn(false); - $this->category->expects($this->once())->method('dataHasChangedFor')->with('url_path')->willReturn(true); - $categoryResource = $this->getMockBuilder('Magento\Catalog\Model\ResourceModel\Category') - ->disableOriginalConstructor()->getMock(); - $this->category->expects($this->once())->method('getResource')->willReturn($categoryResource); - $categoryResource->expects($this->once())->method('saveAttribute')->with($this->category, 'url_path'); + $this->categoryResource->expects($this->once())->method('saveAttribute')->with($this->category, 'url_path'); + + // break code execution + $this->category->expects($this->once())->method('dataHasChangedFor')->with('url_path')->willReturn(false); + + $this->categoryUrlPathAutogeneratorObserver->execute($this->observer); + } + + public function testChildrenUrlPathAttributeNoUpdatingIfParentUrlPathIsNotChanged() + { + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlKey')->willReturn('url_key'); + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlPath')->willReturn('url_path'); + + $this->categoryResource->expects($this->once())->method('saveAttribute')->with($this->category, 'url_path'); + + $this->category->expects($this->any())->method('getUrlKey')->willReturn('not_formatted_url_key'); + $this->category->expects($this->any())->method('setUrlKey')->willReturnSelf(); + $this->category->expects($this->any())->method('setUrlPath')->willReturnSelf(); + $this->category->expects($this->once())->method('isObjectNew')->willReturn(false); + // break code execution + $this->category->expects($this->once())->method('dataHasChangedFor')->with('url_path')->willReturn(false); + + $this->categoryUrlPathAutogeneratorObserver->execute($this->observer); + } + + public function testChildrenUrlPathAttributeUpdatingForSpecificStore() + { + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlKey')->willReturn('generated_url_key'); + $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlPath')->willReturn('generated_url_path'); + + $this->category->expects($this->any())->method('getUrlKey')->willReturn('not_formatted_url_key'); + $this->category->expects($this->any())->method('setUrlKey')->willReturnSelf(); + $this->category->expects($this->any())->method('setUrlPath')->willReturnSelf(); + $this->category->expects($this->any())->method('isObjectNew')->willReturn(false); + $this->category->expects($this->any())->method('dataHasChangedFor')->willReturn(true); + // only for specific store + $this->category->expects($this->atLeastOnce())->method('getStoreId')->willReturn(1); + + $childCategoryResource = $this->getMockBuilder('Magento\Catalog\Model\ResourceModel\Category') + ->disableOriginalConstructor()->getMock(); $childCategory = $this->getMockBuilder('Magento\Catalog\Model\Category') - ->setMethods(['getUrlPath', 'setUrlPath', 'getResource', 'unsUrlPath']) + ->setMethods([ + 'getUrlPath', + 'setUrlPath', + 'getResource', + 'getStore', + 'getStoreId', + 'setStoreId' + ]) ->disableOriginalConstructor()->getMock(); + $childCategory->expects($this->any())->method('getResource')->willReturn($childCategoryResource); + $childCategory->expects($this->once())->method('setStoreId')->with(1); $this->childrenCategoriesProvider->expects($this->once())->method('getChildren')->willReturn([$childCategory]); - $childCategoryResource = $this->getMockBuilder('Magento\Catalog\Model\ResourceModel\Category') - ->disableOriginalConstructor()->getMock(); - $childCategory->expects($this->once())->method('unsUrlPath')->willReturnSelf(); - $childCategory->expects($this->once())->method('getResource')->willReturn($childCategoryResource); + $childCategory->expects($this->once())->method('setUrlPath')->with('generated_url_path')->willReturnSelf(); $childCategoryResource->expects($this->once())->method('saveAttribute')->with($childCategory, 'url_path'); - $childCategory->expects($this->once())->method('setUrlPath')->with('category-url_path')->willReturnSelf(); - $this->categoryUrlPathGenerator->expects($this->any())->method('getUrlPath')->willReturn('category-url_path'); $this->categoryUrlPathAutogeneratorObserver->execute($this->observer); } diff --git a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/events.xml b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/events.xml index 194b45d59a41ab1754da85805935bb7d82e968ea..477a6cf338b1ba397c3559533c8957c617519017 100644 --- a/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/events.xml +++ b/app/code/Magento/CatalogUrlRewrite/etc/adminhtml/events.xml @@ -27,4 +27,7 @@ <event name="catalog_category_move_after"> <observer name="process_url_rewrite_moving" instance="Magento\CatalogUrlRewrite\Observer\CategoryProcessUrlRewriteMovingObserver"/> </event> + <event name="catalog_product_to_website_change"> + <observer name="catalog_product_to_website_change" instance="Magento\CatalogUrlRewrite\Observer\ProductToWebsiteChangeObserver"/> + </event> </config> diff --git a/app/code/Magento/CatalogWidget/Controller/Adminhtml/Product/Widget/Conditions.php b/app/code/Magento/CatalogWidget/Controller/Adminhtml/Product/Widget/Conditions.php index dd779b035108c5db50ac8dc00b6dd47fdeae5c0d..f2a0dde38a02e7843e015586ae9010063d803c86 100644 --- a/app/code/Magento/CatalogWidget/Controller/Adminhtml/Product/Widget/Conditions.php +++ b/app/code/Magento/CatalogWidget/Controller/Adminhtml/Product/Widget/Conditions.php @@ -32,7 +32,7 @@ class Conditions extends \Magento\CatalogWidget\Controller\Adminhtml\Product\Wid /** * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $typeData = explode('|', str_replace('-', '/', $this->getRequest()->getParam('type'))); diff --git a/app/code/Magento/CatalogWidget/Test/Unit/Controller/Adminhtml/Product/Widget/ConditionsTest.php b/app/code/Magento/CatalogWidget/Test/Unit/Controller/Adminhtml/Product/Widget/ConditionsTest.php index 984b420c0bd8327e142943c7097c5c0de638b560..5b76de4974cec63a75629db3c29b50d982ae5ebf 100644 --- a/app/code/Magento/CatalogWidget/Test/Unit/Controller/Adminhtml/Product/Widget/ConditionsTest.php +++ b/app/code/Magento/CatalogWidget/Test/Unit/Controller/Adminhtml/Product/Widget/ConditionsTest.php @@ -94,6 +94,6 @@ class ConditionsTest extends \PHPUnit_Framework_TestCase $this->objectManager->expects($this->once())->method('create')->will($this->returnValue($condition)); $this->response->expects($this->once())->method('setBody')->with('<some_html>')->will($this->returnSelf()); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Checkout/Controller/Account/Create.php b/app/code/Magento/Checkout/Controller/Account/Create.php index 4e8514699c1fd7708dd687fc37037f01626efb60..c6f7ccb7c60af1ea2989a8c43c6afa9b1c818b39 100644 --- a/app/code/Magento/Checkout/Controller/Account/Create.php +++ b/app/code/Magento/Checkout/Controller/Account/Create.php @@ -52,7 +52,7 @@ class Create extends \Magento\Framework\App\Action\Action * @throws \Exception * @return void */ - public function execute() + public function executeInternal() { if ($this->customerSession->isLoggedIn()) { $this->messageManager->addError(__("Customer is already registered")); diff --git a/app/code/Magento/Checkout/Controller/Cart/Add.php b/app/code/Magento/Checkout/Controller/Cart/Add.php index 6e4b71de00fa2b25d7f4f6078e95ccbb55b1a792..1106eab228282f240925aafd3305e9e088408db5 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Add.php +++ b/app/code/Magento/Checkout/Controller/Cart/Add.php @@ -75,7 +75,7 @@ class Add extends \Magento\Checkout\Controller\Cart * @return \Magento\Framework\Controller\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { if (!$this->_formKeyValidator->validate($this->getRequest())) { return $this->resultRedirectFactory->create()->setPath('*/*/'); diff --git a/app/code/Magento/Checkout/Controller/Cart/Addgroup.php b/app/code/Magento/Checkout/Controller/Cart/Addgroup.php index 0665e0c29155277400dfa3f25a3951b7c0722881..abaed132df4cd6d0ba2eaba416cc065ab52e85cb 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Addgroup.php +++ b/app/code/Magento/Checkout/Controller/Cart/Addgroup.php @@ -11,7 +11,7 @@ class Addgroup extends \Magento\Checkout\Controller\Cart /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $orderItemIds = $this->getRequest()->getParam('order_items', []); if (is_array($orderItemIds)) { diff --git a/app/code/Magento/Checkout/Controller/Cart/Configure.php b/app/code/Magento/Checkout/Controller/Cart/Configure.php index bd614ec3110aa21489b7b6a1cf18db40128e9673..f1086d86f2c50995344aecc5447fc7db1512f9aa 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Configure.php +++ b/app/code/Magento/Checkout/Controller/Cart/Configure.php @@ -48,7 +48,7 @@ class Configure extends \Magento\Checkout\Controller\Cart * * @return \Magento\Framework\View\Result\Page|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { // Extract item and product to configure $id = (int)$this->getRequest()->getParam('id'); diff --git a/app/code/Magento/Checkout/Controller/Cart/CouponPost.php b/app/code/Magento/Checkout/Controller/Cart/CouponPost.php index 2496709c162c8736a78e7b1b8581d18200bf9adf..421effe555299a64a9ee2ff0015758d8177258ee 100644 --- a/app/code/Magento/Checkout/Controller/Cart/CouponPost.php +++ b/app/code/Magento/Checkout/Controller/Cart/CouponPost.php @@ -61,7 +61,7 @@ class CouponPost extends \Magento\Checkout\Controller\Cart * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $couponCode = $this->getRequest()->getParam('remove') == 1 ? '' diff --git a/app/code/Magento/Checkout/Controller/Cart/Delete.php b/app/code/Magento/Checkout/Controller/Cart/Delete.php index 3d73a5f0c205a8ec950b088f67d5f3438708f9d9..873133f3cbb7b9db627e379487a67d8a96b21c7e 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Delete.php +++ b/app/code/Magento/Checkout/Controller/Cart/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Checkout\Controller\Cart * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $id = (int)$this->getRequest()->getParam('id'); if ($id) { diff --git a/app/code/Magento/Checkout/Controller/Cart/EstimatePost.php b/app/code/Magento/Checkout/Controller/Cart/EstimatePost.php index 2ce3a8805e8dba0a580e9e5b1f00f3da7cbf8f25..e7808167252289e8b47763a0e934e56b5c55c2f6 100644 --- a/app/code/Magento/Checkout/Controller/Cart/EstimatePost.php +++ b/app/code/Magento/Checkout/Controller/Cart/EstimatePost.php @@ -50,7 +50,7 @@ class EstimatePost extends \Magento\Checkout\Controller\Cart * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $country = (string)$this->getRequest()->getParam('country_id'); $postcode = (string)$this->getRequest()->getParam('estimate_postcode'); diff --git a/app/code/Magento/Checkout/Controller/Cart/EstimateUpdatePost.php b/app/code/Magento/Checkout/Controller/Cart/EstimateUpdatePost.php index 0dcd81a8e01856f4aa677f79362d4db96b732233..da121bf5cb499b0835d86518ddfac9f6ae23497f 100644 --- a/app/code/Magento/Checkout/Controller/Cart/EstimateUpdatePost.php +++ b/app/code/Magento/Checkout/Controller/Cart/EstimateUpdatePost.php @@ -11,7 +11,7 @@ class EstimateUpdatePost extends \Magento\Checkout\Controller\Cart /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $code = (string)$this->getRequest()->getParam('estimate_method'); if (!empty($code)) { diff --git a/app/code/Magento/Checkout/Controller/Cart/Index.php b/app/code/Magento/Checkout/Controller/Cart/Index.php index 1486c2b8487b58b7b817eec346f31b36dca9bb72..3a6ffc2d9de6f74d8e42dce804780d4632e958f9 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Index.php +++ b/app/code/Magento/Checkout/Controller/Cart/Index.php @@ -49,7 +49,7 @@ class Index extends \Magento\Checkout\Controller\Cart * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->resultPageFactory->create(); $resultPage->getConfig()->getTitle()->set(__('Shopping Cart')); diff --git a/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php b/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php index c3e38a96dd3171369e755a4e90f4ecf20877bbd3..9b5dcc0f3960fc017df3cace7bd7a191bb38d2dc 100644 --- a/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php +++ b/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php @@ -15,7 +15,7 @@ class UpdateItemOptions extends \Magento\Checkout\Controller\Cart * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $id = (int)$this->getRequest()->getParam('id'); $params = $this->getRequest()->getParams(); diff --git a/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php b/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php index 71685ea000563aa93abac03ddec295315c7eddcd..73261faf0379c311bbc980b132953b454c18a186 100644 --- a/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php +++ b/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php @@ -64,7 +64,7 @@ class UpdatePost extends \Magento\Checkout\Controller\Cart * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { if (!$this->_formKeyValidator->validate($this->getRequest())) { return $this->resultRedirectFactory->create()->setPath('*/*/'); diff --git a/app/code/Magento/Checkout/Controller/Index/Index.php b/app/code/Magento/Checkout/Controller/Index/Index.php index 0bb9c2fe851046dd4a7c83acd49b6c00af68702e..73de6be7b12efbaac1c178bf88b232e7bfa09c87 100644 --- a/app/code/Magento/Checkout/Controller/Index/Index.php +++ b/app/code/Magento/Checkout/Controller/Index/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Checkout\Controller\Onepage * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Checkout\Helper\Data $checkoutHelper */ $checkoutHelper = $this->_objectManager->get('Magento\Checkout\Helper\Data'); diff --git a/app/code/Magento/Checkout/Controller/Noroute/Index.php b/app/code/Magento/Checkout/Controller/Noroute/Index.php index e892582009403b4295dfbef10b739c0099b463ab..6c1821f30ed1d4b998b1bf1d9d838ce53b2bb9f0 100644 --- a/app/code/Magento/Checkout/Controller/Noroute/Index.php +++ b/app/code/Magento/Checkout/Controller/Noroute/Index.php @@ -17,7 +17,7 @@ class Index extends \Magento\Framework\App\Action\Action * @return void * @codeCoverageIgnore */ - public function execute() + public function executeInternal() { throw new NotFoundException(__('Page not found.')); } diff --git a/app/code/Magento/Checkout/Controller/Onepage.php b/app/code/Magento/Checkout/Controller/Onepage.php index 38e141855f3f191f4f60a2394bec4abe7db2b6f0..2bfbf61db7a7fa7ff4e0e5861139a904b010662e 100644 --- a/app/code/Magento/Checkout/Controller/Onepage.php +++ b/app/code/Magento/Checkout/Controller/Onepage.php @@ -141,7 +141,7 @@ abstract class Onepage extends Action * @return \Magento\Framework\App\ResponseInterface * @throws \Magento\Framework\Exception\NotFoundException */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $this->_request = $request; $result = $this->_preDispatchValidateCustomer(); @@ -158,7 +158,7 @@ abstract class Onepage extends Action if (!$this->_canShowForUnregisteredUsers()) { throw new NotFoundException(__('Page not found.')); } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Checkout/Controller/Onepage/Failure.php b/app/code/Magento/Checkout/Controller/Onepage/Failure.php index e6155dbea2981db811b5a6a9a9a639148d785959..dcff66c6c294b22e4403c1b6d3a3e4b5df9023f1 100644 --- a/app/code/Magento/Checkout/Controller/Onepage/Failure.php +++ b/app/code/Magento/Checkout/Controller/Onepage/Failure.php @@ -11,7 +11,7 @@ class Failure extends \Magento\Checkout\Controller\Onepage /** * @return \Magento\Framework\View\Result\Page|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $lastQuoteId = $this->getOnepage()->getCheckout()->getLastQuoteId(); $lastOrderId = $this->getOnepage()->getCheckout()->getLastOrderId(); diff --git a/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php b/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php index 6c66fd165de554889cdbbd39b4b1f40608bb9983..55fded81c192c2263d24d14b5952dab48f06323c 100644 --- a/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php +++ b/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php @@ -17,7 +17,7 @@ class SaveOrder extends \Magento\Checkout\Controller\Onepage * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { if (!$this->_formKeyValidator->validate($this->getRequest())) { return $this->resultRedirectFactory->create()->setPath('*/*/'); diff --git a/app/code/Magento/Checkout/Controller/Onepage/Success.php b/app/code/Magento/Checkout/Controller/Onepage/Success.php index 6287f4785441a1b3971cffe28b7140ecc7bfc3a7..18155e5c61df48609a83952a171356438ff4068a 100644 --- a/app/code/Magento/Checkout/Controller/Onepage/Success.php +++ b/app/code/Magento/Checkout/Controller/Onepage/Success.php @@ -13,7 +13,7 @@ class Success extends \Magento\Checkout\Controller\Onepage * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $session = $this->getOnepage()->getCheckout(); if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) { diff --git a/app/code/Magento/Checkout/Controller/ShippingRates/Index.php b/app/code/Magento/Checkout/Controller/ShippingRates/Index.php index c407b0bab657fcb16893a90e5b8c4a817416f428..ea8a4da9076202d918fb0c86bf64460e8b73dfb3 100644 --- a/app/code/Magento/Checkout/Controller/ShippingRates/Index.php +++ b/app/code/Magento/Checkout/Controller/ShippingRates/Index.php @@ -41,7 +41,7 @@ class Index extends \Magento\Framework\App\Action\Action * @return \Magento\Framework\Controller\ResultInterface * @throws Action\NotFoundException */ - public function execute() + public function executeInternal() { $quote = $this->checkoutSession->getQuote(); $address = $quote->getShippingAddress(); diff --git a/app/code/Magento/Checkout/Controller/Sidebar/RemoveItem.php b/app/code/Magento/Checkout/Controller/Sidebar/RemoveItem.php index 0eac880fcbdc1944db53ec84187fdb2d916db116..307cc0ae49ab0937cb98b3454e8a40edb6da472d 100644 --- a/app/code/Magento/Checkout/Controller/Sidebar/RemoveItem.php +++ b/app/code/Magento/Checkout/Controller/Sidebar/RemoveItem.php @@ -61,7 +61,7 @@ class RemoveItem extends Action /** * @return $this */ - public function execute() + public function executeInternal() { $itemId = (int)$this->getRequest()->getParam('item_id'); try { diff --git a/app/code/Magento/Checkout/Controller/Sidebar/UpdateItemQty.php b/app/code/Magento/Checkout/Controller/Sidebar/UpdateItemQty.php index e5504082d6f3a8cfe3dd050c9be8fea3fb163152..434276d6951c49c05c72f4fcf7c80a3ce5ea1cc1 100644 --- a/app/code/Magento/Checkout/Controller/Sidebar/UpdateItemQty.php +++ b/app/code/Magento/Checkout/Controller/Sidebar/UpdateItemQty.php @@ -52,7 +52,7 @@ class UpdateItemQty extends Action /** * @return $this */ - public function execute() + public function executeInternal() { $itemId = (int)$this->getRequest()->getParam('item_id'); $itemQty = (int)$this->getRequest()->getParam('item_qty'); diff --git a/app/code/Magento/Checkout/Model/Cart.php b/app/code/Magento/Checkout/Model/Cart.php index 9cc015b2271cdf002eaec6dfa959789f18061193..470af073fef905af22d8d46d725631d1e112c9e1 100644 --- a/app/code/Magento/Checkout/Model/Cart.php +++ b/app/code/Magento/Checkout/Model/Cart.php @@ -324,6 +324,7 @@ class Cart extends DataObject implements CartInterface if (!$request->hasQty()) { $request->setQty(1); } + !$request->hasFormKey() ?: $request->unsFormKey(); return $request; } diff --git a/app/code/Magento/Checkout/Model/DefaultConfigProvider.php b/app/code/Magento/Checkout/Model/DefaultConfigProvider.php index d0cc39ceaafe18ee34a6f92645f7ed39e6c1ff7d..8e59581f351965123fb61dcc732fea2c1b6a6890 100644 --- a/app/code/Magento/Checkout/Model/DefaultConfigProvider.php +++ b/app/code/Magento/Checkout/Model/DefaultConfigProvider.php @@ -62,11 +62,6 @@ class DefaultConfigProvider implements ConfigProviderInterface */ private $httpContext; - /** - * @var CurrencyManager - */ - private $currencyManager; - /** * @var QuoteRepository */ @@ -174,7 +169,6 @@ class DefaultConfigProvider implements ConfigProviderInterface * @param CustomerSession $customerSession * @param CustomerUrlManager $customerUrlManager * @param HttpContext $httpContext - * @param CurrencyManager $currencyManager * @param QuoteRepository $quoteRepository * @param QuoteItemRepository $quoteItemRepository * @param ShippingMethodManager $shippingMethodManager @@ -205,7 +199,6 @@ class DefaultConfigProvider implements ConfigProviderInterface CustomerSession $customerSession, CustomerUrlManager $customerUrlManager, HttpContext $httpContext, - CurrencyManager $currencyManager, QuoteRepository $quoteRepository, QuoteItemRepository $quoteItemRepository, ShippingMethodManager $shippingMethodManager, @@ -233,7 +226,6 @@ class DefaultConfigProvider implements ConfigProviderInterface $this->customerSession = $customerSession; $this->customerUrlManager = $customerUrlManager; $this->httpContext = $httpContext; - $this->currencyManager = $currencyManager; $this->quoteRepository = $quoteRepository; $this->quoteItemRepository = $quoteItemRepository; $this->shippingMethodManager = $shippingMethodManager; @@ -282,7 +274,7 @@ class DefaultConfigProvider implements ConfigProviderInterface ); $output['basePriceFormat'] = $this->localeFormat->getPriceFormat( null, - $this->currencyManager->getDefaultCurrency() + $this->checkoutSession->getQuote()->getBaseCurrencyCode() ); $output['postCodes'] = $this->postCodesConfig->getPostCodes(); $output['imageData'] = $this->imageProvider->getImages($quoteId); diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Account/CreateTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Account/CreateTest.php index 2e3ce377ab7b07a1be35867de496617fa571f2f3..43e765cea0a3af2252ed755e293fd7c7d0b0daea 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Account/CreateTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Account/CreateTest.php @@ -65,7 +65,7 @@ class CreateTest extends \PHPUnit_Framework_TestCase { $this->customerSession->expects($this->once())->method('isLoggedIn')->will($this->returnValue(true)); $this->messageManager->expects($this->once())->method('addError')->with(); - $this->action->execute(); + $this->action->executeInternal(); } public function testExecute() @@ -76,6 +76,6 @@ class CreateTest extends \PHPUnit_Framework_TestCase $this->orderCustomerService->expects($this->once())->method('create')->with(100)->will( $this->returnValue($customer) ); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Cart/ConfigureTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/ConfigureTest.php index 35fff77a2b49055bae241223e8825d650c85cdb3..9c2664a966ab188d0b774fcfc483d8fb263329e3 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Cart/ConfigureTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/ConfigureTest.php @@ -162,7 +162,7 @@ class ConfigureTest extends \PHPUnit_Framework_TestCase $productMock->expects($this->exactly(2))->method('getId')->willReturn($actualProductId); - $this->assertSame($pageMock, $this->configureController->execute()); + $this->assertSame($pageMock, $this->configureController->executeInternal()); } /** @@ -206,6 +206,6 @@ class ConfigureTest extends \PHPUnit_Framework_TestCase ->method('create') ->with(ResultFactory::TYPE_REDIRECT, []) ->willReturn($this->resultRedirectMock); - $this->assertSame($this->resultRedirectMock, $this->configureController->execute()); + $this->assertSame($this->resultRedirectMock, $this->configureController->executeInternal()); } } diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Cart/CouponPostTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/CouponPostTest.php index 99e3ccd1a7c7c44babb263d2d723b7a536f6aa5c..42453493e5343939887789609f218820ca0266f3 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Cart/CouponPostTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/CouponPostTest.php @@ -174,7 +174,7 @@ class CouponPostTest extends \PHPUnit_Framework_TestCase ->method('getQuote') ->willReturn($this->quote); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithGoodCouponAndItems() @@ -232,7 +232,7 @@ class CouponPostTest extends \PHPUnit_Framework_TestCase ->method('get') ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithGoodCouponAndNoItems() @@ -286,7 +286,7 @@ class CouponPostTest extends \PHPUnit_Framework_TestCase ->method('get') ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithBadCouponAndItems() @@ -337,7 +337,7 @@ class CouponPostTest extends \PHPUnit_Framework_TestCase ->with('You canceled the coupon code.') ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithBadCouponAndNoItems() @@ -382,6 +382,6 @@ class CouponPostTest extends \PHPUnit_Framework_TestCase ->method('get') ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Cart/IndexTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/IndexTest.php index fc2199407275cc5a160d91cd461fb96079a6e94f..7fe1d10605d172586176842be114edd515f0c779 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Cart/IndexTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Cart/IndexTest.php @@ -156,7 +156,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->resultPageFactory->expects($this->once()) ->method('create') ->willReturn($page); - $result = $this->controller->execute(); + $result = $this->controller->executeInternal(); $this->assertInstanceOf('Magento\Framework\View\Result\Page', $result); } } diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Index/IndexTest.php index c0f13dc40942fb901ec9722a0d1da841398463f4..85d242087e62433b8b00796e398ea5aed7e55a26 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Index/IndexTest.php @@ -192,7 +192,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase //Expected outcomes $this->sessionMock->expects($this->once())->method('regenerateId'); - $this->assertSame($this->resultPageMock, $this->model->execute()); + $this->assertSame($this->resultPageMock, $this->model->executeInternal()); } public function testOnepageCheckoutNotAvailable() @@ -205,7 +205,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->with($expectedPath) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } public function testInvalidQuote() @@ -218,7 +218,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->with($expectedPath) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } /** diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/OnepageTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/OnepageTest.php index 659fa90754e67a883b71fa7fb2dd184b62d51431..8afa4c6326db1663c529480f63ebe0eb6d61c6d1 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/OnepageTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/OnepageTest.php @@ -100,6 +100,6 @@ class OnepageTest extends \PHPUnit_Framework_TestCase ->method('getActionName') ->willReturn('index'); - $this->assertEquals($this->response, $this->controller->dispatch($this->request)); + $this->assertEquals($this->response, $this->controller->execute($this->request)); } } diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/RemoveItemTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/RemoveItemTest.php index d2cf39386d297794a4706f3484b8d711167bbc20..4e8b5690ab168cc1483bf659ec026cf72d01b16a 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/RemoveItemTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/RemoveItemTest.php @@ -113,7 +113,7 @@ class RemoveItemTest extends \PHPUnit_Framework_TestCase ->with('json encoded') ->willReturn('json represented'); - $this->assertEquals('json represented', $this->removeItem->execute()); + $this->assertEquals('json represented', $this->removeItem->executeInternal()); } public function testExecuteWithLocalizedException() @@ -153,7 +153,7 @@ class RemoveItemTest extends \PHPUnit_Framework_TestCase ->with('json encoded') ->willReturn('json represented'); - $this->assertEquals('json represented', $this->removeItem->execute()); + $this->assertEquals('json represented', $this->removeItem->executeInternal()); } public function testExecuteWithException() @@ -200,6 +200,6 @@ class RemoveItemTest extends \PHPUnit_Framework_TestCase ->with('json encoded') ->willReturn('json represented'); - $this->assertEquals('json represented', $this->removeItem->execute()); + $this->assertEquals('json represented', $this->removeItem->executeInternal()); } } diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/UpdateItemQtyTest.php b/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/UpdateItemQtyTest.php index b36cbed010b0298348affe01da90822694fd8cb0..dd666066f96086d8596d2c40ad483f0c4d901518 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/UpdateItemQtyTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/UpdateItemQtyTest.php @@ -110,7 +110,7 @@ class UpdateItemQtyTest extends \PHPUnit_Framework_TestCase ->with('json encoded') ->willReturn('json represented'); - $this->assertEquals('json represented', $this->updateItemQty->execute()); + $this->assertEquals('json represented', $this->updateItemQty->executeInternal()); } public function testExecuteWithLocalizedException() @@ -154,7 +154,7 @@ class UpdateItemQtyTest extends \PHPUnit_Framework_TestCase ->with('json encoded') ->willReturn('json represented'); - $this->assertEquals('json represented', $this->updateItemQty->execute()); + $this->assertEquals('json represented', $this->updateItemQty->executeInternal()); } public function testExecuteWithException() @@ -205,6 +205,6 @@ class UpdateItemQtyTest extends \PHPUnit_Framework_TestCase ->with('json encoded') ->willReturn('json represented'); - $this->assertEquals('json represented', $this->updateItemQty->execute()); + $this->assertEquals('json represented', $this->updateItemQty->executeInternal()); } } diff --git a/app/code/Magento/Checkout/Test/Unit/Controller/Stub/OnepageStub.php b/app/code/Magento/Checkout/Test/Unit/Controller/Stub/OnepageStub.php index 0ee81629337b03c6f121c2d6d4bd253eced1ebd9..01d5acd4222e458d86f1f71452a372a38d4891d2 100644 --- a/app/code/Magento/Checkout/Test/Unit/Controller/Stub/OnepageStub.php +++ b/app/code/Magento/Checkout/Test/Unit/Controller/Stub/OnepageStub.php @@ -8,7 +8,7 @@ namespace Magento\Checkout\Test\Unit\Controller\Stub; class OnepageStub extends \Magento\Checkout\Controller\Onepage { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/app/code/Magento/Checkout/view/frontend/web/js/sidebar.js b/app/code/Magento/Checkout/view/frontend/web/js/sidebar.js index 2600ada8b3cc3179fdb21f159a885bebac5bb093..052e79cbc7fced3a29f041489cd076f1a421e3b0 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/sidebar.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/sidebar.js @@ -10,9 +10,10 @@ define([ 'Magento_Customer/js/customer-data', 'Magento_Ui/js/modal/alert', 'Magento_Ui/js/modal/confirm', + 'Magento_Customer/js/customer-data', "jquery/ui", "mage/decorate" -], function($, authenticationPopup, customerData, alert, confirm){ +], function($, authenticationPopup, customerData, alert, confirm, customerData){ $.widget('mage.sidebar', { options: { @@ -21,8 +22,19 @@ define([ }, scrollHeight: 0, - _create: function() { + /** + * Create sidebar. + * @private + */ + _create: function () { + var self = this; + this._initContent(); + customerData.get('cart').subscribe(function () { + $(self.options.targetElement).trigger('contentUpdated'); + self._calcHeight(); + self._isOverflowed(); + }); }, _initContent: function() { @@ -53,6 +65,9 @@ define([ actions: { confirm: function () { self._removeItem($(event.currentTarget)); + }, + always: function (event) { + event.stopImmediatePropagation(); } } }); @@ -163,11 +178,6 @@ define([ * @private */ _removeItemAfter: function(elem, response) { - /** TODO: Extra options support. Should be refactored after MAGETWO-43159. */ - var self = this; - setTimeout(function(){ - self._calcHeight(); - }, 500); }, /** * @param url - ajax url diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js b/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js index b69365ebc0f17eedcdc4b039c235e8286ce3bf73..0b3290b3c3960302a3ea54a44c62abdd358db9fc 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js @@ -145,6 +145,9 @@ define( } else { this.source.set('params.invalid', false); this.source.trigger(this.dataScopePrefix + '.data.validate'); + if (this.source.get(this.dataScopePrefix + '.custom_attributes')) { + this.source.trigger(this.dataScopePrefix + '.custom_attributes.data.validate'); + }; if (!this.source.get('params.invalid')) { var addressData = this.source.get(this.dataScopePrefix), diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js b/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js index 933b5725638d6f3b7c0fbb0d45e29dc3bea90d63..68f02b5d5722412fa17880c59124cf5ee84cdb03 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js @@ -72,12 +72,6 @@ define([ this.isLoading(addToCartCalls > 0); sidebarInitialized = false; initSidebar(); - - /**TODO: Extra options support. Should be refactored after MAGETWO-43159. */ - setTimeout(function(){ - minicart.trigger('contentUpdated'); - }, 500); - }, this); $('[data-block="minicart"]').on('contentLoading', function(event) { addToCartCalls++; diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js index 562266434dd89b6801e31a1e190a126f5e2e33d3..e650f6269c91052a6c66311c9c1282b016a26e1e 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js @@ -201,7 +201,7 @@ define( } }, - validateShippingInformation: function() { + validateShippingInformation: function () { var shippingAddress, addressData, loginFormSelector = 'form[data-role=email-with-possible-login]', @@ -224,6 +224,9 @@ define( if (this.isFormInline) { this.source.set('params.invalid', false); this.source.trigger('shippingAddress.data.validate'); + if (this.source.get('shippingAddress.custom_attributes')) { + this.source.trigger('shippingAddress.custom_attributes.data.validate'); + }; if (this.source.get('params.invalid') || !quote.shippingMethod().method_code || !quote.shippingMethod().carrier_code diff --git a/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/grand-total.html b/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/grand-total.html index e4ac4affabb341b664f3e868b6d298989fbf416b..751e4eaaa51425b29f2c8dce5478da8b7541fb2d 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/grand-total.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/grand-total.html @@ -6,7 +6,7 @@ --> <tr class="grand totals"> <th class="mark" colspan="1" scope="row"> - <strong data-bind="text: $t(title)"></strong> + <strong data-bind="text: title"></strong> </th> <td class="amount" data-th="Order Total"> <strong><span class="price" data-bind="text: getValue()"></span></strong> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/shipping.html b/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/shipping.html index 17c41206ab4e65e210343ce60b15c53e041f7073..7cf6d85f66884f5e2f0565287fe7f20689ff923a 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/shipping.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/shipping.html @@ -6,7 +6,7 @@ --> <!-- ko if: isCalculated() --> <tr class="totals shipping excl"> - <th class="mark" colspan="1" scope="row" data-bind="text: $t(title) + ' (' + $t(getShippingMethodTitle()) + ')'"></th> + <th class="mark" colspan="1" scope="row" data-bind="text: title + ' (' + getShippingMethodTitle() + ')'"></th> <td class="amount"> <span class="price" data-bind="text: getValue()"></span> </td> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/subtotal.html b/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/subtotal.html index b5b7e2ecf683a8342a869bfcebded09457a60d20..be761940327f8e43fe3c1c46a8db537d013bc2cb 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/subtotal.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/cart/totals/subtotal.html @@ -5,7 +5,7 @@ */ --> <tr class="totals sub"> - <th class="mark" colspan="1" scope="row" data-bind="text: $t(title)"></th> + <th class="mark" colspan="1" scope="row" data-bind="text: title"></th> <td class="amount" data-th="Subtotal"> <span class="price" data-bind="text: getValue()"></span> </td> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/estimation.html b/app/code/Magento/Checkout/view/frontend/web/template/estimation.html index 36009ab7b4634ab66da8c232712b33c6aa052fd1..f8b396939cef704fceedbda2413f5b3dd848614e 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/estimation.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/estimation.html @@ -7,7 +7,7 @@ <div class="opc-estimated-wrapper" data-bind="blockLoader: isLoading"> <div class="estimated-block"> <span class="estimated-label" data-bind="i18n: 'Estimated Total'"></span> - <span class="estimated-price" data-bind="i18n: getValue()"></span> + <span class="estimated-price" data-bind="text: getValue()"></span> </div> <div class="minicart-wrapper"> <button type="button" class="action showcart" data-bind="click: showSidebar" data-toggle="opc-summary"> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/payment.html b/app/code/Magento/Checkout/view/frontend/web/template/payment.html index d73f8ff5cb3434721a62ef47bff0f27efb6fe9e9..964be62c167b5dc2db04d1348d4e395c41120afa 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/payment.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/payment.html @@ -5,7 +5,7 @@ */ --> <li id="payment" role="presentation" class="checkout-payment-method" data-bind="fadeVisible: isVisible"> - <div class="step-title" data-bind="i18n: title" data-role="title"></div> + <div class="step-title" data-bind="text: title" data-role="title"></div> <div id="checkout-step-payment" class="step-content" data-role="content" diff --git a/app/code/Magento/Checkout/view/frontend/web/template/progress-bar.html b/app/code/Magento/Checkout/view/frontend/web/template/progress-bar.html index 6276cae43639e4c7b873f6184c49b47455911286..7e51c678147ebc4911738ccd18a3735d4ebb2f3c 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/progress-bar.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/progress-bar.html @@ -7,7 +7,7 @@ <ul class="opc-progress-bar"> <!-- ko foreach: { data: steps().sort(sortItems), as: 'item' } --> <li class="opc-progress-bar-item" data-bind="css: item.isVisible() ? '_active' : ($parent.isProcessed(item) ? '_complete' : '')"> - <span data-bind="i18n: item.title, click: $parent.navigateTo"></span> + <span data-bind="text: item.title, click: $parent.navigateTo"></span> </li> <!-- /ko --> </ul> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/registration.html b/app/code/Magento/Checkout/view/frontend/web/template/registration.html index 1cb610134a90caf59dcf99c6982563142c9df138..53c1248a210ab36f26f9d238bf38fd168d0aa9ba 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/registration.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/registration.html @@ -13,6 +13,6 @@ </form> <!-- /ko --> <!-- ko if: accountCreated --> - <p data-bind="i18n: $t('A letter with further instructions will be sent to your email.')"></p> + <p data-bind="i18n: 'A letter with further instructions will be sent to your email.'"></p> <!-- /ko --> </div> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/shipping-information.html b/app/code/Magento/Checkout/view/frontend/web/template/shipping-information.html index 0e6ad40d317031dddbe7b120901432bf3e7bca8e..a7c4edce8a64c0eb026019f78a73b9283692d2d4 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/shipping-information.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/shipping-information.html @@ -28,7 +28,7 @@ </button> </div> <div class="shipping-information-content"> - <span class="value" data-bind="i18n: getShippingMethodTitle()"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </div> </div> </div> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/shipping.html b/app/code/Magento/Checkout/view/frontend/web/template/shipping.html index 7c981e83bc97859cef4e11ca96ebf8b679262f48..91960304668539f2d4b6c09b5f592ad948da3381 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/shipping.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/shipping.html @@ -112,17 +112,17 @@ </td> <td class="col col-method" - data-bind="i18n: method.method_title, attr: {'id': 'label_method_' + method.method_code + '_' + method.carrier_code}"></td> + data-bind="text: method.method_title, attr: {'id': 'label_method_' + method.method_code + '_' + method.carrier_code}"></td> <td class="col col-carrier" - data-bind="i18n: method.carrier_title, attr: {'id': 'label_carrier_' + method.method_code + '_' + method.carrier_code}"></td> + data-bind="text: method.carrier_title, attr: {'id': 'label_carrier_' + method.method_code + '_' + method.carrier_code}"></td> </tr> <!-- ko if: method.error_message --> <tr class="row row-error"> <td class="col col-error" colspan="4"> <div class="message error"> - <div data-bind="i18n: method.error_message"></div> + <div data-bind="text: method.error_message"></div> </div> <span class="no-display"> <input name="shipping_method" type="radio" data-bind="attr: {'value' : method.method_code, 'id': 's_method_' + method.method_code}"/> @@ -143,7 +143,7 @@ </div> <!-- ko if: errorValidationMessage().length > 0 --> <div class="message notice"> - <span><!-- ko i18n: errorValidationMessage()--><!-- /ko --></span> + <span><!-- ko text: errorValidationMessage()--><!-- /ko --></span> </div> <!-- /ko --> <div class="actions-toolbar" id="shipping-method-buttons-container"> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/summary/grand-total.html b/app/code/Magento/Checkout/view/frontend/web/template/summary/grand-total.html index 107907b157acfd2ef31db7fb9bfd08e7d5659551..009c7e01435019d493d9f6ea93a8321ebd19ddb5 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/summary/grand-total.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/summary/grand-total.html @@ -6,9 +6,9 @@ --> <!-- ko if: isDisplayed() --> <tr> - <td colspan="2" data-bind="i18n: title"></td> + <td colspan="2" data-bind="text: title"></td> <td class="col grandtotal"> - <span data-bind ="text: getValue(), attr:{'data-label': $t(title)}"></span> + <span data-bind ="text: getValue(), attr:{'data-label': title}"></span> <!-- ko foreach: elems() --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/summary/item/details.html b/app/code/Magento/Checkout/view/frontend/web/template/summary/item/details.html index 05b39a8f11e00bc8ea5f9953422bde9d6d78e6e1..69f698a7a5a4a1c0b9dc7a40ba8928d5e0d16b04 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/summary/item/details.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/summary/item/details.html @@ -12,7 +12,7 @@ <div class="product-item-inner"> <div class="product-item-name-block"> - <strong class="product-item-name" data-bind="i18n: $parent.name"></strong> + <strong class="product-item-name" data-bind="text: $parent.name"></strong> <div class="details-qty"> <span class="label"><!-- ko i18n: 'Qty' --><!-- /ko --></span> <span class="value" data-bind="text: $parent.qty"></span> @@ -30,7 +30,7 @@ <strong class="subtitle"><!-- ko i18n: 'Options Details' --><!-- /ko --></strong> <dl class="item-options"> <!--ko foreach: JSON.parse($parent.options)--> - <dt class="label" data-bind="i18n: label"></dt> + <dt class="label" data-bind="text: label"></dt> <!-- ko if: ($data.full_view)--> <dd class="values" data-bind="html: full_view"></dd> <!-- /ko --> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/summary/shipping.html b/app/code/Magento/Checkout/view/frontend/web/template/summary/shipping.html index f3a22cef746e52c1147a86475bc4f48fc0ec2713..a6dc09dc74656e0d31d1c52aeabb7814c6c7a7bd 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/summary/shipping.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/summary/shipping.html @@ -7,17 +7,17 @@ <!-- ko if: quoteIsVirtual == 0 --> <tr class="totals shipping excl"> <th class="mark" scope="row"> - <span class="label" data-bind="i18n: title"></span> - <span class="value" data-bind="i18n: getShippingMethodTitle()"></span> + <span class="label" data-bind="text: title"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <!-- ko if: isCalculated() --> <span class="price" - data-bind="i18n: getValue(), attr: {'data-th': $t(title)}"></span> + data-bind="text: getValue(), attr: {'data-th': title}"></span> <!-- /ko --> <!-- ko ifnot: isCalculated() --> <span class="not-calculated" - data-bind="i18n: getValue(), attr: {'data-th': $t(title)}"></span> + data-bind="text: getValue(), attr: {'data-th': title}"></span> <!-- /ko --> </td> </tr> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/summary/subtotal.html b/app/code/Magento/Checkout/view/frontend/web/template/summary/subtotal.html index e217668f605f177665d97229dd1f9720bb426257..47b1bbc221fe4bbee89cfd669f3ca5c88658ad5b 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/summary/subtotal.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/summary/subtotal.html @@ -6,9 +6,9 @@ --> <tr class="totals"> - <th class="mark" scope="row" data-bind="i18n: title"></th> + <th class="mark" scope="row" data-bind="text: title"></th> <td class="amount"> - <span class="price" data-bind ="text: getValue(), attr:{'data-label': $t(title)}"></span> + <span class="price" data-bind ="text: getValue(), attr:{'data-label': title}"></span> <!-- ko foreach: elems() --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php index 8ca81a642dfbd81e82b85371ee8bb25aecaa0dfd..72b54d8986cde6fe00fa0af5c1d5b9a0daaddcee 100644 --- a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php +++ b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php @@ -11,7 +11,7 @@ class Delete extends \Magento\CheckoutAgreements\Controller\Adminhtml\Agreement /** * @return void */ - public function execute() + public function executeInternal() { $id = (int)$this->getRequest()->getParam('id'); $model = $this->_objectManager->get('Magento\CheckoutAgreements\Model\Agreement')->load($id); diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Edit.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Edit.php index 01fcef39eaf979376eea60929d7f853fd6d889c8..117905e8c50bbac296cf182c7cf46d617756d8e8 100644 --- a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Edit.php +++ b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Edit.php @@ -12,7 +12,7 @@ class Edit extends \Magento\CheckoutAgreements\Controller\Adminhtml\Agreement * @return void * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $agreementModel = $this->_objectManager->create('Magento\CheckoutAgreements\Model\Agreement'); diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Index.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Index.php index 5327672f74948315605330207c9715af9656105e..e290737d27228a522b484d77bf3a61a676099c7c 100644 --- a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Index.php +++ b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\CheckoutAgreements\Controller\Adminhtml\Agreement /** * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_addContent( $this->_view->getLayout()->createBlock('Magento\CheckoutAgreements\Block\Adminhtml\Agreement') diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/NewAction.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/NewAction.php index 49c4368bc675bd772588a1adda8b9cfaf526b719..666d8e907635ebb98587595b190ac61d6c804f85 100644 --- a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/NewAction.php +++ b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/NewAction.php @@ -12,7 +12,7 @@ class NewAction extends \Magento\CheckoutAgreements\Controller\Adminhtml\Agreeme * @return void * @codeCoverageIgnore */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php index ffdfd74395decb773ad096f793c332083f2682e3..d85847caab2c4fce443c66410f7c977d77462e23 100644 --- a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php +++ b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php @@ -11,7 +11,7 @@ class Save extends \Magento\CheckoutAgreements\Controller\Adminhtml\Agreement /** * @return void */ - public function execute() + public function executeInternal() { $postData = $this->getRequest()->getPostValue(); if ($postData) { diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php index 107b5f4eb9ecc5da560b6a34beb235c976455c3d..3a11c2b4ff0fc2ed00b9a71a017ab32d86c287ed 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Cms\Controller\Adminhtml\Block * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Edit.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Edit.php index bc8f586567c58fc68aec8d3fcc351ee98fcf9d73..bd0a0fbb62e84f58c7d57c4992faf76e05bd4194 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Edit.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Edit.php @@ -33,7 +33,7 @@ class Edit extends \Magento\Cms\Controller\Adminhtml\Block * @return \Magento\Framework\Controller\ResultInterface * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { // 1. Get ID and create model $id = $this->getRequest()->getParam('block_id'); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Index.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Index.php index b81e879b9171f69f12bafe1d16ce6414881f3e9d..5e36a87e5a71c2a84d6f27f5247ebb1c02c0c2e6 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Index.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Index.php @@ -32,7 +32,7 @@ class Index extends \Magento\Cms\Controller\Adminhtml\Block * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/InlineEdit.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/InlineEdit.php index 6ce12cfbf02ec162a13fdc7d9c24d109a3f4ff19..4d8a7f238bcdd95cfa87cc35ff42d7cfe4ce6dfb 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/InlineEdit.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/InlineEdit.php @@ -36,7 +36,7 @@ class InlineEdit extends \Magento\Backend\App\Action /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->jsonFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/MassDelete.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/MassDelete.php index a173e9f3dac6becf1d6496bb85c8edd2e09dac3e..3b45c6902d2faf9585961fd16dbd3e461c9558cb 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/MassDelete.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/MassDelete.php @@ -44,7 +44,7 @@ class MassDelete extends \Magento\Backend\App\Action * @return \Magento\Backend\Model\View\Result\Redirect * @throws \Magento\Framework\Exception\LocalizedException|\Exception */ - public function execute() + public function executeInternal() { $collection = $this->filter->getCollection($this->collectionFactory->create()); $collectionSize = $collection->getSize(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/NewAction.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/NewAction.php index bc87b5cb8089fd63d13fadfea4adc631e1310f6b..29e37ffeaef273b629813eac5cd17301d09bb4f7 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/NewAction.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/NewAction.php @@ -32,7 +32,7 @@ class NewAction extends \Magento\Cms\Controller\Adminhtml\Block * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php index c6e17f07cbfeecd5167f03bfab480de6084a3128..9582e89c995b269487f7d4a86a11078230d428e2 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php @@ -13,7 +13,7 @@ class Save extends \Magento\Cms\Controller\Adminhtml\Block * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget/Chooser.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget/Chooser.php index e785e256d97b3fa57c18bd37f2b0bd5ac51cbef8..363805df349e7beaa00506f63e3734749b909b1c 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget/Chooser.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget/Chooser.php @@ -39,7 +39,7 @@ class Chooser extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Layout $layout */ $layout = $this->layoutFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Delete.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Delete.php index 278515e3f101773c5ba196e9e77dfc8896ac4d0a..3ae84ce63e76443e4f97d0c7a58ffee9afbd9af6 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Delete.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Delete.php @@ -21,7 +21,7 @@ class Delete extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { // check if we know what should be deleted $id = $this->getRequest()->getParam('page_id'); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Edit.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Edit.php index c53641376c471c985556de4e84792749fdf8ca42..716e51bc0b4bd05a50499ec6f16ba8e7ad390bf5 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Edit.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Edit.php @@ -67,7 +67,7 @@ class Edit extends \Magento\Backend\App\Action * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Redirect * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { // 1. Get ID and create model $id = $this->getRequest()->getParam('page_id'); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Index.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Index.php index 61405419a007bd574a91981a35367b0af69336f0..7be6ad88b7b5888c5be6da1270927ad89797fe29 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Index.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Index.php @@ -42,7 +42,7 @@ class Index extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/InlineEdit.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/InlineEdit.php index 52882ff71fddf063388e2a6139606ea86610d36f..762d5384afec9d8bf1f9a49f29e0a4373a48086b 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/InlineEdit.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/InlineEdit.php @@ -47,7 +47,7 @@ class InlineEdit extends \Magento\Backend\App\Action /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->jsonFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php index 45314ebf2d9e15eb7c309a7bef47bbbaac838ccc..9ab84769739b8ba3e2e2428aadafa212f6da9576 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDelete.php @@ -43,7 +43,7 @@ class MassDelete extends \Magento\Backend\App\Action * @return \Magento\Backend\Model\View\Result\Redirect * @throws \Magento\Framework\Exception\LocalizedException|\Exception */ - public function execute() + public function executeInternal() { $collection = $this->filter->getCollection($this->collectionFactory->create()); $collectionSize = $collection->getSize(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDisable.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDisable.php index 8d8da00375cd22a85bfd4f90b7f3ebb9eb920e16..cda4e802f06989b3fde123d26d3ad088a4e496fe 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDisable.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassDisable.php @@ -43,7 +43,7 @@ class MassDisable extends \Magento\Backend\App\Action * @return \Magento\Backend\Model\View\Result\Redirect * @throws \Magento\Framework\Exception\LocalizedException|\Exception */ - public function execute() + public function executeInternal() { $collection = $this->filter->getCollection($this->collectionFactory->create()); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassEnable.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassEnable.php index aa44d34ea78618f26ed735ae5f5e55ca2601f003..a904249e653a05a5e349f20b10420db9897d6e28 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/MassEnable.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/MassEnable.php @@ -43,7 +43,7 @@ class MassEnable extends \Magento\Backend\App\Action * @return \Magento\Backend\Model\View\Result\Redirect * @throws \Magento\Framework\Exception\LocalizedException|\Exception */ - public function execute() + public function executeInternal() { $collection = $this->filter->getCollection($this->collectionFactory->create()); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/NewAction.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/NewAction.php index 100c0b05f2a0fc8ce7c85df2a8c0c59839b92752..9f816a59252058767aadc55db517a6e0539e8f28 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/NewAction.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/NewAction.php @@ -38,7 +38,7 @@ class NewAction extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php index 6858ef9cadf1014d5edd9842035e028847728806..276073e1e96789af8a6e04bb0b395d97250dec37 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php @@ -38,7 +38,7 @@ class Save extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget/Chooser.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget/Chooser.php index 49e8206f822fa07158335c767c0fb19d67e3b1a8..493ae73a83ddb45b065a4ce83314943e2f83a4f2 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget/Chooser.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget/Chooser.php @@ -40,7 +40,7 @@ class Chooser extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $uniqId = $this->getRequest()->getParam('uniq_id'); /** @var \Magento\Framework\View\Layout $layout */ diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Directive.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Directive.php index 51d1fc3502be0f18fea71866c28440aac770c136..05e6350da2bb93fe1de6c405353a4f9ff79eb064 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Directive.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Directive.php @@ -40,7 +40,7 @@ class Directive extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $directive = $this->getRequest()->getParam('___directive'); $directive = $this->urlDecoder->decode($directive); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Contents.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Contents.php index 0b1155258377a7144234d4bf6333bc842d489cd5..05c8912acf8d2e3b6ada14d0bc084996b6b728b3 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Contents.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Contents.php @@ -53,7 +53,7 @@ class Contents extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { try { $this->_initAction()->_saveSessionCurrentPath(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php index 73389122633f1ccb2dca17a283aadc247aa87a8d..1af7705253569acf39116209f0922dd2ce1fb8b5 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php @@ -43,7 +43,7 @@ class DeleteFiles extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { try { if (!$this->getRequest()->isPost()) { diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php index 2566d3159e47103ffc2dbcc22420a9bd904241fa..45a85b1d009d56872a0314b79e02ccf65fdb652c 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php @@ -40,7 +40,7 @@ class DeleteFolder extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { try { $path = $this->getStorage()->getCmsWysiwygImages()->getCurrentPath(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Index.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Index.php index 3c22b5fbcb0179f0b43e1de22a82dd033e2c9673..eacf2cb6268a2787f44540e1bd9f47916426d040 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Index.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Index.php @@ -32,7 +32,7 @@ class Index extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $storeId = (int)$this->getRequest()->getParam('store'); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php index 24240b5ab25e7ce921706eb32a34b3688c1318da..8077f38a5a44f450471ede601da40813ae3e459b 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php @@ -32,7 +32,7 @@ class NewFolder extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { try { $this->_initAction(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php index 738cba1295e40a49e57ad3c791d2aafed0cc8fc1..b0d4818b940ffd5c4958b7205a85e8e1b995c098 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php @@ -32,7 +32,7 @@ class OnInsert extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $helper = $this->_objectManager->get('Magento\Cms\Helper\Wysiwyg\Images'); $storeId = $this->getRequest()->getParam('store'); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Thumbnail.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Thumbnail.php index a5a2d6bbc2a1e29fa867f56b9111dee77e486c70..9412c2471a0baccaae472609ef3d60dc511c4baa 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Thumbnail.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Thumbnail.php @@ -35,7 +35,7 @@ class Thumbnail extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $file = $this->getRequest()->getParam('file'); $file = $this->_objectManager->get('Magento\Cms\Helper\Wysiwyg\Images')->idDecode($file); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/TreeJson.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/TreeJson.php index 9d70dd5a038de40c035962a5230ff3ad9d6789d6..1690cb3d708c3f08710ffe860d930dc108bd3403 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/TreeJson.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/TreeJson.php @@ -40,7 +40,7 @@ class TreeJson extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultJsonFactory->create(); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php index b05ff1ac92bd142d687d9647d0aa666be4e62fc4..0811d0572db55a164b7c2826a61c536c37eec601 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php @@ -32,7 +32,7 @@ class Upload extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { try { $this->_initAction(); diff --git a/app/code/Magento/Cms/Controller/Index/DefaultNoRoute.php b/app/code/Magento/Cms/Controller/Index/DefaultNoRoute.php index 91cb0939634425eed81516f2142634b34fffa44c..51c6ec15a249ec45eafcf5d8852744e5d784d4d0 100644 --- a/app/code/Magento/Cms/Controller/Index/DefaultNoRoute.php +++ b/app/code/Magento/Cms/Controller/Index/DefaultNoRoute.php @@ -27,7 +27,7 @@ class DefaultNoRoute extends \Magento\Framework\App\Action\Action /** * @return \Magento\Framework\View\Result\LayoutFactory */ - public function execute() + public function executeInternal() { $resultLayout = $this->resultPageFactory->create(); $resultLayout->setStatusHeader(404, '1.1', 'Not Found'); diff --git a/app/code/Magento/Cms/Controller/Index/Index.php b/app/code/Magento/Cms/Controller/Index/Index.php index fe007e0d5173d63e33d4af772688f25ed95972e9..969ad75a366e752c6054a0d8436f97653001cd39 100644 --- a/app/code/Magento/Cms/Controller/Index/Index.php +++ b/app/code/Magento/Cms/Controller/Index/Index.php @@ -32,7 +32,7 @@ class Index extends \Magento\Framework\App\Action\Action * @return \Magento\Framework\Controller\Result\Forward * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function execute($coreRoute = null) + public function executeInternal($coreRoute = null) { $pageId = $this->_objectManager->get( 'Magento\Framework\App\Config\ScopeConfigInterface' diff --git a/app/code/Magento/Cms/Controller/Noroute/Index.php b/app/code/Magento/Cms/Controller/Noroute/Index.php index 18c4d2181474ebd4e1b465b2e0ee14b0852bc9c5..16d67c38a81619e8770a6feda79bb9cec8c8416f 100644 --- a/app/code/Magento/Cms/Controller/Noroute/Index.php +++ b/app/code/Magento/Cms/Controller/Noroute/Index.php @@ -30,7 +30,7 @@ class Index extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $pageId = $this->_objectManager->get( 'Magento\Framework\App\Config\ScopeConfigInterface', diff --git a/app/code/Magento/Cms/Controller/Page/View.php b/app/code/Magento/Cms/Controller/Page/View.php index 4775fc3fe9358127e9d6bc060109b8e6d5516b65..0c185380200c12c907ae892a620ba05e830c5a7d 100644 --- a/app/code/Magento/Cms/Controller/Page/View.php +++ b/app/code/Magento/Cms/Controller/Page/View.php @@ -30,7 +30,7 @@ class View extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $pageId = $this->getRequest()->getParam('page_id', $this->getRequest()->getParam('id', false)); $resultPage = $this->_objectManager->get('Magento\Cms\Helper\Page')->prepareResultPage($this, $pageId); diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php index c32d11572cf67c614602101942ffd23e47a62614..08c23452659625d885b293812f3839f544743b7c 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php @@ -148,7 +148,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->deleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->deleteController->executeInternal()); } public function testDeleteActionNoId() @@ -168,7 +168,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->deleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->deleteController->executeInternal()); } public function testDeleteActionThrowsException() @@ -195,6 +195,6 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with('*/*/edit', ['block_id' => $this->blockId]) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->deleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->deleteController->executeInternal()); } } diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/EditTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/EditTest.php index b2432abc0cbde3d8a156e2f2bd75f9234e697890..a48b5b69ea8b4ac46cdf57bcad7b3f4dff87f3b5 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/EditTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/EditTest.php @@ -154,7 +154,7 @@ class EditTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->editController->execute()); + $this->assertSame($this->resultRedirectMock, $this->editController->executeInternal()); } /** @@ -220,7 +220,7 @@ class EditTest extends \PHPUnit_Framework_TestCase ->method('getConfig') ->willReturn($pageConfigMock); - $this->assertSame($resultPageMock, $this->editController->execute()); + $this->assertSame($resultPageMock, $this->editController->executeInternal()); } /** diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/MassDeleteTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/MassDeleteTest.php index 81164feafac104415a7650395d6db20f3ac232fe..4c52ac86c94b90c529eabb2db07180114ec867c7 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/MassDeleteTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/MassDeleteTest.php @@ -80,7 +80,7 @@ class MassDeleteTest extends AbstractMassActionTest ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->massDeleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->massDeleteController->executeInternal()); } /** diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php index 0a1c7be6c9541410f366bf990226502df6a61f8f..04f6ac3f0816196b291fb377da5bc464b03ed984 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php @@ -216,14 +216,14 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->resultRedirect->expects($this->atLeastOnce())->method('setPath')->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->saveController->execute()); + $this->assertSame($this->resultRedirect, $this->saveController->executeInternal()); } public function testSaveActionWithoutData() { $this->requestMock->expects($this->any())->method('getPostValue')->willReturn(false); $this->resultRedirect->expects($this->atLeastOnce())->method('setPath')->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->saveController->execute()); + $this->assertSame($this->resultRedirect, $this->saveController->executeInternal()); } public function testSaveActionNoId() @@ -256,7 +256,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->resultRedirect->expects($this->atLeastOnce())->method('setPath')->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->saveController->execute()); + $this->assertSame($this->resultRedirect, $this->saveController->executeInternal()); } public function testSaveAndContinue() @@ -303,7 +303,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('*/*/edit', ['block_id' => $this->blockId]) ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->saveController->execute()); + $this->assertSame($this->resultRedirect, $this->saveController->executeInternal()); } public function testSaveActionThrowsException() @@ -352,6 +352,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('*/*/edit', ['block_id' => $this->blockId]) ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->saveController->execute()); + $this->assertSame($this->resultRedirect, $this->saveController->executeInternal()); } } diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/DeleteTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/DeleteTest.php index 4d2b25a708ddf5047d781ec2d34ad33a528c687d..e218e22421c6190cf1e483aecb7fbd4592312273 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/DeleteTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/DeleteTest.php @@ -146,7 +146,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->deleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->deleteController->executeInternal()); } public function testDeleteActionNoId() @@ -166,7 +166,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->deleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->deleteController->executeInternal()); } public function testDeleteActionThrowsException() @@ -210,6 +210,6 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with('*/*/edit', ['page_id' => $this->pageId]) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->deleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->deleteController->executeInternal()); } } diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/InlineEditTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/InlineEditTest.php index 8402fbc8f3b7fcdb71109b759c8d6b4a7867eb72..3024c271a3e904748e6f699b78891dd9220728e8 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/InlineEditTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/InlineEditTest.php @@ -163,7 +163,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ]) ->willReturnSelf(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } public function testExecuteWithRuntimeException() @@ -184,7 +184,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ]) ->willReturnSelf(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } public function testExecuteWithException() @@ -205,7 +205,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ]) ->willReturnSelf(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } public function testExecuteWithoutData() @@ -231,7 +231,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ]) ->willReturnSelf(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } public function testSetCmsPageData() diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDeleteTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDeleteTest.php index 98a5df2b6190bc5571ca1843f836330e07dbb569..72cd0cedba3184936cc976c8c8f7f27b1cd04205 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDeleteTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDeleteTest.php @@ -80,7 +80,7 @@ class MassDeleteTest extends AbstractMassActionTest ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->massDeleteController->execute()); + $this->assertSame($this->resultRedirectMock, $this->massDeleteController->executeInternal()); } /** diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDisableTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDisableTest.php index 688cc87fa09e35b1da68abf3d79fcee425a00a97..f8d82e0b8631e835f3c0f942355847a043f91f9b 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDisableTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassDisableTest.php @@ -85,7 +85,7 @@ class MassDisableTest extends AbstractMassActionTest ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->massDisableController->execute()); + $this->assertSame($this->resultRedirectMock, $this->massDisableController->executeInternal()); } /** diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassEnableTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassEnableTest.php index 661231aa012bb4ccd4614a845cf47465f19dc527..f7460ae29cb5c3f5f9492061a49d549350f36549 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassEnableTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/MassEnableTest.php @@ -85,7 +85,7 @@ class MassEnableTest extends AbstractMassActionTest ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->massEnableController->execute()); + $this->assertSame($this->resultRedirectMock, $this->massEnableController->executeInternal()); } /** diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Wysiwyg/DirectiveTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Wysiwyg/DirectiveTest.php index 7d0ec584d46755e871a355c748937cccf94b2364..b0120b54ae06ea0f8ad722c91c60cb552fdd7e97 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Wysiwyg/DirectiveTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Wysiwyg/DirectiveTest.php @@ -157,7 +157,7 @@ class DirectiveTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Cms\Controller\Adminhtml\Wysiwyg\Directive::execute + * @covers \Magento\Cms\Controller\Adminhtml\Wysiwyg\Directive::executeInternal */ public function testExecute() { @@ -188,12 +188,12 @@ class DirectiveTest extends \PHPUnit_Framework_TestCase $this->assertSame( $this->rawMock, - $this->wysiwygDirective->execute() + $this->wysiwygDirective->executeInternal() ); } /** - * @covers \Magento\Cms\Controller\Adminhtml\Wysiwyg\Directive::execute + * @covers \Magento\Cms\Controller\Adminhtml\Wysiwyg\Directive::executeInternal */ public function testExecuteException() { @@ -236,7 +236,7 @@ class DirectiveTest extends \PHPUnit_Framework_TestCase $this->assertSame( $this->rawMock, - $this->wysiwygDirective->execute() + $this->wysiwygDirective->executeInternal() ); } diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Block/InlineEditTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Block/InlineEditTest.php index 85cab72d2aa45ed023e378ff2b96e0d931be628a..37872f893c335ad13778de1d935556fda2fdd520 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Block/InlineEditTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Block/InlineEditTest.php @@ -131,7 +131,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ]) ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithoutData() @@ -157,6 +157,6 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ]) ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Index/IndexTest.php index 3b4ecc8ee107011d0271ede942c226a198e065b2..10bb82ac001f96bc53a36f400a48f24802698e63 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Index/IndexTest.php @@ -96,7 +96,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->method('prepareResultPage') ->with($this->controller, $this->pageId) ->willReturn($this->resultPageMock); - $this->assertSame($this->resultPageMock, $this->controller->execute()); + $this->assertSame($this->resultPageMock, $this->controller->executeInternal()); } public function testExecuteResultForward() @@ -105,6 +105,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->method('forward') ->with('defaultIndex') ->willReturnSelf(); - $this->assertSame($this->forwardMock, $this->controller->execute()); + $this->assertSame($this->forwardMock, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Noroute/IndexTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Noroute/IndexTest.php index 4ff2bcaa7520004ce9f6e0a561e30f9ca8a25c26..444a1d767250e1bb6337253c54ee59fe45f2f44b 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Noroute/IndexTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Noroute/IndexTest.php @@ -113,7 +113,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ); $this->assertSame( $this->resultPageMock, - $this->_controller->execute() + $this->_controller->executeInternal() ); } @@ -146,7 +146,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ); $this->assertSame( $this->forwardMock, - $this->_controller->execute() + $this->_controller->executeInternal() ); } } diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Page/ViewTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Page/ViewTest.php index df009be3bb0c7a71d9d0f7040d4215b40c7a7003..5c15f13b9317a6acafc16265190a78c7174244ba 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Page/ViewTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Page/ViewTest.php @@ -89,7 +89,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase ->method('prepareResultPage') ->with($this->controller, $this->pageId) ->willReturn($this->resultPageMock); - $this->assertSame($this->resultPageMock, $this->controller->execute()); + $this->assertSame($this->resultPageMock, $this->controller->executeInternal()); } public function testExecuteResultForward() @@ -106,6 +106,6 @@ class ViewTest extends \PHPUnit_Framework_TestCase ->method('forward') ->with('noroute') ->willReturnSelf(); - $this->assertSame($this->forwardMock, $this->controller->execute()); + $this->assertSame($this->forwardMock, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Cms/i18n/de_DE.csv b/app/code/Magento/Cms/i18n/de_DE.csv index 09eb96234df10a47b690764805513bf260645591..e3dc8b9b189c695de297a33e56f1528356a047eb 100644 --- a/app/code/Magento/Cms/i18n/de_DE.csv +++ b/app/code/Magento/Cms/i18n/de_DE.csv @@ -119,3 +119,8 @@ Template,Vorlage "CMS Static Block","CMS statischer Block" "Contents of a Static Block","Inhalte eines statischen Blocks" "CMS Static Block Default Template","CMS statischer Block Standardvorlage" +Elements,Elements +Blocks,Blocks +Widgets,Widgets +Themes,Themes +Schedule,Schedule diff --git a/app/code/Magento/Cms/i18n/en_US.csv b/app/code/Magento/Cms/i18n/en_US.csv index 03a82317472dc7df606cb40782c2eeca7954a2d8..58485f3d9d2c5193bd5f6ecc2a1f7fa05e13cb1f 100644 --- a/app/code/Magento/Cms/i18n/en_US.csv +++ b/app/code/Magento/Cms/i18n/en_US.csv @@ -119,3 +119,8 @@ Template,Template "CMS Static Block","CMS Static Block" "Contents of a Static Block","Contents of a Static Block" "CMS Static Block Default Template","CMS Static Block Default Template" +Elements,Elements +Blocks,Blocks +Widgets,Widgets +Themes,Themes +Schedule,Schedule diff --git a/app/code/Magento/Cms/i18n/es_ES.csv b/app/code/Magento/Cms/i18n/es_ES.csv index 90bcb395cd0570d7961667d5e8b1e7927dd1a326..62584b6799530621a270f7d7e383236985bfd2b6 100644 --- a/app/code/Magento/Cms/i18n/es_ES.csv +++ b/app/code/Magento/Cms/i18n/es_ES.csv @@ -119,3 +119,8 @@ Template,Plantilla "CMS Static Block","Bloque estático CMS" "Contents of a Static Block","Cotenidos de un bloque estático" "CMS Static Block Default Template","Tema por defecto del bloque estático CMS" +Elements,Elements +Blocks,Blocks +Widgets,Widgets +Themes,Themes +Schedule,Schedule diff --git a/app/code/Magento/Cms/i18n/fr_FR.csv b/app/code/Magento/Cms/i18n/fr_FR.csv index 3feb0add8c11d203677a235adb6e4f3c4b9846e8..92e0c3ab029d77f7bfa6806f5ebfd3bc8e9ae5fa 100644 --- a/app/code/Magento/Cms/i18n/fr_FR.csv +++ b/app/code/Magento/Cms/i18n/fr_FR.csv @@ -119,3 +119,8 @@ Template,"Modèle visuel" "CMS Static Block","Bloc statique du CMS" "Contents of a Static Block","Contenu des blocs statiques" "CMS Static Block Default Template","Modèle de bloc statique par défaut du CMS" +Elements,Elements +Blocks,Blocks +Widgets,Widgets +Themes,Themes +Schedule,Schedule diff --git a/app/code/Magento/Cms/i18n/nl_NL.csv b/app/code/Magento/Cms/i18n/nl_NL.csv index 259123f1fe6e20312d69e9491575193b9d5b1122..ef34949cc0eb94c03568e7980577ec2c07c11e62 100644 --- a/app/code/Magento/Cms/i18n/nl_NL.csv +++ b/app/code/Magento/Cms/i18n/nl_NL.csv @@ -119,3 +119,8 @@ Template,Thema "CMS Static Block","CMS statisch blok" "Contents of a Static Block","Inhoud van een statisch blok" "CMS Static Block Default Template","CMS statisch blok standaard thema" +Elements,Elements +Blocks,Blocks +Widgets,Widgets +Themes,Themes +Schedule,Schedule diff --git a/app/code/Magento/Cms/i18n/pt_BR.csv b/app/code/Magento/Cms/i18n/pt_BR.csv index daf3cf4a6f53e4aabc1948ae39ddff01b1436004..706c52533cad0f4a4f10f2c98bb855a7ea7c8aaa 100644 --- a/app/code/Magento/Cms/i18n/pt_BR.csv +++ b/app/code/Magento/Cms/i18n/pt_BR.csv @@ -119,3 +119,8 @@ Template,Modelo "CMS Static Block","Bloco Estático do CMS" "Contents of a Static Block","Conteúdos de um Bloco Estático" "CMS Static Block Default Template","Template Padrão do Bloco Estático do CMS" +Elements,Elements +Blocks,Blocks +Widgets,Widgets +Themes,Themes +Schedule,Schedule diff --git a/app/code/Magento/Cms/i18n/zh_Hans_CN.csv b/app/code/Magento/Cms/i18n/zh_Hans_CN.csv index e27e81aa3b8ef4737e17e9af0c97b88f530852aa..338aa81bc8cfb6af9925f72e57e3b90c80dc151d 100644 --- a/app/code/Magento/Cms/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Cms/i18n/zh_Hans_CN.csv @@ -119,3 +119,8 @@ Template,æ¨¡æ¿ "CMS Static Block","CMS 陿€åŒºå—" "Contents of a Static Block",陿€åŒºå—的内容 "CMS Static Block Default Template","CMS 陿€åŒºå—默认模æ¿" +Elements,Elements +Blocks,Blocks +Widgets,Widgets +Themes,Themes +Schedule,Schedule diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml index 6934d263535b59bde9a0a6c72ead01ec3dc0e0c0..6775549e39d49d9b1d097c99861a8683b164ab1f 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml @@ -85,6 +85,14 @@ <item name="provider" xsi:type="string">cms_block_listing.cms_block_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.filters</item> </item> + <item name="templates" xsi:type="array"> + <item name="filters" xsi:type="array"> + <item name="select" xsi:type="array"> + <item name="component" xsi:type="string">Magento_Ui/js/form/element/ui-select</item> + <item name="template" xsi:type="string">ui/grid/filters/elements/ui-select</item> + </item> + </item> + </item> <item name="childDefaults" xsi:type="array"> <item name="provider" xsi:type="string">cms_block_listing.cms_block_listing.listing_top.listing_filters</item> <item name="imports" xsi:type="array"> diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml index c55c919be2164d32927ef1dce7d2933fcfb178da..27cc3ddc2e019535e117e1ba519a48c7264ee7cd 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml @@ -86,6 +86,14 @@ <item name="provider" xsi:type="string">cms_page_listing.cms_page_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.filters</item> </item> + <item name="templates" xsi:type="array"> + <item name="filters" xsi:type="array"> + <item name="select" xsi:type="array"> + <item name="component" xsi:type="string">Magento_Ui/js/form/element/ui-select</item> + <item name="template" xsi:type="string">ui/grid/filters/elements/ui-select</item> + </item> + </item> + </item> <item name="childDefaults" xsi:type="array"> <item name="provider" xsi:type="string">cms_page_listing.cms_page_listing.listing_top.listing_filters</item> <item name="imports" xsi:type="array"> diff --git a/app/code/Magento/Cms/view/frontend/templates/default/home.phtml b/app/code/Magento/Cms/view/frontend/templates/default/home.phtml index 9c51cd0004f6c28cafd1c583841a6fdb6c7b0c4e..4fae6ce09006f455f289f4be5de61304d1f97e22 100644 --- a/app/code/Magento/Cms/view/frontend/templates/default/home.phtml +++ b/app/code/Magento/Cms/view/frontend/templates/default/home.phtml @@ -4,4 +4,4 @@ * See COPYING.txt for license details. */ ?> -There was no Home CMS page configured or found. +There was no Home CMS page configured or found. \ No newline at end of file diff --git a/app/code/Magento/Config/Controller/Adminhtml/System/AbstractConfig.php b/app/code/Magento/Config/Controller/Adminhtml/System/AbstractConfig.php index 92e50151a7519940fa5028412decc64cee5836c0..57b28ebdd42f61f2e836993b8c9aee36fd018cbd 100644 --- a/app/code/Magento/Config/Controller/Adminhtml/System/AbstractConfig.php +++ b/app/code/Magento/Config/Controller/Adminhtml/System/AbstractConfig.php @@ -44,12 +44,12 @@ abstract class AbstractConfig extends \Magento\Backend\App\AbstractAction * @param \Magento\Framework\App\RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(\Magento\Framework\App\RequestInterface $request) + public function execute(\Magento\Framework\App\RequestInterface $request) { if (!$request->getParam('section')) { $request->setParam('section', $this->_configStructure->getFirstSection()->getId()); } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Edit.php b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Edit.php index 9f8bf3a73f1778c792403d964c4ab4f0a7e20d1f..ad25ce834a507d4b41eed837711228699c7ed2f3 100644 --- a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Edit.php +++ b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Edit.php @@ -36,7 +36,7 @@ class Edit extends AbstractScopeConfig * * @return \Magento\Framework\App\ResponseInterface|void */ - public function execute() + public function executeInternal() { $current = $this->getRequest()->getParam('section'); $website = $this->getRequest()->getParam('website'); diff --git a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Index.php b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Index.php index 2513c9cb00f888802e7401bbf5a216c8589da695..f92619feb0466f51f27ceda29dca5c2495fe1b6f 100644 --- a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Index.php +++ b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Index.php @@ -36,7 +36,7 @@ class Index extends AbstractScopeConfig * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php index d18c4ffc4bc510b9d0d8cd14953313adae6d7248..6dea5197bb42811761d088f3034c7187fd964ab6 100644 --- a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php +++ b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php @@ -141,7 +141,7 @@ class Save extends AbstractConfig * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { // custom save logic diff --git a/app/code/Magento/Config/Controller/Adminhtml/System/Config/State.php b/app/code/Magento/Config/Controller/Adminhtml/System/Config/State.php index d1f299e6a32a09df73b953929227a8895a5082ec..9ac46a6dcb3297fdb6649c42cb249b79783111cf 100644 --- a/app/code/Magento/Config/Controller/Adminhtml/System/Config/State.php +++ b/app/code/Magento/Config/Controller/Adminhtml/System/Config/State.php @@ -36,7 +36,7 @@ class State extends AbstractScopeConfig * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('isAjax') && $this->getRequest()->getParam('container') != '' diff --git a/app/code/Magento/Config/Model/Config/Backend/Admin/Custom.php b/app/code/Magento/Config/Model/Config/Backend/Admin/Custom.php index bdb08b0f04b2a12cf29790028a9ef313ca107c92..2e7a81b073022cce10e6aaec61816fe3770e16ae 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Admin/Custom.php +++ b/app/code/Magento/Config/Model/Config/Backend/Admin/Custom.php @@ -58,6 +58,7 @@ class Custom extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\Storage\WriterInterface $configWriter * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -67,13 +68,14 @@ class Custom extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\Storage\WriterInterface $configWriter, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_configWriter = $configWriter; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -122,6 +124,6 @@ class Custom extends \Magento\Framework\App\Config\Value ); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Admin/Robots.php b/app/code/Magento/Config/Model/Config/Backend/Admin/Robots.php index 50478bfb7b8ef92f17650328881fe12422aefe73..b5932d1c1194149de5c5daff6d1ec9adffb6b208 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Admin/Robots.php +++ b/app/code/Magento/Config/Model/Config/Backend/Admin/Robots.php @@ -27,6 +27,7 @@ class Robots extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Filesystem $filesystem * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -36,12 +37,13 @@ class Robots extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Filesystem $filesystem, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->_directory = $filesystem->getDirectoryWrite(DirectoryList::ROOT); $this->_file = 'robots.txt'; } diff --git a/app/code/Magento/Config/Model/Config/Backend/Admin/Usecustom.php b/app/code/Magento/Config/Model/Config/Backend/Admin/Usecustom.php index ff429986e3afd735f1801ccc88384124ff998f3b..22fbbfff6c66a7ccd8443d199e3d3c9cfd45bd38 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Admin/Usecustom.php +++ b/app/code/Magento/Config/Model/Config/Backend/Admin/Usecustom.php @@ -22,6 +22,7 @@ class Usecustom extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\Storage\WriterInterface $configWriter * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -31,13 +32,14 @@ class Usecustom extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\Storage\WriterInterface $configWriter, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_configWriter = $configWriter; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -81,6 +83,6 @@ class Usecustom extends \Magento\Framework\App\Config\Value ); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Admin/Usesecretkey.php b/app/code/Magento/Config/Model/Config/Backend/Admin/Usesecretkey.php index 3f77e3b07d1768fb90c10926be824a9e7ed3defe..7417f57ae5fe5711c5a86b3adfb14c6f9ea9f175 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Admin/Usesecretkey.php +++ b/app/code/Magento/Config/Model/Config/Backend/Admin/Usesecretkey.php @@ -20,6 +20,7 @@ class Usesecretkey extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Backend\Model\UrlInterface $backendUrl * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -29,13 +30,14 @@ class Usesecretkey extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Backend\Model\UrlInterface $backendUrl, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_backendUrl = $backendUrl; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -44,6 +46,6 @@ class Usesecretkey extends \Magento\Framework\App\Config\Value public function afterSave() { $this->_backendUrl->renewSecretUrls(); - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Baseurl.php b/app/code/Magento/Config/Model/Config/Backend/Baseurl.php index 30e63b7d2bee2e1489a8793e559a9121884c5e09..9cf3ae709c72ab53e6243931b13dc202fd02e557 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Baseurl.php +++ b/app/code/Magento/Config/Model/Config/Backend/Baseurl.php @@ -16,6 +16,7 @@ class Baseurl extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\View\Asset\MergeService $mergeService * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -25,13 +26,14 @@ class Baseurl extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\View\Asset\MergeService $mergeService, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_mergeService = $mergeService; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -198,7 +200,7 @@ class Baseurl extends \Magento\Framework\App\Config\Value /** * Clean compiled JS/CSS when updating url configuration settings * - * @return void + * @return $this */ public function afterSave() { @@ -212,5 +214,6 @@ class Baseurl extends \Magento\Framework\App\Config\Value break; } } + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Currency/AbstractCurrency.php b/app/code/Magento/Config/Model/Config/Backend/Currency/AbstractCurrency.php index 3daccc80463256313a6861a926267720752dd20c..42c589c06a9910ac555ac82f3d584db5d30e1b95 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Currency/AbstractCurrency.php +++ b/app/code/Magento/Config/Model/Config/Backend/Currency/AbstractCurrency.php @@ -15,37 +15,6 @@ namespace Magento\Config\Model\Config\Backend\Currency; abstract class AbstractCurrency extends \Magento\Framework\App\Config\Value { - /** - * Core store config - * - * @var \Magento\Framework\App\Config\ScopeConfigInterface - */ - protected $_scopeConfig; - - /** - * Constructor - * - * @param \Magento\Framework\Model\Context $context - * @param \Magento\Framework\Registry $registry - * @param \Magento\Framework\App\Config\ScopeConfigInterface $config - * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource - * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection - * @param array $data - */ - public function __construct( - \Magento\Framework\Model\Context $context, - \Magento\Framework\Registry $registry, - \Magento\Framework\App\Config\ScopeConfigInterface $config, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, - \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, - \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] - ) { - $this->_scopeConfig = $scopeConfig; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); - } - /** * Retrieve allowed currencies for current scope * @@ -75,7 +44,7 @@ abstract class AbstractCurrency extends \Magento\Framework\App\Config\Value { return explode( ',', - $this->_scopeConfig->getValue( + $this->_config->getValue( 'system/currency/installed', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ) diff --git a/app/code/Magento/Config/Model/Config/Backend/Currency/Allow.php b/app/code/Magento/Config/Model/Config/Backend/Currency/Allow.php index cd9a7e643d30918179adb758cd8aba11c1a2b475..43de443d561079bd42fc0581859ccba8f080c629 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Currency/Allow.php +++ b/app/code/Magento/Config/Model/Config/Backend/Currency/Allow.php @@ -21,7 +21,7 @@ class Allow extends AbstractCurrency * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config - * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Locale\CurrencyInterface $localeCurrency * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -31,14 +31,14 @@ class Allow extends AbstractCurrency \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Locale\CurrencyInterface $localeCurrency, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_localeCurrency = $localeCurrency; - parent::__construct($context, $registry, $config, $scopeConfig, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -71,6 +71,6 @@ class Allow extends AbstractCurrency throw new \Magento\Framework\Exception\LocalizedException(__(join("\n", $exceptions))); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Currency/Base.php b/app/code/Magento/Config/Model/Config/Backend/Currency/Base.php index 45470cc06a2a2c1ffe34519cd00ac79fa644b7aa..733bf014bd74db46c25312f6bf7aad8198310a27 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Currency/Base.php +++ b/app/code/Magento/Config/Model/Config/Backend/Currency/Base.php @@ -19,7 +19,7 @@ class Base extends AbstractCurrency * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config - * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -29,13 +29,13 @@ class Base extends AbstractCurrency \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Directory\Model\CurrencyFactory $currencyFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $scopeConfig, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->currencyFactory = $currencyFactory; } @@ -55,6 +55,6 @@ class Base extends AbstractCurrency } $this->currencyFactory->create()->saveRates([$value =>[$value => 1]]); - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Currency/Cron.php b/app/code/Magento/Config/Model/Config/Backend/Currency/Cron.php index c88d752c82f196b2dce920564343209b7a03c397..dc8afc6b66217ad85ff7542a7320c7fc5cee85eb 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Currency/Cron.php +++ b/app/code/Magento/Config/Model/Config/Backend/Currency/Cron.php @@ -21,6 +21,7 @@ class Cron extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\ValueFactory $configValueFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -30,17 +31,18 @@ class Cron extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\ValueFactory $configValueFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_configValueFactory = $configValueFactory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** - * @return void + * @return $this * @throws \Exception */ public function afterSave() @@ -69,5 +71,6 @@ class Cron extends \Magento\Framework\App\Config\Value } catch (\Exception $e) { throw new \Exception(__('We can\'t save the Cron expression.')); } + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php b/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php index 35e8e5688ca0cdf156189145e01abb52d06a7596..a086a674570ef038d8617a39fbee28ef46e1c421 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php +++ b/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php @@ -33,6 +33,6 @@ class DefaultCurrency extends AbstractCurrency ); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Encrypted.php b/app/code/Magento/Config/Model/Config/Backend/Encrypted.php index 71aa76e17b5c90b902e8b8bd6c3029ca65dcf30f..9f4f57e5433b7c9e1acc6e8634a3e682b8a15352 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Encrypted.php +++ b/app/code/Magento/Config/Model/Config/Backend/Encrypted.php @@ -22,6 +22,7 @@ class Encrypted extends \Magento\Framework\App\Config\Value implements * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -31,13 +32,14 @@ class Encrypted extends \Magento\Framework\App\Config\Value implements \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Encryption\EncryptorInterface $encryptor, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_encryptor = $encryptor; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Config/Model/Config/Backend/File.php b/app/code/Magento/Config/Model/Config/Backend/File.php index 8925877efcb03a162d21b0a625bb75b09bfad6da..0f8580e2c50de6feb41b0fb68c48b7c2d4d0636b 100644 --- a/app/code/Magento/Config/Model/Config/Backend/File.php +++ b/app/code/Magento/Config/Model/Config/Backend/File.php @@ -13,6 +13,7 @@ use Magento\Framework\Filesystem; * System config file field backend model * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ class File extends \Magento\Framework\App\Config\Value { @@ -47,6 +48,7 @@ class File extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory * @param \Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface $requestData * @param Filesystem $filesystem @@ -58,6 +60,7 @@ class File extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory, \Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface $requestData, Filesystem $filesystem, @@ -69,7 +72,7 @@ class File extends \Magento\Framework\App\Config\Value $this->_requestData = $requestData; $this->_filesystem = $filesystem; $this->_mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA); - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Config/Model/Config/Backend/Image/Adapter.php b/app/code/Magento/Config/Model/Config/Backend/Image/Adapter.php index a8c3fa288623eff7814c90d1737151f49f5ce839..23e65a6e1d11ca9ad9a03494102a5a1ae5cc249f 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Image/Adapter.php +++ b/app/code/Magento/Config/Model/Config/Backend/Image/Adapter.php @@ -22,6 +22,7 @@ class Adapter extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Image\AdapterFactory $imageFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -31,12 +32,13 @@ class Adapter extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Image\AdapterFactory $imageFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->_imageFactory = $imageFactory; } diff --git a/app/code/Magento/Config/Model/Config/Backend/Locale.php b/app/code/Magento/Config/Model/Config/Backend/Locale.php index c6cec53f26a2f4525d6bfd8c1b24d8248e9c6111..433d8d7717fd2368d8861b5f66ab557f95eb0831 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Locale.php +++ b/app/code/Magento/Config/Model/Config/Backend/Locale.php @@ -37,6 +37,7 @@ class Locale extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Config\Model\ResourceModel\Config\Data\CollectionFactory $configsFactory * @param \Magento\Store\Model\WebsiteFactory $websiteFactory * @param \Magento\Store\Model\StoreFactory $storeFactory @@ -51,6 +52,7 @@ class Locale extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Config\Model\ResourceModel\Config\Data\CollectionFactory $configsFactory, \Magento\Store\Model\WebsiteFactory $websiteFactory, \Magento\Store\Model\StoreFactory $storeFactory, @@ -63,7 +65,7 @@ class Locale extends \Magento\Framework\App\Config\Value $this->_websiteFactory = $websiteFactory; $this->_storeFactory = $storeFactory; $this->_localeCurrency = $localeCurrency; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -120,6 +122,6 @@ class Locale extends \Magento\Framework\App\Config\Value throw new \Magento\Framework\Exception\LocalizedException(__(join("\n", $exceptions))); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Log/Cron.php b/app/code/Magento/Config/Model/Config/Backend/Log/Cron.php index 61695bcf7421e1354aff23bf28f1aa1f1242716b..f278d54ff0d17ab201f33e29f96821ee8368ef4d 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Log/Cron.php +++ b/app/code/Magento/Config/Model/Config/Backend/Log/Cron.php @@ -29,6 +29,7 @@ class Cron extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\ValueFactory $configValueFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -39,6 +40,7 @@ class Cron extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\ValueFactory $configValueFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, @@ -47,13 +49,13 @@ class Cron extends \Magento\Framework\App\Config\Value ) { $this->_configValueFactory = $configValueFactory; $this->_runModelPath = $runModelPath; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** * Cron settings after save * - * @return void + * @return $this * @throws \Magento\Framework\Exception\LocalizedException */ public function afterSave() @@ -91,5 +93,6 @@ class Cron extends \Magento\Framework\App\Config\Value } catch (\Exception $e) { throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t save the Cron expression.')); } + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Secure.php b/app/code/Magento/Config/Model/Config/Backend/Secure.php index ef41a60fe4e562cd012d9676cab78b486251ce97..e933e7d7ef65c22119338667691afa86cd2d6d89 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Secure.php +++ b/app/code/Magento/Config/Model/Config/Backend/Secure.php @@ -15,6 +15,7 @@ class Secure extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\View\Asset\MergeService $mergeService * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -24,24 +25,26 @@ class Secure extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\View\Asset\MergeService $mergeService, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_mergeService = $mergeService; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** * Clean compiled JS/CSS when updating configuration settings * - * @return void + * @return $this */ public function afterSave() { if ($this->isValueChanged()) { $this->_mergeService->cleanMergedJsCss(); } + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Serialized.php b/app/code/Magento/Config/Model/Config/Backend/Serialized.php index 28353119f9740a8d53e70df24b132e14f36e1108..08cb70307420cface91d1e24a3940498cfa4a751 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Serialized.php +++ b/app/code/Magento/Config/Model/Config/Backend/Serialized.php @@ -19,12 +19,13 @@ class Serialized extends \Magento\Framework\App\Config\Value } /** - * @return void + * @return $this */ public function beforeSave() { if (is_array($this->getValue())) { $this->setValue(serialize($this->getValue())); } + return parent::beforeSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Serialized/ArraySerialized.php b/app/code/Magento/Config/Model/Config/Backend/Serialized/ArraySerialized.php index cdfd0653ec789745e77fb00d636aa0a36dcff12e..2a012697da393a4dc8e35109a135de7f229184dc 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Serialized/ArraySerialized.php +++ b/app/code/Magento/Config/Model/Config/Backend/Serialized/ArraySerialized.php @@ -15,7 +15,7 @@ class ArraySerialized extends \Magento\Config\Model\Config\Backend\Serialized /** * Unset array element with '__empty' key * - * @return void + * @return $this */ public function beforeSave() { @@ -24,6 +24,6 @@ class ArraySerialized extends \Magento\Config\Model\Config\Backend\Serialized unset($value['__empty']); } $this->setValue($value); - parent::beforeSave(); + return parent::beforeSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Store.php b/app/code/Magento/Config/Model/Config/Backend/Store.php index 69e629569157ab5adcaa6a272b94c19b65aba653..cd50416ba8076be21e30d90bf30d213b676cd547 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Store.php +++ b/app/code/Magento/Config/Model/Config/Backend/Store.php @@ -20,6 +20,7 @@ class Store extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\MutableScopeConfigInterface $mutableConfig * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -29,17 +30,18 @@ class Store extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\MutableScopeConfigInterface $mutableConfig, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->_mutableConfig = $mutableConfig; } /** - * @return void + * @return $this */ public function afterSave() { @@ -49,5 +51,6 @@ class Store extends \Magento\Framework\App\Config\Value \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); $this->_cacheManager->clean(); + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Backend/Translate.php b/app/code/Magento/Config/Model/Config/Backend/Translate.php index 28b908668f709afe4ed825b5adc1aae4f2ab19b9..6f6ae7071c74df83a6f557e6bdda3fcedfc683b9 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Translate.php +++ b/app/code/Magento/Config/Model/Config/Backend/Translate.php @@ -11,11 +11,6 @@ namespace Magento\Config\Model\Config\Backend; class Translate extends \Magento\Framework\App\Config\Value { - /** - * @var \Magento\Framework\App\Cache\TypeListInterface - */ - protected $_cacheTypeList; - /** * Path to config node with list of caches * @@ -23,40 +18,6 @@ class Translate extends \Magento\Framework\App\Config\Value */ const XML_PATH_INVALID_CACHES = 'dev/translate_inline/invalid_caches'; - /** - * Core store config - * - * @var \Magento\Framework\App\Config\ScopeConfigInterface - */ - protected $_scopeConfig; - - /** - * Constructor - * - * @param \Magento\Framework\Model\Context $context - * @param \Magento\Framework\Registry $registry - * @param \Magento\Framework\App\Config\ScopeConfigInterface $config - * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig - * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource - * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection - * @param array $data - */ - public function __construct( - \Magento\Framework\Model\Context $context, - \Magento\Framework\Registry $registry, - \Magento\Framework\App\Config\ScopeConfigInterface $config, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, - \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, - \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, - \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] - ) { - $this->_scopeConfig = $scopeConfig; - $this->_cacheTypeList = $cacheTypeList; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); - } - /** * Set status 'invalidate' for blocks and other output caches * @@ -65,15 +26,15 @@ class Translate extends \Magento\Framework\App\Config\Value public function afterSave() { $types = array_keys( - $this->_scopeConfig->getValue( + $this->_config->getValue( self::XML_PATH_INVALID_CACHES, \Magento\Store\Model\ScopeInterface::SCOPE_STORE ) ); if ($this->isValueChanged()) { - $this->_cacheTypeList->invalidate($types); + $this->cacheTypeList->invalidate($types); } - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Config/Model/Config/Structure/Reader.php b/app/code/Magento/Config/Model/Config/Structure/Reader.php index 45c04eeb4f01b79f5ce9f61efbd99ab3c8300478..c5a082b32fc21415803b56d2749101aaabaa89ba 100644 --- a/app/code/Magento/Config/Model/Config/Structure/Reader.php +++ b/app/code/Magento/Config/Model/Config/Structure/Reader.php @@ -100,7 +100,7 @@ class Reader extends \Magento\Framework\Config\Reader\Filesystem } } - if ($this->_isValidated) { + if ($this->validationState->isValidationRequired()) { $errors = []; if ($configMerger && !$configMerger->validate($this->_schemaFile, $errors)) { $message = "Invalid Document \n"; diff --git a/app/code/Magento/Config/Test/Unit/Controller/Adminhtml/System/Config/SaveTest.php b/app/code/Magento/Config/Test/Unit/Controller/Adminhtml/System/Config/SaveTest.php index eb5d66c4a62872b5686b064e9121341942cb5ccd..3cbd4c901d1c9a868fe812307226666f1e337c41 100644 --- a/app/code/Magento/Config/Test/Unit/Controller/Adminhtml/System/Config/SaveTest.php +++ b/app/code/Magento/Config/Test/Unit/Controller/Adminhtml/System/Config/SaveTest.php @@ -213,7 +213,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->returnValue($backendConfigMock) ); - $this->assertEquals($this->resultRedirect, $this->_controller->execute()); + $this->assertEquals($this->resultRedirect, $this->_controller->executeInternal()); } public function testIndexActionSaveState() @@ -234,7 +234,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase )->will( $this->returnValue($data) ); - $this->assertEquals($this->resultRedirect, $this->_controller->execute()); + $this->assertEquals($this->resultRedirect, $this->_controller->executeInternal()); } public function testIndexActionGetGroupForSave() @@ -285,7 +285,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ); $backendConfigMock->expects($this->once())->method('save'); - $this->assertEquals($this->resultRedirect, $this->_controller->execute()); + $this->assertEquals($this->resultRedirect, $this->_controller->executeInternal()); } public function testIndexActionSaveAdvanced() @@ -311,6 +311,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase $backendConfigMock->expects($this->once())->method('save'); $this->_cacheMock->expects($this->once())->method('clean')->with(\Zend_Cache::CLEANING_MODE_ALL); - $this->assertEquals($this->resultRedirect, $this->_controller->execute()); + $this->assertEquals($this->resultRedirect, $this->_controller->executeInternal()); } } diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Backend/BaseurlTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Backend/BaseurlTest.php index 38b195ac3363b5671c99cc718ce6c5fdfa739c5d..8f9d418356e0bdab6da12aa0022b8383d88d8239 100644 --- a/app/code/Magento/Config/Test/Unit/Model/Config/Backend/BaseurlTest.php +++ b/app/code/Magento/Config/Test/Unit/Model/Config/Backend/BaseurlTest.php @@ -5,6 +5,7 @@ */ namespace Magento\Config\Test\Unit\Model\Config\Backend; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Store\Model\StoreManagerInterface; use Magento\Store\Model\Store; @@ -12,25 +13,8 @@ class BaseurlTest extends \PHPUnit_Framework_TestCase { public function testSaveMergedJsCssMustBeCleaned() { - $eventDispatcher = $this->getMock('Magento\Framework\Event\ManagerInterface', [], [], '', false); - $appState = $this->getMock('Magento\Framework\App\State', [], [], '', false); - $cacheManager = $this->getMock('Magento\Framework\App\CacheInterface'); - $logger = $this->getMock('Psr\Log\LoggerInterface'); - $actionValidatorMock = $this->getMock( - 'Magento\Framework\Model\ActionValidator\RemoveAction', - [], - [], - '', - false - ); - $context = new \Magento\Framework\Model\Context( - $logger, - $eventDispatcher, - $cacheManager, - $appState, - $actionValidatorMock - ); + $context = (new ObjectManager($this))->getObject('Magento\Framework\Model\Context'); $resource = $this->getMock('Magento\Config\Model\ResourceModel\Config\Data', [], [], '', false); $resource->expects($this->any())->method('addCommitCallback')->will($this->returnValue($resource)); @@ -40,12 +24,18 @@ class BaseurlTest extends \PHPUnit_Framework_TestCase $mergeService = $this->getMock('Magento\Framework\View\Asset\MergeService', [], [], '', false); $coreRegistry = $this->getMock('Magento\Framework\Registry', [], [], '', false); $coreConfig = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface'); - + $cacheTypeListMock = $this->getMockBuilder('Magento\Framework\App\Cache\TypeListInterface') + ->disableOriginalConstructor() + ->getMock(); $model = $this->getMock( 'Magento\Config\Model\Config\Backend\Baseurl', ['getOldValue'], - [$context, $coreRegistry, $coreConfig, $mergeService, $resource, $resourceCollection] + [$context, $coreRegistry, $coreConfig, $cacheTypeListMock, $mergeService, $resource, $resourceCollection] ); + $cacheTypeListMock->expects($this->once()) + ->method('invalidate') + ->with(\Magento\Framework\App\Cache\Type\Config::TYPE_IDENTIFIER) + ->willReturn($model); $mergeService->expects($this->once())->method('cleanMergedJsCss'); $model->setValue('http://example.com/')->setPath(Store::XML_PATH_UNSECURE_BASE_URL); diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Backend/SecureTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Backend/SecureTest.php index 25280b8967d64b54bba166fac989e9afe0602734..16bd95fa8250ef79dfe867794fff731c661b31f0 100644 --- a/app/code/Magento/Config/Test/Unit/Model/Config/Backend/SecureTest.php +++ b/app/code/Magento/Config/Test/Unit/Model/Config/Backend/SecureTest.php @@ -5,28 +5,13 @@ */ namespace Magento\Config\Test\Unit\Model\Config\Backend; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; + class SecureTest extends \PHPUnit_Framework_TestCase { public function testSaveMergedJsCssMustBeCleaned() { - $eventDispatcher = $this->getMock('Magento\Framework\Event\ManagerInterface', [], [], '', false); - $appState = $this->getMock('Magento\Framework\App\State', [], [], '', false); - $cacheManager = $this->getMock('Magento\Framework\App\CacheInterface'); - $logger = $this->getMock('Psr\Log\LoggerInterface'); - $actionValidatorMock = $this->getMock( - '\Magento\Framework\Model\ActionValidator\RemoveAction', - [], - [], - '', - false - ); - $context = new \Magento\Framework\Model\Context( - $logger, - $eventDispatcher, - $cacheManager, - $appState, - $actionValidatorMock - ); + $context = (new ObjectManager($this))->getObject('Magento\Framework\Model\Context'); $resource = $this->getMock('Magento\Config\Model\ResourceModel\Config\Data', [], [], '', false); $resource->expects($this->any())->method('addCommitCallback')->will($this->returnValue($resource)); @@ -36,12 +21,19 @@ class SecureTest extends \PHPUnit_Framework_TestCase $mergeService = $this->getMock('Magento\Framework\View\Asset\MergeService', [], [], '', false); $coreRegistry = $this->getMock('Magento\Framework\Registry', [], [], '', false); $coreConfig = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface'); + $cacheTypeListMock = $this->getMockBuilder('Magento\Framework\App\Cache\TypeListInterface') + ->disableOriginalConstructor() + ->getMock(); $model = $this->getMock( 'Magento\Config\Model\Config\Backend\Secure', ['getOldValue'], - [$context, $coreRegistry, $coreConfig, $mergeService, $resource, $resourceCollection] + [$context, $coreRegistry, $coreConfig, $cacheTypeListMock, $mergeService, $resource, $resourceCollection] ); + $cacheTypeListMock->expects($this->once()) + ->method('invalidate') + ->with(\Magento\Framework\App\Cache\Type\Config::TYPE_IDENTIFIER) + ->willReturn($model); $mergeService->expects($this->once())->method('cleanMergedJsCss'); $model->setValue('new_value'); diff --git a/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/ProductTemplate/Form.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/AttributeSet/Form.php similarity index 93% rename from app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/ProductTemplate/Form.php rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/AttributeSet/Form.php index 09370fdce3e72ac650a640a1096bf6b62b8582a4..65c88dd19a05faeac5fc7ef50208bd646d94ad34 100644 --- a/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/ProductTemplate/Form.php +++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/AttributeSet/Form.php @@ -7,7 +7,7 @@ /** * Product attribute set selector form */ -namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\ProductTemplate; +namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\AttributeSet; class Form extends \Magento\Backend\Block\Widget\Form\Generic { @@ -57,7 +57,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'radio', [ 'after_element_html' => __( - 'Add configurable attributes to the current Product Template ("%1")', + 'Add configurable attributes to the current Attribute Set ("%1")', sprintf('<span data-role="name-container">%s</span>', $this->getCurrentAttributeSetName()) ), 'name' => 'affected-attribute-set', @@ -70,7 +70,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'new-affected-attribute-set', 'radio', [ - 'after_element_html' => __('Add configurable attributes to the new Product Template based on current'), + 'after_element_html' => __('Add configurable attributes to the new Attribute Set based on current'), 'name' => 'affected-attribute-set', 'class' => 'admin__control-radio', 'value' => 'new' @@ -80,7 +80,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'new-attribute-set-name', 'text', [ - 'label' => __('New product template name'), + 'label' => __('New attribute set name'), 'name' => 'new-attribute-set-name', 'required' => true, 'css_class' => 'no-display', @@ -92,7 +92,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'existing-affected-attribute-set', 'radio', [ - 'after_element_html' => __('Add configurable attributes to the existing Product Template'), + 'after_element_html' => __('Add configurable attributes to the existing Attribute Set'), 'name' => 'affected-attribute-set', 'required' => true, 'class' => 'admin__control-radio no-display', @@ -103,7 +103,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'choose-affected-attribute-set', 'select', [ - 'label' => __('Choose existing Product Template'), + 'label' => __('Choose existing Attribute Set'), 'name' => 'attribute-set-name', 'required' => true, 'css_class' => 'no-display', diff --git a/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php index e48634a2c7d54cc513997d3b742ed612f9594c8b..bf336cbf87059b52ac2a024c8368d99e30aafe28 100644 --- a/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php +++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php @@ -54,6 +54,11 @@ class Matrix extends \Magento\Backend\Block\Template /** @var null|array */ private $productAttributes; + /** + * @var \Magento\Framework\Locale\CurrencyInterface + */ + protected $localeCurrency; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType @@ -62,6 +67,7 @@ class Matrix extends \Magento\Backend\Block\Template * @param \Magento\ConfigurableProduct\Model\Product\Type\VariationMatrix $variationMatrix * @param ProductRepositoryInterface $productRepository * @param \Magento\Catalog\Helper\Image $image + * @param \Magento\Framework\Locale\CurrencyInterface $localeCurrency * @param array $data */ public function __construct( @@ -72,6 +78,7 @@ class Matrix extends \Magento\Backend\Block\Template \Magento\ConfigurableProduct\Model\Product\Type\VariationMatrix $variationMatrix, ProductRepositoryInterface $productRepository, \Magento\Catalog\Helper\Image $image, + \Magento\Framework\Locale\CurrencyInterface $localeCurrency, array $data = [] ) { parent::__construct($context, $data); @@ -80,6 +87,7 @@ class Matrix extends \Magento\Backend\Block\Template $this->stockRegistry = $stockRegistry; $this->variationMatrix = $variationMatrix; $this->productRepository = $productRepository; + $this->localeCurrency = $localeCurrency; $this->image = $image; } @@ -88,7 +96,7 @@ class Matrix extends \Magento\Backend\Block\Template */ public function getCurrencySymbol() { - return $this->_storeManager->getStore()->getCurrentCurrency()->getCurrencySymbol(); + return $this->localeCurrency->getCurrency($this->_storeManager->getStore()->getBaseCurrencyCode())->getSymbol(); } /** diff --git a/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Steps/Bulk.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Steps/Bulk.php index 69960ac40a6f37ab455591503f20b524c8244d99..d440b7347b6e65ad1b825b9e66fb43ad31ad2f80 100644 --- a/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Steps/Bulk.php +++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Steps/Bulk.php @@ -39,12 +39,4 @@ class Bulk extends \Magento\Ui\Block\Component\StepsWizard\StepAbstract { return $this->image->getDefaultPlaceholderUrl('thumbnail'); } - - /** - * @return string - */ - public function getCurrencySymbol() - { - return $this->_storeManager->getStore()->getCurrentCurrency()->getCurrencySymbol(); - } } diff --git a/app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php index fce1979115e66199ff8932a3de3dbc8bac44cf5c..356f9b2f2b8cd63a34a01978954170f082561a2e 100644 --- a/app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php @@ -184,15 +184,15 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView 'optionPrices' => $this->getOptionPrices(), 'prices' => [ 'oldPrice' => [ - 'amount' => $this->_registerJsPrice($this->_convertPrice($regularPrice->getAmount()->getValue())), + 'amount' => $this->_registerJsPrice($regularPrice->getAmount()->getValue()), ], 'basePrice' => [ 'amount' => $this->_registerJsPrice( - $this->_convertPrice($finalPrice->getAmount()->getBaseAmount()) + $finalPrice->getAmount()->getBaseAmount() ), ], 'finalPrice' => [ - 'amount' => $this->_registerJsPrice($this->_convertPrice($finalPrice->getAmount()->getValue())), + 'amount' => $this->_registerJsPrice($finalPrice->getAmount()->getValue()), ], ], 'productId' => $currentProduct->getId(), @@ -223,17 +223,17 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView [ 'oldPrice' => [ 'amount' => $this->_registerJsPrice( - $this->_convertPrice($priceInfo->getPrice('regular_price')->getAmount()->getValue()) + $priceInfo->getPrice('regular_price')->getAmount()->getValue() ), ], 'basePrice' => [ 'amount' => $this->_registerJsPrice( - $this->_convertPrice($priceInfo->getPrice('final_price')->getAmount()->getBaseAmount()) + $priceInfo->getPrice('final_price')->getAmount()->getBaseAmount() ), ], 'finalPrice' => [ 'amount' => $this->_registerJsPrice( - $this->_convertPrice($priceInfo->getPrice('final_price')->getAmount()->getValue()) + $priceInfo->getPrice('final_price')->getAmount()->getValue() ), ] ]; @@ -251,25 +251,4 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView { return str_replace(',', '.', $price); } - - /** - * Convert price from default currency to current currency - * - * @param float $price - * @param bool $round - * @return float - */ - protected function _convertPrice($price, $round = false) - { - if (empty($price)) { - return 0; - } - - $price = $this->priceCurrency->convert($price); - if ($round) { - $price = $this->priceCurrency->round($price); - } - - return $price; - } } diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/AddAttribute.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/AddAttribute.php index 2377de0c5b909e8aa9bf234cb73ce883ba2106dd..ac31893126438e185119eaf4277b9d9777182b20 100644 --- a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/AddAttribute.php +++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/AddAttribute.php @@ -32,7 +32,7 @@ class AddAttribute extends Action * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout('popup'); $this->productBuilder->build($this->getRequest()); diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Associated/Grid.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Associated/Grid.php index 6eb4facfee9c36125e9da543cfe8565732cdd9e8..6fb61d0548a3616e234cc9625355b225368d7225 100644 --- a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Associated/Grid.php +++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Associated/Grid.php @@ -33,7 +33,7 @@ class Grid extends Action * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Layout $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/CreateOptions.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/CreateOptions.php index 7516807654af81978cdc400b4bc62ee9a5afc26b..8e620c749445e3b46b43b2d8b7871119f41530d6 100644 --- a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/CreateOptions.php +++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/CreateOptions.php @@ -52,7 +52,7 @@ class CreateOptions extends Action * * @return void */ - public function execute() + public function executeInternal() { $this->getResponse()->representJson($this->jsonHelper->jsonEncode($this->saveAttributeOptions())); } diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/GetAttributes.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/GetAttributes.php index 39bee40024eee6c39908bf30e2eccfc2d90fd1b3..b0e66aba601ddae0ccccecdd9358fd829395bd3a 100644 --- a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/GetAttributes.php +++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/GetAttributes.php @@ -60,7 +60,7 @@ class GetAttributes extends Action * * @return void */ - public function execute() + public function executeInternal() { $this->storeManager->setCurrentStore(\Magento\Store\Model\Store::ADMIN_CODE); $collection = $this->collectionFactory->create(); diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php index 4135ea97ab65342b670686c121065a3d683dffc6..1fabe24b05b44c187ac03a3a476d0a873b816d02 100644 --- a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php +++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php @@ -61,7 +61,7 @@ class SuggestConfigurableAttributes extends Action * * @return void */ - public function execute() + public function executeInternal() { $this->storeManager->setCurrentStore(\Magento\Store\Model\Store::ADMIN_CODE); diff --git a/app/code/Magento/ConfigurableProduct/Helper/Data.php b/app/code/Magento/ConfigurableProduct/Helper/Data.php index 91dd722424219c550a555622bd165df5e242706d..8ab8a52a9ee65b69218978cc774e24f1e85ef546 100644 --- a/app/code/Magento/ConfigurableProduct/Helper/Data.php +++ b/app/code/Magento/ConfigurableProduct/Helper/Data.php @@ -40,7 +40,7 @@ class Data { $images = $product->getMediaGalleryImages(); if ($images instanceof \Magento\Framework\Data\Collection) { - foreach ($images as &$image) { + foreach ($images as $image) { /** @var $image \Magento\Catalog\Model\Product\Image */ $image->setData( 'small_image_url', diff --git a/app/code/Magento/ConfigurableProduct/Model/ConfigurableAttributeHandler.php b/app/code/Magento/ConfigurableProduct/Model/ConfigurableAttributeHandler.php index 239f6d697d745488ce7041b31df0ff7ebfcb92f3..a2f9231a79dd527748d910b9690f2051e501da61 100644 --- a/app/code/Magento/ConfigurableProduct/Model/ConfigurableAttributeHandler.php +++ b/app/code/Magento/ConfigurableProduct/Model/ConfigurableAttributeHandler.php @@ -40,7 +40,7 @@ class ConfigurableAttributeHandler 1 )->addFieldToFilter( 'is_global', - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL ); } diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php index 85eae4dae7cda194432c754ef9d5e841a42d8da5..93f2588d214597ef54278c672963794b66d5d00b 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php @@ -248,7 +248,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType */ public function canUseAttribute(\Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute) { - return $attribute->getIsGlobal() == \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL && + return $attribute->getIsGlobal() == \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL && $attribute->getIsVisible() && $attribute->usesSource() && $attribute->getIsUserDefined(); diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Price.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Price.php index bd74b867c86103a67177628d8bef0e30609261cb..aeae1374a9813916bee8a2b97bdfe089e0c4ec7c 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Price.php +++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Price.php @@ -7,8 +7,6 @@ */ namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable; -use Magento\Framework\Pricing\PriceCurrencyInterface; - class Price extends \Magento\Catalog\Model\Product\Type\Price { /** @@ -24,17 +22,27 @@ class Price extends \Magento\Catalog\Model\Product\Type\Price return $product->getCalculatedFinalPrice(); } if ($product->getCustomOption('simple_product')) { - $simpleProduct = $product->getCustomOption('simple_product')->getProduct(); - $product->setSelectedConfigurableOption($simpleProduct); - $priceInfo = $simpleProduct->getPriceInfo(); + return parent::getFinalPrice($qty, $product->getCustomOption('simple_product')->getProduct()); } else { $priceInfo = $product->getPriceInfo(); + $finalPrice = $priceInfo->getPrice('final_price')->getAmount()->getValue(); + $finalPrice = $this->_applyOptionsPrice($product, $qty, $finalPrice); + $finalPrice = max(0, $finalPrice); + $product->setFinalPrice($finalPrice); + + return $finalPrice; } - $finalPrice = $priceInfo->getPrice('final_price')->getAmount()->getValue(); - $finalPrice = $this->_applyOptionsPrice($product, $qty, $finalPrice); - $finalPrice = max(0, $finalPrice); - $product->setFinalPrice($finalPrice); + } - return $finalPrice; + /** + * {@inheritdoc} + */ + public function getPrice($product) + { + if ($product->getCustomOption('simple_product')) { + return $product->getCustomOption('simple_product')->getProduct()->getPrice(); + } else { + return 0; + } } } diff --git a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php index 814508cd6295942f92a399db6fc845b9046f2163..84395f7f5b138fd8ff1feb7832a6adf14994c0e2 100644 --- a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Indexer/Price/Configurable.php @@ -48,14 +48,46 @@ class Configurable extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\ protected function reindex($entityIds = null) { if ($this->hasEntity() || !empty($entityIds)) { - $this->_prepareFinalPriceData($entityIds); + if (!empty($entityIds)) { + $allEntityIds = $this->getRelatedProducts($entityIds); + $this->prepareFinalPriceDataForType($allEntityIds, null); + } else { + $this->_prepareFinalPriceData($entityIds); + } $this->_applyCustomOption(); - $this->_applyConfigurableOption(); - $this->_movePriceDataToIndexTable(); + $this->_applyConfigurableOption($entityIds); + $this->_movePriceDataToIndexTable($entityIds); } return $this; } + /** + * Get related product + * + * @param int[] $entityIds + * @return int[] + */ + private function getRelatedProducts($entityIds) + { + $select = $this->getConnection()->select()->union( + [ + $this->getConnection()->select() + ->from($this->getTable('catalog_product_super_link'), 'parent_id') + ->where('parent_id in (?)', $entityIds), + $this->getConnection()->select() + ->from($this->getTable('catalog_product_super_link'), 'product_id') + ->where('parent_id in (?)', $entityIds), + $this->getConnection()->select() + ->from($this->getTable('catalog_product_super_link'), 'product_id') + ->where('product_id in (?)', $entityIds), + ] + ); + return array_map( + 'intval', + $this->getConnection()->fetchCol($select) + ); + } + /** * Retrieve table name for custom option temporary aggregation data * diff --git a/app/code/Magento/ConfigurableProduct/Pricing/Price/BasePrice.php b/app/code/Magento/ConfigurableProduct/Pricing/Price/BasePrice.php deleted file mode 100644 index 76f2ef5cdd900bfe3b68950147c2f0ec988c16c8..0000000000000000000000000000000000000000 --- a/app/code/Magento/ConfigurableProduct/Pricing/Price/BasePrice.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\ConfigurableProduct\Pricing\Price; - -use \Magento\Framework\Pricing\Price\BasePriceProviderInterface; - -class BasePrice extends \Magento\Catalog\Pricing\Price\BasePrice -{ - /** - * @var array - */ - protected $values = []; - - /** - * @var null|boolean|float - */ - protected $minimumAdditionalPrice; - - /** - * {@inheritdoc} - */ - public function getValue() - { - $selectedConfigurableOption = $this->product->getSelectedConfigurableOption(); - $productId = $selectedConfigurableOption ? $selectedConfigurableOption->getId() : $this->product->getId(); - if (!isset($this->values[$productId])) { - $this->value = null; - if (!$selectedConfigurableOption) { - $this->values[$productId] = parent::getValue(); - } else { - if (false !== $this->getMinimumAdditionalPrice()) { - $this->values[$productId] = $this->getMinimumAdditionalPrice(); - } else { - $this->values[$productId] = parent::getValue(); - } - } - } - return $this->values[$productId]; - } - - /** - * @return bool|float - */ - protected function getMinimumAdditionalPrice() - { - if (null === $this->minimumAdditionalPrice) { - $priceCodes = [ - \Magento\Catalog\Pricing\Price\SpecialPrice::PRICE_CODE, - \Magento\Catalog\Pricing\Price\TierPrice::PRICE_CODE, - ]; - $this->minimumAdditionalPrice = false; - foreach ($priceCodes as $priceCode) { - $price = $this->product->getPriceInfo()->getPrice($priceCode); - if ($price instanceof BasePriceProviderInterface && $price->getValue() !== false) { - $this->minimumAdditionalPrice = min( - $price->getValue(), - $this->minimumAdditionalPrice ?: $price->getValue() - ); - } - } - } - return $this->minimumAdditionalPrice; - } -} diff --git a/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurablePriceResolver.php b/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurablePriceResolver.php index d0f2461c96a3e1f866c9eae498c2c3bebd81c741..a4fe3d76da22b5316ce64399329f9ed6261ee253 100644 --- a/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurablePriceResolver.php +++ b/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurablePriceResolver.php @@ -37,22 +37,22 @@ class ConfigurablePriceResolver implements PriceResolverInterface } /** - * @param \Magento\Framework\Pricing\SaleableInterface $product + * @param \Magento\Framework\Pricing\SaleableInterface|\Magento\Catalog\Model\Product $product * @return float + * @throws \Magento\Framework\Exception\LocalizedException */ public function resolvePrice(\Magento\Framework\Pricing\SaleableInterface $product) { - $selectedConfigurableOption = $product->getSelectedConfigurableOption(); - if ($selectedConfigurableOption) { - $price = $this->priceResolver->resolvePrice($selectedConfigurableOption); - } else { - $price = null; - foreach ($this->configurable->getUsedProducts($product) as $subProduct) { - $productPrice = $this->priceResolver->resolvePrice($subProduct); - $price = $price ? min($price, $productPrice) : $productPrice; - } + $price = null; + foreach ($this->configurable->getUsedProducts($product) as $subProduct) { + $productPrice = $this->priceResolver->resolvePrice($subProduct); + $price = $price ? min($price, $productPrice) : $productPrice; } - $priceInCurrentCurrency = $this->priceCurrency->convertAndRound($price); - return $priceInCurrentCurrency ? (float)$priceInCurrentCurrency : false; + if (!$price) { + throw new \Magento\Framework\Exception\LocalizedException( + __('Configurable product "%1" do not have sub-products', $product->getName()) + ); + } + return (float)$price; } } diff --git a/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php b/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php index de5ea0dcb0716011e643e34e4f1cef439c9384a4..936698cef3567b14ea4ad9dc219702d210e49962 100644 --- a/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php +++ b/app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php @@ -61,20 +61,19 @@ class ConfigurableRegularPrice extends AbstractPrice implements ConfigurableRegu */ public function getValue() { - $selectedConfigurableOption = $this->product->getSelectedConfigurableOption(); - $productId = $selectedConfigurableOption ? $selectedConfigurableOption->getId() : $this->product->getId(); - if (!isset($this->values[$productId])) { - $this->values[$productId] = $this->priceResolver->resolvePrice($this->product); + if (!isset($this->values[$this->product->getId()])) { + $this->values[$this->product->getId()] = $this->priceResolver->resolvePrice($this->product); } - return $this->values[$productId]; + return $this->values[$this->product->getId()]; } + /** * {@inheritdoc} */ public function getAmount() { - return $this->getMinRegularAmount($this->product); + return $this->getMinRegularAmount(); } /** @@ -116,7 +115,6 @@ class ConfigurableRegularPrice extends AbstractPrice implements ConfigurableRegu $this->minRegularAmount = $this->doGetMinRegularAmount() ?: false; } return $this->minRegularAmount; - } /** diff --git a/app/code/Magento/ConfigurableProduct/Pricing/Price/FinalPrice.php b/app/code/Magento/ConfigurableProduct/Pricing/Price/FinalPrice.php index 3d7cfd251d54e466fe74514e16c1a58646b44d78..834df6ffd429aa75c8c90f060ad80103f5326713 100644 --- a/app/code/Magento/ConfigurableProduct/Pricing/Price/FinalPrice.php +++ b/app/code/Magento/ConfigurableProduct/Pricing/Price/FinalPrice.php @@ -34,28 +34,15 @@ class FinalPrice extends \Magento\Catalog\Pricing\Price\FinalPrice $this->priceResolver = $priceResolver; } - /** - * {@inheritdoc} - */ - public function getAmount() - { - if ($this->product->getSelectedConfigurableOption()) { - $this->amount = null; - } - return parent::getAmount(); - } - /** * {@inheritdoc} */ public function getValue() { - $selectedConfigurableOption = $this->product->getSelectedConfigurableOption(); - $productId = $selectedConfigurableOption ? $selectedConfigurableOption->getId() : $this->product->getId(); - if (!isset($this->values[$productId])) { - $this->values[$productId] = $this->priceResolver->resolvePrice($this->product); + if (!isset($this->values[$this->product->getId()])) { + $this->values[$this->product->getId()] = $this->priceResolver->resolvePrice($this->product); } - return $this->values[$productId]; + return $this->values[$this->product->getId()]; } } diff --git a/app/code/Magento/ConfigurableProduct/Setup/InstallData.php b/app/code/Magento/ConfigurableProduct/Setup/InstallData.php index 1d6705846db6ec25e9d439ddacccc0bf45e634f4..8b29c11bc2b8f79a83a583b76d92421cf38a0f13 100644 --- a/app/code/Magento/ConfigurableProduct/Setup/InstallData.php +++ b/app/code/Magento/ConfigurableProduct/Setup/InstallData.php @@ -47,7 +47,6 @@ class InstallData implements InstallDataInterface 'minimal_price', 'msrp', 'msrp_display_actual_price_type', - 'price', 'special_price', 'special_from_date', 'special_to_date', diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/AddAttributeTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/AddAttributeTest.php index f37d40eccf05326bf5c5794a8df271b273dfb9e8..228f44a9a5011a1c852aebc49a03d56323518672 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/AddAttributeTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/AddAttributeTest.php @@ -102,6 +102,6 @@ class AddAttributeTest extends \PHPUnit_Framework_TestCase $layout->expects($this->once())->method('setChild')->willReturnSelf(); $this->view->expects($this->any())->method('renderLayout')->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php index d8b1fc5a051eaba1d5456271bd08c143230d8c8d..24ace68cf47353267e6b20f84a9eca30784229c5 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php @@ -86,6 +86,6 @@ class SuggestConfigurableAttributesTest extends \PHPUnit_Framework_TestCase $this->returnValue('body') ); $this->responseMock->expects($this->once())->method('representJson')->with('body'); - $this->suggestAttributes->execute(); + $this->suggestAttributes->executeInternal(); } } diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/Configurable/PriceTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/Configurable/PriceTest.php index 7d14671ec0d7db501a3bd58fba10ecf9d4b265d6..7757b4356244206b5b17b0e52a948d4f03126a3b 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/Configurable/PriceTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/Configurable/PriceTest.php @@ -31,11 +31,7 @@ class PriceTest extends \PHPUnit_Framework_TestCase $qty = 1; $configurableProduct = $this->getMockBuilder('Magento\Catalog\Model\Product') ->disableOriginalConstructor() - ->setMethods(['getCustomOption', 'setSelectedConfigurableOption', 'setFinalPrice', '__wakeUp']) - ->getMock(); - $childProduct = $this->getMockBuilder('Magento\Catalog\Model\Product') - ->disableOriginalConstructor() - ->setMethods(['getPriceInfo', '__wakeUp']) + ->setMethods(['getCustomOption', 'getPriceInfo', 'setFinalPrice', '__wakeUp']) ->getMock(); $customOption = $this->getMockBuilder('Magento\Catalog\Model\Product\Configuration\Item\Option') ->disableOriginalConstructor() @@ -52,24 +48,14 @@ class PriceTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $configurableProduct->expects($this->at(0)) - ->method('getCustomOption') - ->with('simple_product') - ->willReturn($customOption); - $configurableProduct->expects($this->at(1)) + $configurableProduct->expects($this->any()) ->method('getCustomOption') - ->with('simple_product') - ->willReturn($customOption); - $customOption->expects($this->once())->method('getProduct')->willReturn($childProduct); - $configurableProduct->expects($this->once()) - ->method('setSelectedConfigurableOption') - ->with($childProduct) - ->willReturnSelf(); - $childProduct->expects($this->once())->method('getPriceInfo')->willReturn($priceInfo); + ->willReturnMap([['simple_product', false], ['option_ids', false]]); + $customOption->expects($this->never())->method('getProduct'); + $configurableProduct->expects($this->once())->method('getPriceInfo')->willReturn($priceInfo); $priceInfo->expects($this->once())->method('getPrice')->with('final_price')->willReturn($price); $price->expects($this->once())->method('getAmount')->willReturn($amount); $amount->expects($this->once())->method('getValue')->willReturn($finalPrice); - $configurableProduct->expects($this->at(3))->method('getCustomOption')->with('option_ids')->willReturn(false); $configurableProduct->expects($this->once())->method('setFinalPrice')->with($finalPrice)->willReturnSelf(); $this->assertEquals($finalPrice, $this->model->getFinalPrice($qty, $configurableProduct)); diff --git a/app/code/Magento/ConfigurableProduct/etc/di.xml b/app/code/Magento/ConfigurableProduct/etc/di.xml index ff1173c2e0908c55d8ef1f8fb338eafd562ed4eb..e2463e52daa8127d663d9abfca26801cda0a3f70 100644 --- a/app/code/Magento/ConfigurableProduct/etc/di.xml +++ b/app/code/Magento/ConfigurableProduct/etc/di.xml @@ -70,7 +70,6 @@ <argument name="prices" xsi:type="array"> <item name="regular_price" xsi:type="string">Magento\ConfigurableProduct\Pricing\Price\ConfigurableRegularPrice</item> <item name="final_price" xsi:type="string">Magento\ConfigurableProduct\Pricing\Price\FinalPrice</item> - <item name="base_price" xsi:type="string">Magento\ConfigurableProduct\Pricing\Price\BasePrice</item> </argument> <argument name="target" xsi:type="object">Magento\Catalog\Pricing\Price\Pool</argument> </arguments> diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml index b6683bdeca4a7f6866a9adc90581af1e59afc2f4..322360d8703f9e443d3537c72576dbd42b29d7a9 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml @@ -16,7 +16,7 @@ </referenceContainer> <referenceContainer name="content"> <block class="Magento\Framework\View\Element\Template" name="affected-attribute-set-selector" template="Magento_ConfigurableProduct::product/configurable/affected-attribute-set-selector/form.phtml"> - <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\ProductTemplate\Form" name="affected-attribute-set-form" /> + <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\AttributeSet\Form" name="affected-attribute-set-form" /> </block> </referenceContainer> </body> diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml index ea036bbf5d6c0eedfd3cb70d46125ac1d9c80938..c9aeeddfd2b308a70cf84347113ca4c3a5437a00 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml @@ -40,7 +40,7 @@ editSet.submit = editSet.submit.wrap(function(original) { editSet.rightBeforeAppend = editSet.rightBeforeAppend.wrap(function(original, tree, nodeThis, node, newParent) { if (node.attributes.is_configurable == 1) { alert({ - content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the product template.')) ?>' + content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>' }); return false; } @@ -50,7 +50,7 @@ editSet.rightBeforeAppend = editSet.rightBeforeAppend.wrap(function(original, tr editSet.rightBeforeInsert = editSet.rightBeforeInsert.wrap(function(original, tree, nodeThis, node, newParent) { if (node.attributes.is_configurable == 1) { alert({ - content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the product template.')) ?>' + content: '<?php /* @escapeNotVerified */ echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>' }); return false; } diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/attribute/steps/bulk.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/attribute/steps/bulk.phtml index 8a1b3edc8053e65e07b1f9c59dd2887d0f5c1bb0..df8785085dea3ec27b267ac6835a42e6f75bebf8 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/attribute/steps/bulk.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/attribute/steps/bulk.phtml @@ -655,7 +655,6 @@ "component": "Magento_ConfigurableProduct/js/variations/steps/bulk", "appendTo": "<?= /* @escapeNotVerified */ $block->getParentComponentName()?>", "noImage": "<?= /* @escapeNotVerified */ $block->getNoImageUrl() ?>", - "currencySymbol": "<?= /* @escapeNotVerified */ $block->getCurrencySymbol() ?>", "variationsComponent": "configurableVariations" } } diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/config.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/config.phtml index b71eadea028641416be173ce6700cb0b860e8561..b1d12ed35ed1e3912a12ab4f13e910489f938595 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/config.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/config.phtml @@ -16,7 +16,7 @@ You need to create a simple product for each configuration (Ex: a product for each color).');?> </div> </div> - <div class="product-create-configuration-actions"> + <div class="product-create-configuration-actions" data-action="product-create-configuration-buttons"> <div class="product-create-configuration-action"> <button type="button" data-action="open-steps-wizard" title="Create Product Configurations" class="action-secondary" data-bind="click: open"> diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/matrix.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/matrix.phtml index e962963ccac6ca28245e4e25edc5b0917c01bfd9..0286f7c556108936d871bc628e448357dd5def64 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/matrix.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/matrix.phtml @@ -144,7 +144,7 @@ $currencySymbol = $block->getCurrencySymbol(); </td> <td class="col-price" data-column="price"> <!-- ko ifnot: variation.editable --> - <!-- ko text: '<?= /* @noEscape */ $currencySymbol?>' + variation.price --><!--/ko--> + <!-- ko text: $parent.getCurrencySymbol() + variation.price --><!--/ko--> <!-- /ko --> <!-- ko if: variation.editable --> <div class="addon"> @@ -156,7 +156,7 @@ $currencySymbol = $block->getCurrencySymbol(); value: variation.price}"/> <label class="addafter" data-bind="attr: {for: $parent.getRowId(variation, 'price')"> - <strong>$</strong> + <strong data-bind="text: $parent.getCurrencySymbol()"></strong> </label> </div> <!-- /ko --> @@ -213,7 +213,7 @@ $currencySymbol = $block->getCurrencySymbol(); </li> <li> <a class="action-menu-item" data-bind=" - i18n: variation.status == 1 ? 'Disable Product' : 'Enable Product', + text: variation.status == 1 ? $t('Disable Product') : $t('Enable Product'), click: $parent.toggleProduct.bind($parent, $index())"> </a> </li> @@ -255,6 +255,7 @@ $currencySymbol = $block->getCurrencySymbol(); "variations": <?= /* @noEscape */ $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode($productMatrix) ?>, "productAttributes": <?= /* @noEscape */ $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode($attributes) ?>, "productUrl": "<?= /* @noEscape */ $block->getUrl('catalog/product/edit', ['id' => '%id%']) ?>", + "currencySymbol": "<?= /* @noEscape */ $currencySymbol ?>", "configurableProductGrid": "configurableProductGrid" } } diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml index 3f192bc072f9a7f9fa54393cf3eb22d9bc5eaa77..4716938b4a0942d305a2a529e2ea29d995dc8366 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml @@ -48,7 +48,7 @@ $form .modal({ - title: '<?php /* @escapeNotVerified */ echo __('Choose Affected Product Template'); ?>', + title: '<?php /* @escapeNotVerified */ echo __('Choose Affected Attribute Set'); ?>', closed: function () { resetValidation(); }, diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/bulk.js b/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/bulk.js index 5f4af9cd5e3e2e777c05fe58bd5760e938654661..c01f1a8c874f2af8b7e4905d7a629b40dc1f0ec5 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/bulk.js +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/bulk.js @@ -14,7 +14,8 @@ define([ 'mage/template', 'Magento_Ui/js/modal/alert', 'jquery/file-uploader', - 'mage/translate' + 'mage/translate', + 'Magento_ConfigurableProduct/js/variations/variations' ], function (Component, $, ko, _, Collapsible, mageTemplate, alert) { 'use strict'; @@ -55,7 +56,7 @@ define([ type: ko.observable('none'), value: ko.observable(), attribute: ko.observable(), - currencySymbol: this.currencySymbol + currencySymbol: '' }, quantity: { label: 'quantity', @@ -64,6 +65,11 @@ define([ attribute: ko.observable() } }); + + this.variationsComponent(function (variationsComponent) { + this.sections().price.currencySymbol = variationsComponent.getCurrencySymbol() + }.bind(this)); + this.makeOptionSections = function () { this.images = new self.makeImages(null); this.price = self.price; diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/summary.js b/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/summary.js index 0da35357808085b8fe91792cd7bdac8e523a3e37..0a1088393c04f8b50c48c2405c6668477b2eb95f 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/summary.js +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/steps/summary.js @@ -40,7 +40,7 @@ define([ nextLabelText: $.mage.__('Generate Products'), variations: [], generateGrid: function (variations, getSectionValue) { - var productName = this.variationsComponent().getProductValue('name'), + var productSku = this.variationsComponent().getProductValue('sku'), productPrice = this.variationsComponent().getProductValue('price'), productWeight = this.variationsComponent().getProductValue('weight'), variationsKeys = [], @@ -59,7 +59,7 @@ define([ }); } images = getSectionValue('images', options); - sku = productName + _.reduce(options, function (memo, option) { + sku = productSku + _.reduce(options, function (memo, option) { return memo + '-' + option.label; }, ''); quantity = getSectionValue('quantity', options); @@ -129,7 +129,7 @@ define([ _.each(variation.options, function (option) { row.push(option.label); }); - row.push('$ ' + variation.price); + row.push(this.variationsComponent().getCurrencySymbol() + ' ' + variation.price); return row; }, diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/variations.js b/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/variations.js index 862ffe05a6cfc78bfa750cce52b2c2fef1258273..150326b3fabaf055dbf1184c363635c7b4b16db8 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/variations.js +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/variations.js @@ -368,6 +368,14 @@ define([ .addClass('disabled-configurable-elements') .prop('disabled', true); }); + }, + + /** + * Get currency symbol + * @returns {*} + */ + getCurrencySymbol: function () { + return this.currencySymbol; } }); }); diff --git a/app/code/Magento/Contact/Controller/Index.php b/app/code/Magento/Contact/Controller/Index.php index 8a04b5b7b1d0b6c9a57f88845e3faacfbeb2ac47..28272b87d0c1e2b29a0f0650a3ab6ed5d16462d7 100644 --- a/app/code/Magento/Contact/Controller/Index.php +++ b/app/code/Magento/Contact/Controller/Index.php @@ -82,11 +82,11 @@ abstract class Index extends \Magento\Framework\App\Action\Action * @return \Magento\Framework\App\ResponseInterface * @throws \Magento\Framework\Exception\NotFoundException */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { if (!$this->scopeConfig->isSetFlag(self::XML_PATH_ENABLED, ScopeInterface::SCOPE_STORE)) { throw new NotFoundException(__('Page not found.')); } - return parent::dispatch($request); + return parent::execute($request); } } diff --git a/app/code/Magento/Contact/Controller/Index/Index.php b/app/code/Magento/Contact/Controller/Index/Index.php index 247728f63f881cbc70817c1ada56bd81702db6a4..c1ff54c71f75a23e3ca92a6424d0c3277897bf2f 100644 --- a/app/code/Magento/Contact/Controller/Index/Index.php +++ b/app/code/Magento/Contact/Controller/Index/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Contact\Controller\Index * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_view->renderLayout(); diff --git a/app/code/Magento/Contact/Controller/Index/Post.php b/app/code/Magento/Contact/Controller/Index/Post.php index f5114cd6f68b91b98557cdebf899e3ffbba5a90f..854a2e1561097b856d640f2cd532a5a6154da2b6 100644 --- a/app/code/Magento/Contact/Controller/Index/Post.php +++ b/app/code/Magento/Contact/Controller/Index/Post.php @@ -14,7 +14,7 @@ class Post extends \Magento\Contact\Controller\Index * @return void * @throws \Exception */ - public function execute() + public function executeInternal() { $post = $this->getRequest()->getPostValue(); if (!$post) { diff --git a/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php index a914cf698e33b4458a4248b2d424f79c5259cb22..9a980ca0b7c0d8bf1215af8228fab7f35b0d252e 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php @@ -99,6 +99,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->_view->expects($this->once()) ->method('renderLayout'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } } diff --git a/app/code/Magento/Contact/Test/Unit/Controller/Index/PostTest.php b/app/code/Magento/Contact/Test/Unit/Controller/Index/PostTest.php index a508c25a445c2556670d756bef190f7eb85d13bd..d062bb7ad9cd26f4650b6cfde8bef825416308fc 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/Index/PostTest.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/Index/PostTest.php @@ -135,7 +135,7 @@ class PostTest extends \PHPUnit_Framework_TestCase { $this->_request->expects($this->once())->method('getPostValue')->will($this->returnValue([])); $this->_redirect->expects($this->once())->method('redirect'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } /** @@ -157,7 +157,7 @@ class PostTest extends \PHPUnit_Framework_TestCase $this->_inlineTranslation->expects($this->once()) ->method('suspend'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } public function testPostDataProvider() @@ -224,6 +224,6 @@ class PostTest extends \PHPUnit_Framework_TestCase $this->_inlineTranslation->expects($this->once()) ->method('suspend'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } } diff --git a/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php b/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php index 93f055f4d0a5ff2d57366b012eb81deaec1f62fb..b27d4db46d4c7448dccd8b6cbcae8572accaad1a 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php @@ -78,7 +78,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ) ->will($this->returnValue(false)); - $this->_controller->dispatch( + $this->_controller->execute( $this->getMockForAbstractClass('\Magento\Framework\App\RequestInterface', [], '', false) ); } diff --git a/app/code/Magento/Contact/Test/Unit/Controller/Stub/IndexStub.php b/app/code/Magento/Contact/Test/Unit/Controller/Stub/IndexStub.php index 4d4320d4acbf2d0521d059735f1feb302134c2eb..4966ddd26be7cf174d8d924210a379cd84377887 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/Stub/IndexStub.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/Stub/IndexStub.php @@ -8,7 +8,7 @@ namespace Magento\Contact\Test\Unit\Controller\Stub; class IndexStub extends \Magento\Contact\Controller\Index { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/app/code/Magento/Contact/Test/Unit/Model/System/Config/Backend/LinksTest.php b/app/code/Magento/Contact/Test/Unit/Model/System/Config/Backend/LinksTest.php index febdde20240b863408719cd5d1ed3ab59280c9bb..4ed7d5552349de594906825bad8f326409ce331f 100644 --- a/app/code/Magento/Contact/Test/Unit/Model/System/Config/Backend/LinksTest.php +++ b/app/code/Magento/Contact/Test/Unit/Model/System/Config/Backend/LinksTest.php @@ -5,6 +5,8 @@ */ namespace Magento\Contact\Test\Unit\Model\System\Config\Backend; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; + class LinksTest extends \PHPUnit_Framework_TestCase { /** @@ -14,13 +16,7 @@ class LinksTest extends \PHPUnit_Framework_TestCase public function setUp() { - $this->_model = new \Magento\Contact\Model\System\Config\Backend\Links( - $this->getMock('\Magento\Framework\Model\Context', [], [], '', false), - $this->getMock('\Magento\Framework\Registry', [], [], '', false), - $this->getMockForAbstractClass('\Magento\Framework\App\Config\ScopeConfigInterface', [], '', false), - $this->getMockForAbstractClass('\Magento\Framework\Model\ResourceModel\AbstractResource', [], '', false), - $this->getMock('\Magento\Framework\Data\Collection\AbstractDb', [], [], '', false) - ); + $this->_model = (new ObjectManager($this))->getObject('Magento\Contact\Model\System\Config\Backend\Links'); } public function testGetIdentities() diff --git a/app/code/Magento/Cookie/Controller/Index/NoCookies.php b/app/code/Magento/Cookie/Controller/Index/NoCookies.php index c8ce45e0a38ceec1ce6a7c9c089ff2e4d4ad31b9..edf4949fb0b9f01726093ff321a52b551e686678 100644 --- a/app/code/Magento/Cookie/Controller/Index/NoCookies.php +++ b/app/code/Magento/Cookie/Controller/Index/NoCookies.php @@ -13,7 +13,7 @@ class NoCookies extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $redirect = new \Magento\Framework\DataObject(); $this->_eventManager->dispatch( diff --git a/app/code/Magento/Cookie/Model/Config/Backend/Domain.php b/app/code/Magento/Cookie/Model/Config/Backend/Domain.php index 50e5a4782d9e92ee77789effeb1140a48fd70c7c..2f84b6d2fd06750ce41cbb1057f7b30f1a0254de 100644 --- a/app/code/Magento/Cookie/Model/Config/Backend/Domain.php +++ b/app/code/Magento/Cookie/Model/Config/Backend/Domain.php @@ -17,6 +17,7 @@ class Domain extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Session\Config\Validator\CookieDomainValidator $configValidator * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -27,13 +28,14 @@ class Domain extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Session\Config\Validator\CookieDomainValidator $configValidator, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->configValidator = $configValidator; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Cookie/Model/Config/Backend/Lifetime.php b/app/code/Magento/Cookie/Model/Config/Backend/Lifetime.php index bf2b2805dff6d9a71f5467a3e52eaff20f5638e5..9d650159e45016208a00bac18c8a6b36a5f9e7bc 100644 --- a/app/code/Magento/Cookie/Model/Config/Backend/Lifetime.php +++ b/app/code/Magento/Cookie/Model/Config/Backend/Lifetime.php @@ -17,6 +17,7 @@ class Lifetime extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Session\Config\Validator\CookieLifetimeValidator $configValidator * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -27,19 +28,20 @@ class Lifetime extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Session\Config\Validator\CookieLifetimeValidator $configValidator, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->configValidator = $configValidator; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** * Validate a domain name value * - * @return void + * @return $this * @throws \Magento\Framework\Exception\LocalizedException */ public function beforeSave() @@ -50,5 +52,6 @@ class Lifetime extends \Magento\Framework\App\Config\Value $msg = __('Invalid cookie lifetime: ' . join('; ', $this->configValidator->getMessages())); throw new \Magento\Framework\Exception\LocalizedException($msg); } + return parent::beforeSave(); } } diff --git a/app/code/Magento/Cookie/Model/Config/Backend/Path.php b/app/code/Magento/Cookie/Model/Config/Backend/Path.php index f64d41dc1f0e62f194819c7aec35f293766cddd5..c0f104bfcff299572ca05783d231f15bebef674f 100644 --- a/app/code/Magento/Cookie/Model/Config/Backend/Path.php +++ b/app/code/Magento/Cookie/Model/Config/Backend/Path.php @@ -17,6 +17,7 @@ class Path extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Session\Config\Validator\CookiePathValidator $configValidator * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -27,13 +28,14 @@ class Path extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Session\Config\Validator\CookiePathValidator $configValidator, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->configValidator = $configValidator; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Cookie/Test/Unit/Controller/Index/NoCookiesTest.php b/app/code/Magento/Cookie/Test/Unit/Controller/Index/NoCookiesTest.php index 7e2db7aeaf5eb8a65602b9d0cc7f17f5f56a4fcd..0d9c3439eda6f4528e83b81c9b0105722220053d 100644 --- a/app/code/Magento/Cookie/Test/Unit/Controller/Index/NoCookiesTest.php +++ b/app/code/Magento/Cookie/Test/Unit/Controller/Index/NoCookiesTest.php @@ -95,7 +95,7 @@ class NoCookiesTest extends \PHPUnit_Framework_TestCase $this->requestMock->expects($this->once())->method('setDispatched')->with($this->isTrue()); // Make the call to test - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteRedirectPath() @@ -126,7 +126,7 @@ class NoCookiesTest extends \PHPUnit_Framework_TestCase $this->requestMock->expects($this->once())->method('setDispatched')->with($this->isTrue()); // Make the call to test - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteDefault() @@ -139,6 +139,6 @@ class NoCookiesTest extends \PHPUnit_Framework_TestCase $this->requestMock->expects($this->once())->method('setDispatched')->with($this->isTrue()); // Make the call to test - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Cron/Model/Config/Backend/Product/Alert.php b/app/code/Magento/Cron/Model/Config/Backend/Product/Alert.php index 67d69dfe2b5d6ef2ae6866c12f4cddd71a80a1d8..f46e58be56b8a853c5f0dc1115ed999a8ed815ce 100644 --- a/app/code/Magento/Cron/Model/Config/Backend/Product/Alert.php +++ b/app/code/Magento/Cron/Model/Config/Backend/Product/Alert.php @@ -37,6 +37,7 @@ class Alert extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\ValueFactory $configValueFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -47,6 +48,7 @@ class Alert extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\ValueFactory $configValueFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, @@ -55,11 +57,13 @@ class Alert extends \Magento\Framework\App\Config\Value ) { $this->_runModelPath = $runModelPath; $this->_configValueFactory = $configValueFactory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** - * @return void + * {@inheritdoc} + * + * @return $this * @throws \Exception */ public function afterSave() @@ -97,5 +101,7 @@ class Alert extends \Magento\Framework\App\Config\Value } catch (\Exception $e) { throw new \Exception(__('We can\'t save the cron expression.')); } + + return parent::afterSave(); } } diff --git a/app/code/Magento/Cron/Model/Config/Backend/Sitemap.php b/app/code/Magento/Cron/Model/Config/Backend/Sitemap.php index fecbc2d676eb7e8393eab69f0eace5a99dead111..0fa554959191e62342e5ab4d85612e961e5d2227 100644 --- a/app/code/Magento/Cron/Model/Config/Backend/Sitemap.php +++ b/app/code/Magento/Cron/Model/Config/Backend/Sitemap.php @@ -37,6 +37,7 @@ class Sitemap extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\ValueFactory $configValueFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -47,6 +48,7 @@ class Sitemap extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\ValueFactory $configValueFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, @@ -55,11 +57,11 @@ class Sitemap extends \Magento\Framework\App\Config\Value ) { $this->_runModelPath = $runModelPath; $this->_configValueFactory = $configValueFactory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** - * @return void + * @return $this * @throws \Exception */ public function afterSave() @@ -97,5 +99,6 @@ class Sitemap extends \Magento\Framework\App\Config\Value } catch (\Exception $e) { throw new \Exception(__('We can\'t save the cron expression.')); } + return parent::afterSave(); } } diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php index 08cb0511025c1d582e3c41e82022b822b3676a77..9cc52750b3db8fae06b26b8ebb27af8a481c1804 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php @@ -16,7 +16,7 @@ class FetchRates extends \Magento\CurrencySymbol\Controller\Adminhtml\System\Cur * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\Session $backendSession */ $backendSession = $this->_objectManager->get('Magento\Backend\Model\Session'); diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/Index.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/Index.php index 751020010a7b1b073dd4cab24244f4bf7aea4979..1646068a7c46a5e9cb19379ddad74f41917a7ed7 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/Index.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\CurrencySymbol\Controller\Adminhtml\System\Currency * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_CurrencySymbol::system_currency_rates'); diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRates.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRates.php index 01ba604f11065b040db154c4d422b4882490a500..06e2a760d250ca435701bdcaf3b4c652dd82d49f 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRates.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRates.php @@ -16,7 +16,7 @@ class SaveRates extends \Magento\CurrencySymbol\Controller\Adminhtml\System\Curr * * @return void */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getParam('rate'); if (is_array($data)) { diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Index.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Index.php index 12ae3374a8876fe1633c25498d09a9e70a2810e6..fdc897735d1e0df6641acd87b145a41270c8e71e 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Index.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\CurrencySymbol\Controller\Adminhtml\System\Currency * * @return void */ - public function execute() + public function executeInternal() { // set active menu and breadcrumbs $this->_view->loadLayout(); diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php index 716ca26e493aa4c86f663b4b62dd46ad0a5b81f4..86cb38a43a29f80dc137796ac66c10e0c3b701be 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php @@ -13,7 +13,7 @@ class Save extends \Magento\CurrencySymbol\Controller\Adminhtml\System\Currencys * * @return void */ - public function execute() + public function executeInternal() { $symbolsDataArray = $this->getRequest()->getParam('custom_currency_symbol', null); if (is_array($symbolsDataArray)) { diff --git a/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/IndexTest.php b/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/IndexTest.php index b75df9bce15b8c98e8c0b754a09c22491f431c31..5584c064d30bf3700053ee71417d9c94c949ee9f 100644 --- a/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/IndexTest.php +++ b/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/IndexTest.php @@ -106,6 +106,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->viewMock->expects($this->atLeastOnce())->method('getLayout')->willReturn($this->layoutMock); $this->viewMock->expects($this->atLeastOnce())->method('getPage')->willReturn($this->pageMock); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/SaveTest.php b/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/SaveTest.php index 5d6b9d997fc073eda72d344b707780d7b6aa0220..7e730e7da55faaf890bfb61e3b40f5a447e1a340 100644 --- a/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/SaveTest.php +++ b/app/code/Magento/CurrencySymbol/Test/Unit/Controller/Adminhtml/System/Currencysymbol/SaveTest.php @@ -143,6 +143,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->method('addSuccess') ->with(__('You applied the custom currency symbols.')); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/Customer/Controller/Account/Confirm.php b/app/code/Magento/Customer/Controller/Account/Confirm.php index 2403730753968185dac87698ec8e1a6cab237744..26fcce39f20901f647416af7cb3d3e66e98a2653 100644 --- a/app/code/Magento/Customer/Controller/Account/Confirm.php +++ b/app/code/Magento/Customer/Controller/Account/Confirm.php @@ -86,7 +86,7 @@ class Confirm extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Customer/Controller/Account/Confirmation.php b/app/code/Magento/Customer/Controller/Account/Confirmation.php index 6f050098debd2db188bfe041a07b2d279b669ff0..a1da7d92d79f654821a1850e8b58ff093bb89ce1 100644 --- a/app/code/Magento/Customer/Controller/Account/Confirmation.php +++ b/app/code/Magento/Customer/Controller/Account/Confirmation.php @@ -59,7 +59,7 @@ class Confirmation extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { if ($this->session->isLoggedIn()) { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Customer/Controller/Account/Create.php b/app/code/Magento/Customer/Controller/Account/Create.php index 51e1c151ea8a2956a55d54d8c9400b88ee1ef7e9..fa910d2fbad53ca9f2c662c6242b291133c0b57c 100644 --- a/app/code/Magento/Customer/Controller/Account/Create.php +++ b/app/code/Magento/Customer/Controller/Account/Create.php @@ -51,7 +51,7 @@ class Create extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { if ($this->session->isLoggedIn() || !$this->registration->isAllowed()) { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Customer/Controller/Account/CreatePassword.php b/app/code/Magento/Customer/Controller/Account/CreatePassword.php index f0288b1f2b424c1f869cb9b20b528c6063558854..889b2538eca2ccaf228f151d79b0381aab39258c 100644 --- a/app/code/Magento/Customer/Controller/Account/CreatePassword.php +++ b/app/code/Magento/Customer/Controller/Account/CreatePassword.php @@ -51,7 +51,7 @@ class CreatePassword extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { $resetPasswordToken = (string)$this->getRequest()->getParam('token'); $customerId = (int)$this->getRequest()->getParam('id'); diff --git a/app/code/Magento/Customer/Controller/Account/CreatePost.php b/app/code/Magento/Customer/Controller/Account/CreatePost.php index 8d2c5b81fa416634b64f5f9fecf78aff2d2f1041..3bd8c5bacf8cea46ca70e0f38f1928f7b62c1857 100644 --- a/app/code/Magento/Customer/Controller/Account/CreatePost.php +++ b/app/code/Magento/Customer/Controller/Account/CreatePost.php @@ -201,7 +201,7 @@ class CreatePost extends Action implements AccountInterface * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Account/Edit.php b/app/code/Magento/Customer/Controller/Account/Edit.php index 3f035bdcdf1f1035dc86aed5ff4d022067394917..4c862f9509efdf6c40943ab1b65d4e8524fa99ef 100644 --- a/app/code/Magento/Customer/Controller/Account/Edit.php +++ b/app/code/Magento/Customer/Controller/Account/Edit.php @@ -58,7 +58,7 @@ class Edit extends Action implements AccountInterface * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Account/EditPost.php b/app/code/Magento/Customer/Controller/Account/EditPost.php index a61c551b1719f74d454be81705b744d9ac4b3905..8fbc85dac02c8fd60bad48b6e1c8f224fe28d465 100644 --- a/app/code/Magento/Customer/Controller/Account/EditPost.php +++ b/app/code/Magento/Customer/Controller/Account/EditPost.php @@ -69,7 +69,7 @@ class EditPost extends Action implements AccountInterface * @return \Magento\Framework\Controller\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Account/ForgotPassword.php b/app/code/Magento/Customer/Controller/Account/ForgotPassword.php index daeb13e1eaefbf5044d347ab6e45b1c2dac87ccf..53139df7a1ee462c149253df2ceceaf567341fc7 100644 --- a/app/code/Magento/Customer/Controller/Account/ForgotPassword.php +++ b/app/code/Magento/Customer/Controller/Account/ForgotPassword.php @@ -44,7 +44,7 @@ class ForgotPassword extends Action implements AccountInterface * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php b/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php index be1d15b56e3af770e10b31a88d0106ffffe625b6..e40689ea1e58c17ffa9b18ce56eb2b07aa25641c 100644 --- a/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php +++ b/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php @@ -51,7 +51,7 @@ class ForgotPasswordPost extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Account/Index.php b/app/code/Magento/Customer/Controller/Account/Index.php index c99d8dd199e7d941dc66b346bd35be089d11f975..db90eec8363c03e54ad38ac079157352643a1aad 100644 --- a/app/code/Magento/Customer/Controller/Account/Index.php +++ b/app/code/Magento/Customer/Controller/Account/Index.php @@ -35,7 +35,7 @@ class Index extends Action implements AccountInterface * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Account/Login.php b/app/code/Magento/Customer/Controller/Account/Login.php index ca404047dd27c8e28f5bc400069830d81f37ee2a..72511c59423fbb7386abac23ba5a7bbe5efb980a 100644 --- a/app/code/Magento/Customer/Controller/Account/Login.php +++ b/app/code/Magento/Customer/Controller/Account/Login.php @@ -44,7 +44,7 @@ class Login extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { if ($this->session->isLoggedIn()) { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Customer/Controller/Account/LoginPost.php b/app/code/Magento/Customer/Controller/Account/LoginPost.php index 7b6191eb2556b8e4c6eb2325519a96fbc23ee21b..b1b3a8b020c9ab9f0ca73bc32fd09aaa8fc6b980 100644 --- a/app/code/Magento/Customer/Controller/Account/LoginPost.php +++ b/app/code/Magento/Customer/Controller/Account/LoginPost.php @@ -67,7 +67,7 @@ class LoginPost extends Action implements AccountInterface * @return \Magento\Framework\Controller\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { if ($this->session->isLoggedIn() || !$this->formKeyValidator->validate($this->getRequest())) { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Customer/Controller/Account/Logout.php b/app/code/Magento/Customer/Controller/Account/Logout.php index be0dcd6ba5e326fec3e6d9276d1588868b0a5c1b..4d070b401cee3983d953937dcf308908e320c4ec 100644 --- a/app/code/Magento/Customer/Controller/Account/Logout.php +++ b/app/code/Magento/Customer/Controller/Account/Logout.php @@ -35,7 +35,7 @@ class Logout extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $lastCustomerId = $this->session->getId(); $this->session->logout()->setBeforeAuthUrl($this->_redirect->getRefererUrl()) diff --git a/app/code/Magento/Customer/Controller/Account/LogoutSuccess.php b/app/code/Magento/Customer/Controller/Account/LogoutSuccess.php index 77eb53149907d088f7e4432e43990369bf710b48..8185c93a60c9763ace6e6015758828a1fe348280 100644 --- a/app/code/Magento/Customer/Controller/Account/LogoutSuccess.php +++ b/app/code/Magento/Customer/Controller/Account/LogoutSuccess.php @@ -35,7 +35,7 @@ class LogoutSuccess extends Action implements AccountInterface * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { return $this->resultPageFactory->create(); } diff --git a/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php b/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php index 0e996ea9a809c356ae4dd3adeea49ed2327db0ba..1044c71379f2aef3e3379ee4670aecbc7e6eef01 100644 --- a/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php +++ b/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php @@ -51,7 +51,7 @@ class ResetPasswordPost extends Action implements AccountInterface * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Address.php b/app/code/Magento/Customer/Controller/Address.php index b527db41ac049163c61f98e53663c85d266e26be..f4ffb6c9dac6ddbb253c8edb6f9cc4196f718659 100644 --- a/app/code/Magento/Customer/Controller/Address.php +++ b/app/code/Magento/Customer/Controller/Address.php @@ -120,12 +120,12 @@ abstract class Address extends \Magento\Framework\App\Action\Action * @param RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { if (!$this->_getSession()->authenticate()) { $this->_actionFlag->set('', 'no-dispatch', true); } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Customer/Controller/Address/Delete.php b/app/code/Magento/Customer/Controller/Address/Delete.php index 6dfa17be32b107e723e9ec81f359eee0230085dc..6c736e3fcdff83e3cba840f7dba30953be2f3cbd 100644 --- a/app/code/Magento/Customer/Controller/Address/Delete.php +++ b/app/code/Magento/Customer/Controller/Address/Delete.php @@ -11,7 +11,7 @@ class Delete extends \Magento\Customer\Controller\Address /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $addressId = $this->getRequest()->getParam('id', false); diff --git a/app/code/Magento/Customer/Controller/Address/Edit.php b/app/code/Magento/Customer/Controller/Address/Edit.php index 0691ffd8ad52739e16de23ed0457ccab39566941..5857b0c64b2e53113ced7e8584102a13f59cbd01 100644 --- a/app/code/Magento/Customer/Controller/Address/Edit.php +++ b/app/code/Magento/Customer/Controller/Address/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Customer\Controller\Address * * @return \Magento\Framework\Controller\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Address/Form.php b/app/code/Magento/Customer/Controller/Address/Form.php index b30d453dce8de18d6a580f2d213a386feecd91a0..6699bf27d5e2c199a567962d7d3c20c71a39b297 100644 --- a/app/code/Magento/Customer/Controller/Address/Form.php +++ b/app/code/Magento/Customer/Controller/Address/Form.php @@ -13,7 +13,7 @@ class Form extends \Magento\Customer\Controller\Address * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Address/FormPost.php b/app/code/Magento/Customer/Controller/Address/FormPost.php index 9360ca0f7d6d369f589a534a1cba0bd7ca489270..eb3e6817dd0603059c535d49aa325805b61b900e 100644 --- a/app/code/Magento/Customer/Controller/Address/FormPost.php +++ b/app/code/Magento/Customer/Controller/Address/FormPost.php @@ -176,7 +176,7 @@ class FormPost extends \Magento\Customer\Controller\Address * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $redirectUrl = null; if (!$this->_formKeyValidator->validate($this->getRequest())) { diff --git a/app/code/Magento/Customer/Controller/Address/Index.php b/app/code/Magento/Customer/Controller/Address/Index.php index b445fa6fbfa1455361dd81360fe1c94cc700d6cd..1d5c09e317b6150b180a8157f66677dec380c8b1 100644 --- a/app/code/Magento/Customer/Controller/Address/Index.php +++ b/app/code/Magento/Customer/Controller/Address/Index.php @@ -68,7 +68,7 @@ class Index extends \Magento\Customer\Controller\Address * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $addresses = $this->customerRepository->getById($this->_getSession()->getCustomerId())->getAddresses(); if (count($addresses)) { diff --git a/app/code/Magento/Customer/Controller/Address/NewAction.php b/app/code/Magento/Customer/Controller/Address/NewAction.php index 4bfdabbbd5ef154644e6a12fb1fc43ab156c670e..9bd9402d5e216f7f89537fc64a94c062472ccfb3 100644 --- a/app/code/Magento/Customer/Controller/Address/NewAction.php +++ b/app/code/Magento/Customer/Controller/Address/NewAction.php @@ -11,7 +11,7 @@ class NewAction extends \Magento\Customer\Controller\Address /** * @return \Magento\Framework\Controller\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Configure.php b/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Configure.php index c74520cb96580002cba99fdafb077335bbd0d09b..ea8a214c16a76f3a9df3f01baefee1c1738430ff 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Configure.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Configure.php @@ -13,7 +13,7 @@ class Configure extends \Magento\Customer\Controller\Adminhtml\Cart\Product\Comp * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $configureResult = new \Magento\Framework\DataObject(); try { diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Update.php b/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Update.php index 42f9ee513a857b28a43b358778fb0a527902cc46..7daaa2cc9ec1a830d459bbdab160e918c2131531 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Update.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/Cart/Update.php @@ -13,7 +13,7 @@ class Update extends \Magento\Customer\Controller\Adminhtml\Cart\Product\Composi * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $updateResult = new \Magento\Framework\DataObject(); try { diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Customer/InvalidateToken.php b/app/code/Magento/Customer/Controller/Adminhtml/Customer/InvalidateToken.php index 92961f2a0d40f1c6a710dc8c1fb698e3251d0e83..f4f788c61b715bb97f0fd5e7f7356dad20c47f3a 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Customer/InvalidateToken.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Customer/InvalidateToken.php @@ -125,7 +125,7 @@ class InvalidateToken extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); if ($customerId = $this->getRequest()->getParam('customer_id')) { diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php b/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php index 17af771114ffc3fce19876b555d276d7ca4e1434..5b3b91fcf054a0302e34eb516cf2b7970d3834c7 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php @@ -15,7 +15,7 @@ class Delete extends \Magento\Customer\Controller\Adminhtml\Group * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Group/Edit.php b/app/code/Magento/Customer/Controller/Adminhtml/Group/Edit.php index 303d2f4f1afffc2e96772587c9b8450ff7cb145b..838cf9b940a1a6a8b6f40d07b843cb92b148df25 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Group/Edit.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Group/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Customer\Controller\Adminhtml\Group * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { return $this->resultForwardFactory->create()->forward('new'); } diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Group/Index.php b/app/code/Magento/Customer/Controller/Adminhtml/Group/Index.php index 290e77238ff1123b3f38439c4ab7b77bb8c49823..f80a6fcaa2740ffc362e3cfc1e43aadc05df6b06 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Group/Index.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Group/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Customer\Controller\Adminhtml\Group * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Group/NewAction.php b/app/code/Magento/Customer/Controller/Adminhtml/Group/NewAction.php index 0750422cd9435689c0b6bdeecb2b553f1e759da7..383af26a0378a3330b4c09c0c876f72d77e11fc7 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Group/NewAction.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Group/NewAction.php @@ -28,7 +28,7 @@ class NewAction extends \Magento\Customer\Controller\Adminhtml\Group * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $groupId = $this->_initGroup(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php b/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php index a842d8653b3398a5effa2d4b8872849b50b3abcc..a775194f12ef9f707268dc9f39dc73c7c0522d75 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php @@ -67,7 +67,7 @@ class Save extends \Magento\Customer\Controller\Adminhtml\Group * * @return \Magento\Backend\Model\View\Result\Redirect|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $taxClass = (int)$this->getRequest()->getParam('tax_class'); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/AbstractMassAction.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/AbstractMassAction.php index 9a3ca5645f5c73b97be37c20bc7ef6810902927e..096efc640be89592440e4c3b0f1880e2ef1471e2 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/AbstractMassAction.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/AbstractMassAction.php @@ -51,7 +51,7 @@ abstract class AbstractMassAction extends \Magento\Backend\App\Action * @return \Magento\Backend\Model\View\Result\Redirect * @throws \Magento\Framework\Exception\LocalizedException|\Exception */ - public function execute() + public function executeInternal() { try { $collection = $this->filter->getCollection($this->collectionFactory->create()); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Cart.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Cart.php index e1c4dd68c9cdedc61beaf09a035d0ba84ad83084..ff39bf28ac3ac48247c305ae55473e45fba44118 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Cart.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Cart.php @@ -14,7 +14,7 @@ class Cart extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $customerId = $this->initCurrentCustomer(); $websiteId = $this->getRequest()->getParam('website_id'); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Carts.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Carts.php index 4c4cb77fa3bd55adc8efa5d9e581b6d5d6c4cd0d..fc4c0c0aecaa900d7b603720509781db91fbd392 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Carts.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Carts.php @@ -12,7 +12,7 @@ class Carts extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->initCurrentCustomer(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Delete.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Delete.php index 503969226aa201cbcf2c74a7643f094bdd380612..c8a0615408f8f6fd101104f9812138f7a734e9ce 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Delete.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Delete.php @@ -14,7 +14,7 @@ class Delete extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); $formKeyIsValid = $this->_formKeyValidator->validate($this->getRequest()); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php index 64af44a9bb84e52306062e71950f59aea2441755..0820fbea9621796a7094051b319169dbe2ff5ac9 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php @@ -18,7 +18,7 @@ class Edit extends \Magento\Customer\Controller\Adminhtml\Index * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { $customerId = $this->initCurrentCustomer(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Index.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Index.php index b238a8287e70f84ec71938500b355508d3608537..fa9dfbd5529c01ef566c0d2ec839d4ae76c16cca 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Index.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Index.php @@ -12,7 +12,7 @@ class Index extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getQuery('ajax')) { $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/InlineEdit.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/InlineEdit.php index f97c48b0ebc1d6e62e2949febdbeda736fee200f..4cbc90e88a50c1c994fc180980183c21a7669cb5 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/InlineEdit.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/InlineEdit.php @@ -60,7 +60,7 @@ class InlineEdit extends \Magento\Backend\App\Action /** * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultJsonFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/LastOrders.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/LastOrders.php index fa0dcca712a90e36a35e3df03c6facb44bb31c65..4711b9e2b1855224ef4fcb797d1b225f80be7c69 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/LastOrders.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/LastOrders.php @@ -12,7 +12,7 @@ class LastOrders extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->initCurrentCustomer(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/NewAction.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/NewAction.php index d3bdd1eadfd8e7b1a238514d27ef086e88f8db11..bdb7a8b79a61735064af77a7ce8cc12051db43dc 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/NewAction.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/NewAction.php @@ -12,7 +12,7 @@ class NewAction extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $resultForward = $this->resultForwardFactory->create(); $resultForward->forward('edit'); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Newsletter.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Newsletter.php index 6c27c0a46bd8f1ce3e3b62049bc89e70e364ed9f..6918cf849549d2328d86f3bb09221ef1732bff3a 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Newsletter.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Newsletter.php @@ -12,7 +12,7 @@ class Newsletter extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $customerId = $this->initCurrentCustomer(); /** @var \Magento\Newsletter\Model\Subscriber $subscriber */ diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Orders.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Orders.php index c825e5c24a85b8f8e83e1a8bf101fbc648e8fc58..1964c95842840fe12c3b85914f0384d6a407e1b2 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Orders.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Orders.php @@ -12,7 +12,7 @@ class Orders extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->initCurrentCustomer(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/ProductReviews.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/ProductReviews.php index effaa2618f25a46c66b7d59d5cf50f44277614bb..3a8f93a1c304fcbe47bb816495ef61255ecaeed3 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/ProductReviews.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/ProductReviews.php @@ -12,7 +12,7 @@ class ProductReviews extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $customerId = $this->initCurrentCustomer(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php index c330eedde0fff30bc960dcacaa7c7e3867690fe1..43c2d474843b118cbfde20f348382a2fc02fbac8 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php @@ -14,7 +14,7 @@ class ResetPassword extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); $customerId = (int)$this->getRequest()->getParam('customer_id', 0); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php index 2cbe283339dfef950a4bd5ab94263e29a522b56e..b4aa639c817e73a070c15f6ad1df6030f0309413 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php @@ -176,7 +176,7 @@ class Save extends \Magento\Customer\Controller\Adminhtml\Index * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $returnToEdit = false; $originalRequestData = $this->getRequest()->getPostValue(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Validate.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Validate.php index bd7230f1aa1d901ab0e31bb49e240c1e18f53679..001726280a424351a5031071cddeea7f4dc52382 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Validate.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Validate.php @@ -107,7 +107,7 @@ class Validate extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $response = new \Magento\Framework\DataObject(); $response->setError(0); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewCart.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewCart.php index ee95065596c0aff229956b2b9b14eeabc44dc04d..cda5a37bc0e42d63ec6632365516d29605e4e00d 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewCart.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewCart.php @@ -12,7 +12,7 @@ class ViewCart extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->initCurrentCustomer(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewWishlist.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewWishlist.php index 34fa6b66a1187bc68a069db5da9ea1cf3386c8dc..2f201d260289c24c6f95cca3f1153511967f2b1b 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewWishlist.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/ViewWishlist.php @@ -12,7 +12,7 @@ class ViewWishlist extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->initCurrentCustomer(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Viewfile.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Viewfile.php index 52a8ea95f9412a577cce39b877c6b92ddfa71dfe..75341af2d6a6c78aa8ec2415ffc18cbdb202953b 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Viewfile.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Viewfile.php @@ -129,7 +129,7 @@ class Viewfile extends \Magento\Customer\Controller\Adminhtml\Index * * @SuppressWarnings(PHPMD.ExitExpression) */ - public function execute() + public function executeInternal() { $file = null; $plain = false; diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Wishlist.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Wishlist.php index 6f7e0e3bfbd81934b39cff712c45c6e83ab3271f..c550f125dc7a27ba66247b04f6658ae030190dab 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Wishlist.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Wishlist.php @@ -12,7 +12,7 @@ class Wishlist extends \Magento\Customer\Controller\Adminhtml\Index * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $customerId = $this->initCurrentCustomer(); $itemId = (int)$this->getRequest()->getParam('delete'); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Online/Index.php b/app/code/Magento/Customer/Controller/Adminhtml/Online/Index.php index 8bd9ce97c3432069f3d62555d8a80502fce41fe2..172622ac17624e8a1abea02dd0f913ecf4272452 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Online/Index.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Online/Index.php @@ -43,7 +43,7 @@ class Index extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/Validate.php b/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/Validate.php index f1f638a852e2e21d213cd0bb6a89b49f69a7695a..e8a7b96b4bbe38844f27ed5ca63731a66196496d 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/Validate.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/Validate.php @@ -31,7 +31,7 @@ class Validate extends \Magento\Customer\Controller\Adminhtml\System\Config\Vali * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $result = $this->_validate(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/ValidateAdvanced.php b/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/ValidateAdvanced.php index b3df87ed9ffb089edf7e113aea44f2ee450416a3..8d8d34086870a0dc6cb8ef771f5e0172e09ff3b6 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/ValidateAdvanced.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/System/Config/Validatevat/ValidateAdvanced.php @@ -30,7 +30,7 @@ class ValidateAdvanced extends \Magento\Customer\Controller\Adminhtml\System\Con * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $result = $this->_validate(); $valid = $result->getIsValid(); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Configure.php b/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Configure.php index 6101483eb983b45c909c5e40f38275ab575e7ccc..31038f2bd083fa5ee271b16e71a4505635906054 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Configure.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Configure.php @@ -15,7 +15,7 @@ class Configure extends \Magento\Customer\Controller\Adminhtml\Wishlist\Product\ * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $configureResult = new \Magento\Framework\DataObject(); try { diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Update.php b/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Update.php index cb895085d7f6dc286a55be083740673e0b96b5e5..8e098708fb976eb5bc7c399f81b3147c373f632d 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Update.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist/Update.php @@ -15,7 +15,7 @@ class Update extends \Magento\Customer\Controller\Adminhtml\Wishlist\Product\Com * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { // Update wishlist item $updateResult = new \Magento\Framework\DataObject(); diff --git a/app/code/Magento/Customer/Controller/Ajax/Login.php b/app/code/Magento/Customer/Controller/Ajax/Login.php index 4258ebf1ef0e18d1c4042425036a343860e8ab38..08b72b1e3ec6c437fd67694cc873bc498a4dfa54 100644 --- a/app/code/Magento/Customer/Controller/Ajax/Login.php +++ b/app/code/Magento/Customer/Controller/Ajax/Login.php @@ -76,7 +76,7 @@ class Login extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $credentials = null; $httpBadRequestCode = 400; diff --git a/app/code/Magento/Customer/Controller/Ajax/Logout.php b/app/code/Magento/Customer/Controller/Ajax/Logout.php index 69ce4693b035ebc3644eb74a74b28afc1725b146..4d90a7ae39a2cb44a00d87271f658781b5cc7fbc 100644 --- a/app/code/Magento/Customer/Controller/Ajax/Logout.php +++ b/app/code/Magento/Customer/Controller/Ajax/Logout.php @@ -47,7 +47,7 @@ class Logout extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $lastCustomerId = $this->customerSession->getId(); $this->customerSession->logout() diff --git a/app/code/Magento/Customer/Controller/Plugin/Account.php b/app/code/Magento/Customer/Controller/Plugin/Account.php index c035c983d8028b4fce8c9b1edb57f716c582b59e..10f2c8fc15fc2cbc6ef616643101cfb144a7682b 100644 --- a/app/code/Magento/Customer/Controller/Plugin/Account.php +++ b/app/code/Magento/Customer/Controller/Plugin/Account.php @@ -41,7 +41,7 @@ class Account * @param RequestInterface $request * @return mixed */ - public function aroundDispatch( + public function aroundExecute( ActionInterface $subject, \Closure $proceed, RequestInterface $request diff --git a/app/code/Magento/Customer/Controller/Review.php b/app/code/Magento/Customer/Controller/Review.php index 2a667e4c3e77f6b0a7a29fc70fd4c1bb9b22ccc4..396ad3da6929787cc5847f9876368580cb7d5315 100644 --- a/app/code/Magento/Customer/Controller/Review.php +++ b/app/code/Magento/Customer/Controller/Review.php @@ -30,7 +30,7 @@ class Review extends \Magento\Framework\App\Action\Action /** * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { return $this->resultPageFactory->create(); } diff --git a/app/code/Magento/Customer/Controller/Section/Load.php b/app/code/Magento/Customer/Controller/Section/Load.php index df4abe308baa59d433515b52d4ab5cbd72fa20da..503c075d9bf0f5c46b0791d8659afbd22beac0d0 100644 --- a/app/code/Magento/Customer/Controller/Section/Load.php +++ b/app/code/Magento/Customer/Controller/Section/Load.php @@ -51,7 +51,7 @@ class Load extends \Magento\Framework\App\Action\Action /** * @return \Magento\Framework\Controller\Result\Json|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultJsonFactory->create(); diff --git a/app/code/Magento/Customer/Model/AccountManagement.php b/app/code/Magento/Customer/Model/AccountManagement.php index 500a104861d3bd1f8e74d1454c24dddf30adeab8..06be21a82e3c108edd8838b8834c7b1ac1676051 100644 --- a/app/code/Magento/Customer/Model/AccountManagement.php +++ b/app/code/Magento/Customer/Model/AccountManagement.php @@ -513,6 +513,13 @@ class AccountManagement implements AccountManagementInterface $customer->setStoreId($storeId); } + // Update 'created_in' value with actual store name + if ($customer->getId() === null) { + $storeName = $this->storeManager->getStore($customer->getStoreId()) + ->getName(); + $customer->setCreatedIn($storeName); + } + $customerAddresses = $customer->getAddresses() ?: []; $customer->setAddresses(null); try { diff --git a/app/code/Magento/Customer/Model/App/Action/ContextPlugin.php b/app/code/Magento/Customer/Model/App/Action/ContextPlugin.php index a5b268eaa1744d308b3a5a732c44663d4ecd45cc..8198a70957f875e0f47b5348ff8106b995af4d18 100644 --- a/app/code/Magento/Customer/Model/App/Action/ContextPlugin.php +++ b/app/code/Magento/Customer/Model/App/Action/ContextPlugin.php @@ -43,7 +43,7 @@ class ContextPlugin * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundDispatch( + public function aroundExecute( \Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/app/code/Magento/Customer/Model/Config/Backend/Address/Street.php b/app/code/Magento/Customer/Model/Config/Backend/Address/Street.php index d456491e5c33462e25d49386eb0c77fbf7674684..9df2651f2982eac6a0aa3d1ee9c92acc360eb72d 100644 --- a/app/code/Magento/Customer/Model/Config/Backend/Address/Street.php +++ b/app/code/Magento/Customer/Model/Config/Backend/Address/Street.php @@ -10,7 +10,7 @@ use Magento\Framework\App\Config\ScopeConfigInterface; /** * Line count config model for customer address street attribute * - * @method string getWebsiteCode + * @method string getWebsiteCode() */ class Street extends \Magento\Framework\App\Config\Value { @@ -26,6 +26,7 @@ class Street extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -36,6 +37,7 @@ class Street extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -43,7 +45,7 @@ class Street extends \Magento\Framework\App\Config\Value array $data = [] ) { $this->_eavConfig = $eavConfig; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->_storeManager = $storeManager; } @@ -71,7 +73,7 @@ class Street extends \Magento\Framework\App\Config\Value break; } $attribute->save(); - return $this; + return parent::afterSave(); } /** diff --git a/app/code/Magento/Customer/Model/Config/Backend/CreateAccount/DisableAutoGroupAssignDefault.php b/app/code/Magento/Customer/Model/Config/Backend/CreateAccount/DisableAutoGroupAssignDefault.php index 2f889d0f7c0788ab8d8a0162fe0fea4b9d046484..486e1ac1227b11a8cc672727148b51a3525d5360 100644 --- a/app/code/Magento/Customer/Model/Config/Backend/CreateAccount/DisableAutoGroupAssignDefault.php +++ b/app/code/Magento/Customer/Model/Config/Backend/CreateAccount/DisableAutoGroupAssignDefault.php @@ -16,6 +16,7 @@ class DisableAutoGroupAssignDefault extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -25,13 +26,14 @@ class DisableAutoGroupAssignDefault extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->eavConfig = $eavConfig; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Customer/Model/Config/Backend/Show/Customer.php b/app/code/Magento/Customer/Model/Config/Backend/Show/Customer.php index 31ed960864fcad1679749f632a44a348f21ecf49..5d614685145d9c68ff74e604c813587c5f3a606b 100644 --- a/app/code/Magento/Customer/Model/Config/Backend/Show/Customer.php +++ b/app/code/Magento/Customer/Model/Config/Backend/Show/Customer.php @@ -26,6 +26,7 @@ class Customer extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -36,6 +37,7 @@ class Customer extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -43,7 +45,7 @@ class Customer extends \Magento\Framework\App\Config\Value array $data = [] ) { $this->_eavConfig = $eavConfig; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->storeManager = $storeManager; } diff --git a/app/code/Magento/Customer/Model/Config/Share.php b/app/code/Magento/Customer/Model/Config/Share.php index 5fb8bacb5743c439a0b19e4e0f16e81d64b06083..4ff773cabc38bc8286a64abb67420bd8d7750958 100644 --- a/app/code/Magento/Customer/Model/Config/Share.php +++ b/app/code/Magento/Customer/Model/Config/Share.php @@ -40,6 +40,7 @@ class Share extends \Magento\Framework\App\Config\Value implements \Magento\Fram * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Customer\Model\ResourceModel\Customer $customerResource * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -50,6 +51,7 @@ class Share extends \Magento\Framework\App\Config\Value implements \Magento\Fram \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Customer\Model\ResourceModel\Customer $customerResource, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -58,7 +60,7 @@ class Share extends \Magento\Framework\App\Config\Value implements \Magento\Fram ) { $this->_storeManager = $storeManager; $this->_customerResource = $customerResource; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php index f3dee06b411415dc659cc43419cf585aef909165..0a0d2dbbefd07d4d42d5fdaa5eae758e15e994c0 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php @@ -190,7 +190,7 @@ class ConfirmTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->model->execute()); + $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->model->executeInternal()); } /** @@ -232,7 +232,7 @@ class ConfirmTest extends \PHPUnit_Framework_TestCase ->with($this->equalTo($testUrl)) ->willReturnSelf(); - $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->model->execute()); + $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->model->executeInternal()); } /** @@ -307,7 +307,7 @@ class ConfirmTest extends \PHPUnit_Framework_TestCase ->method('getStore') ->will($this->returnValue($this->storeMock)); - $this->model->execute(); + $this->model->executeInternal(); } /** @@ -404,7 +404,7 @@ class ConfirmTest extends \PHPUnit_Framework_TestCase ) ->willReturn($isSetFlag); - $this->model->execute(); + $this->model->executeInternal(); } /** diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePasswordTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePasswordTest.php index 3a1172d0953f30ccee678993a29dbccd20b17e11..6ef1faa6378aee13b793c8cdc137e40f7204e7ff 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePasswordTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePasswordTest.php @@ -108,7 +108,7 @@ class CreatePasswordTest extends \PHPUnit_Framework_TestCase ->with('*/*/createpassword', []) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } public function testExecuteWithSession() @@ -176,7 +176,7 @@ class CreatePasswordTest extends \PHPUnit_Framework_TestCase ->with($token) ->willReturnSelf(); - $this->assertEquals($pageMock, $this->model->execute()); + $this->assertEquals($pageMock, $this->model->executeInternal()); } public function testExecuteWithException() @@ -225,6 +225,6 @@ class CreatePasswordTest extends \PHPUnit_Framework_TestCase ->with('*/*/forgotpassword', []) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php index c765dc83939220720c4c397a09c333fd852ddfdc..d8815ba253b4729edfbbe559030d7f6edc2ccf60 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php @@ -270,7 +270,7 @@ class CreatePostTest extends \PHPUnit_Framework_TestCase $this->customerRepository->expects($this->never()) ->method('save'); - $this->model->execute(); + $this->model->executeInternal(); } public function testRegenerateIdOnExecution() @@ -297,7 +297,7 @@ class CreatePostTest extends \PHPUnit_Framework_TestCase $this->storeManagerMock->expects($this->once()) ->method('getStore') ->willReturn($this->storeMock); - $this->model->execute(); + $this->model->executeInternal(); } /** @@ -391,7 +391,7 @@ class CreatePostTest extends \PHPUnit_Framework_TestCase ->method('getTaxCalculationAddressType') ->will($this->returnValue($addressType)); - $this->model->execute(); + $this->model->executeInternal(); } /** @@ -539,7 +539,7 @@ class CreatePostTest extends \PHPUnit_Framework_TestCase ->method('getStore') ->will($this->returnValue($this->storeMock)); - $this->model->execute(); + $this->model->executeInternal(); } public function getSuccessRedirectDataProvider() diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreateTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreateTest.php index 0706355a39fce42f895f2abfc8957f1ca9f3b0cf..894582be4b310e0c46c37f8982c12a992a124f42 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreateTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreateTest.php @@ -116,7 +116,7 @@ class CreateTest extends \PHPUnit_Framework_TestCase $this->resultPageMock->expects($this->never()) ->method('getLayout'); - $this->object->execute(); + $this->object->executeInternal(); } /** @@ -139,6 +139,6 @@ class CreateTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($this->resultPageMock); - $this->object->execute(); + $this->object->executeInternal(); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php index 991a4b17ecab6c4a1370ddff24b61ec035493f02..acd413d000684d63c7f75aeb9908009966e52b25 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php @@ -131,7 +131,7 @@ class EditPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/edit') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->model->execute()); + $this->assertSame($this->resultRedirect, $this->model->executeInternal()); } public function testNoPostValues() @@ -150,7 +150,7 @@ class EditPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/edit') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->model->execute()); + $this->assertSame($this->resultRedirect, $this->model->executeInternal()); } public function testGeneralSave() @@ -211,7 +211,7 @@ class EditPostTest extends \PHPUnit_Framework_TestCase ->with('customer/account') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->model->execute()); + $this->assertSame($this->resultRedirect, $this->model->executeInternal()); } /** @@ -311,7 +311,7 @@ class EditPostTest extends \PHPUnit_Framework_TestCase ->willReturn($errors['counter']); - $this->assertSame($this->resultRedirect, $this->model->execute()); + $this->assertSame($this->resultRedirect, $this->model->executeInternal()); } /** @@ -443,7 +443,7 @@ class EditPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/edit') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->model->execute()); + $this->assertSame($this->resultRedirect, $this->model->executeInternal()); } /** diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/ForgotPasswordPostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/ForgotPasswordPostTest.php index 8f060f2dd3bfff37f3d21a332e09bad8cd6af3a9..0cf693299feecf70e6c126115269ccf8fdc3376b 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/ForgotPasswordPostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/ForgotPasswordPostTest.php @@ -107,7 +107,7 @@ class ForgotPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/forgotpassword') ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->controller->execute()); + $this->assertSame($this->resultRedirect, $this->controller->executeInternal()); } public function testExecute() @@ -143,7 +143,7 @@ class ForgotPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteNoSuchEntityException() @@ -179,7 +179,7 @@ class ForgotPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteException() @@ -207,7 +207,7 @@ class ForgotPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/forgotpassword') ->willReturnSelf(); - $this->controller->execute(); + $this->controller->executeInternal(); } protected function prepareContext() diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/LoginPostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/LoginPostTest.php index e71e413d7e11738df8aa86059139958cd34584d8..ca9a975b7cd61c9294b215bc106ee50938a8500f 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/LoginPostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/LoginPostTest.php @@ -133,7 +133,7 @@ class LoginPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } /** @@ -176,7 +176,7 @@ class LoginPostTest extends \PHPUnit_Framework_TestCase ->method('getRedirect') ->willReturn($this->redirect); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } public function testExecuteEmptyLoginData() @@ -207,7 +207,7 @@ class LoginPostTest extends \PHPUnit_Framework_TestCase ->method('getRedirect') ->willReturn($this->redirect); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } public function testExecuteSuccess() @@ -255,7 +255,7 @@ class LoginPostTest extends \PHPUnit_Framework_TestCase ->method('getRedirect') ->willReturn($this->redirect); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } /** @@ -303,7 +303,7 @@ class LoginPostTest extends \PHPUnit_Framework_TestCase ->method('getRedirect') ->willReturn($this->redirect); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } /** diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/ResetPasswordPostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/ResetPasswordPostTest.php index 6cb488a07c6ba503a0ebfe96819fcd1ca805215c..5581be2e75ae7dbaef2d325929a6a42792c26e86 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/ResetPasswordPostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/ResetPasswordPostTest.php @@ -142,7 +142,7 @@ class ResetPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/login', []) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } public function testExecuteWithException() @@ -208,7 +208,7 @@ class ResetPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/createPassword', ['id' => $customerId, 'token' => $token]) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } public function testExecuteWithWrongConfirmation() @@ -255,7 +255,7 @@ class ResetPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/createPassword', ['id' => $customerId, 'token' => $token]) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } public function testExecuteWithEmptyPassword() @@ -302,6 +302,6 @@ class ResetPasswordPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/createPassword', ['id' => $customerId, 'token' => $token]) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Address/FormPostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Address/FormPostTest.php index 39fa2018cff7a821bf4fbfa42055ed74aec74986..e082233b6e26ffbd1d6c492efb02c94118a6d258 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Address/FormPostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Address/FormPostTest.php @@ -342,7 +342,7 @@ class FormPostTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } public function testExecuteNoPostData() @@ -389,7 +389,7 @@ class FormPostTest extends \PHPUnit_Framework_TestCase ->with($url) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } /** @@ -575,7 +575,7 @@ class FormPostTest extends \PHPUnit_Framework_TestCase ->with($url) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } public function dataProviderTestExecute() @@ -668,7 +668,7 @@ class FormPostTest extends \PHPUnit_Framework_TestCase ->with($url) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } public function testExecuteException() @@ -731,6 +731,6 @@ class FormPostTest extends \PHPUnit_Framework_TestCase ->with($url) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/IndexTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/IndexTest.php index 38d6e7d53efae96d30b573e48418ca76638bc514..17c9033803117a8cd4c0c14889261efe2d417705 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/IndexTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/IndexTest.php @@ -108,7 +108,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::executeInternal */ public function testExecute() { @@ -140,12 +140,12 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\View\Result\Page', - $this->indexController->execute() + $this->indexController->executeInternal() ); } /** - * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::executeInternal */ public function testExecuteAjax() { @@ -161,7 +161,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Forward', - $this->indexController->execute() + $this->indexController->executeInternal() ); } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/InlineEditTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/InlineEditTest.php index e806e30201346c298538a5230d9cbbfbac2a4cd2..181b8dbab6ec0a217c44d3fbe1a06e89c5bcffc7 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/InlineEditTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/InlineEditTest.php @@ -259,7 +259,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ->method('save') ->with($this->customerData); $this->prepareMocksForErrorMessagesProcessing(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } public function testExecuteWithoutItems() @@ -283,7 +283,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase 'error' => true, ]) ->willReturnSelf(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } public function testExecuteLocalizedException() @@ -305,7 +305,7 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ->with($exception); $this->prepareMocksForErrorMessagesProcessing(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } public function testExecuteException() @@ -327,6 +327,6 @@ class InlineEditTest extends \PHPUnit_Framework_TestCase ->with($exception); $this->prepareMocksForErrorMessagesProcessing(); - $this->assertSame($this->resultJson, $this->controller->execute()); + $this->assertSame($this->resultJson, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassAssignGroupTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassAssignGroupTest.php index 4cbd57be53837fa04ad2072efaba9338370e7041..f78e202b884d20e6baed32425b97cb02f56b3569 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassAssignGroupTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassAssignGroupTest.php @@ -172,7 +172,7 @@ class MassAssignGroupTest extends \PHPUnit_Framework_TestCase ->with('customer/*/index') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } public function testExecuteWithException() @@ -191,6 +191,6 @@ class MassAssignGroupTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with('Some message.'); - $this->massAction->execute(); + $this->massAction->executeInternal(); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassDeleteTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassDeleteTest.php index de91d73d10a762d36ab8cdc07b815a1bdae853ac..dcfc2084e261cff34e064db19f08d99e96a3e123 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassDeleteTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassDeleteTest.php @@ -172,7 +172,7 @@ class MassDeleteTest extends \PHPUnit_Framework_TestCase ->with('customer/*/index') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } public function testExecuteWithException() @@ -191,6 +191,6 @@ class MassDeleteTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with('Some message.'); - $this->massAction->execute(); + $this->massAction->executeInternal(); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassSubscribeTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassSubscribeTest.php index 8aff6b96313fc0e0a2f95bff9e66dc4a00591a91..6e288583c1c9a4ba0da09a161624e9d5f0f1e405 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassSubscribeTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassSubscribeTest.php @@ -188,7 +188,7 @@ class MassSubscribeTest extends \PHPUnit_Framework_TestCase ->with('customer/*/index') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } public function testExecuteWithException() @@ -207,6 +207,6 @@ class MassSubscribeTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with('Some message.'); - $this->massAction->execute(); + $this->massAction->executeInternal(); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassUnsubscribeTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassUnsubscribeTest.php index 00eaa7546e7df9c4db3d7fae1e4a7ddf2a6ef9c7..9129be9c89fd0edc354953fe455ee849c256e8e3 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassUnsubscribeTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/MassUnsubscribeTest.php @@ -188,7 +188,7 @@ class MassUnsubscribeTest extends \PHPUnit_Framework_TestCase ->with('customer/*/index') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } public function testExecuteWithException() @@ -207,6 +207,6 @@ class MassUnsubscribeTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with('Some message.'); - $this->massAction->execute(); + $this->massAction->executeInternal(); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/NewsletterTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/NewsletterTest.php index 97599618c34b0e19a95ca2cbc101a96a35bbb7ad..36c3ff142670e5b3c82a4777a6b4e2787da4a43c 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/NewsletterTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/NewsletterTest.php @@ -256,7 +256,7 @@ class NewsletterTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\View\Result\Layout', - $this->_testedObject->execute() + $this->_testedObject->executeInternal() ); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php index a4a9df750dceb1cf517cb53faf1e841dc8058c2b..416f8055bec7673c6857ad9aac1a6bd354edd601 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php @@ -236,7 +236,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->_testedObject->execute() + $this->_testedObject->executeInternal() ); } @@ -290,7 +290,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->_testedObject->execute() + $this->_testedObject->executeInternal() ); } @@ -329,7 +329,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase ->method('addMessage') ->with($error); - $this->_testedObject->execute(); + $this->_testedObject->executeInternal(); } public function testResetPasswordActionCoreExceptionWarn() @@ -358,7 +358,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase ->method('addMessage') ->with(new \Magento\Framework\Message\Error($warningText)); - $this->_testedObject->execute(); + $this->_testedObject->executeInternal(); } public function testResetPasswordActionException() @@ -399,7 +399,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase $this->equalTo('Something went wrong while resetting customer password.') ); - $this->_testedObject->execute(); + $this->_testedObject->executeInternal(); } public function testResetPasswordActionSendEmail() @@ -479,7 +479,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->_testedObject->execute() + $this->_testedObject->executeInternal() ); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/SaveTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/SaveTest.php index 95c875393ed6aa1ee372f32b153640c80d48d237..dee2600fb3397923d6a0e2e5e4f1a850608665c8 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/SaveTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/SaveTest.php @@ -239,7 +239,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::executeInternal * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testExecuteWithExistentCustomer() @@ -512,11 +512,11 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('customer/*/edit', ['id' => $customerId, '_current' => true]) ->willReturn(true); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** - * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::executeInternal * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testExecuteWithNewCustomer() @@ -760,11 +760,11 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('customer/index', []) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** - * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::executeInternal * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testExecuteWithNewCustomerAndValidationException() @@ -900,11 +900,11 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('customer/*/new', ['_current' => true]) ->willReturn(true); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** - * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::executeInternal * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testExecuteWithNewCustomerAndLocalizedException() @@ -1040,11 +1040,11 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('customer/*/new', ['_current' => true]) ->willReturn(true); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** - * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Customer\Controller\Adminhtml\Index\Index::executeInternal * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testExecuteWithNewCustomerAndException() @@ -1181,6 +1181,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('customer/*/new', ['_current' => true]) ->willReturn(true); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ValidateTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ValidateTest.php index f4065cc205e8155c13d00a43dc55b0e21cb136a1..c7abdf3bb46ef3d7834069187909e49e0b7fdb7e 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ValidateTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ValidateTest.php @@ -186,7 +186,7 @@ class ValidateTest extends \PHPUnit_Framework_TestCase ->method('validate') ->willReturn($validationResult); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithoutAddresses() @@ -225,7 +225,7 @@ class ValidateTest extends \PHPUnit_Framework_TestCase ->method('validate') ->willReturn($validationResult); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithException() @@ -271,6 +271,6 @@ class ValidateTest extends \PHPUnit_Framework_TestCase ->method('validate') ->willReturn($validationResult); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ViewfileTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ViewfileTest.php index afa437c58ac333be011fd707ac4734e094509cba..3b838c369b0a5f7c43b3be5e247cc5ccf8a309fa 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ViewfileTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ViewfileTest.php @@ -107,7 +107,7 @@ class ViewfileTest extends \PHPUnit_Framework_TestCase { /** @var \Magento\Customer\Controller\Adminhtml\Index\Viewfile $controller */ $controller = $this->objectManager->getObject('Magento\Customer\Controller\Adminhtml\Index\Viewfile'); - $controller->execute(); + $controller->executeInternal(); } public function testExecuteParamFile() @@ -154,7 +154,7 @@ class ViewfileTest extends \PHPUnit_Framework_TestCase 'fileFactory' => $fileFactoryMock ] ); - $controller->execute(); + $controller->executeInternal(); } public function testExecuteGetParamImage() @@ -217,6 +217,6 @@ class ViewfileTest extends \PHPUnit_Framework_TestCase 'resultRawFactory' => $this->resultRawFactoryMock ] ); - $this->assertSame($this->resultRawMock, $controller->execute()); + $this->assertSame($this->resultRawMock, $controller->executeInternal()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/System/Config/Validatevat/ValidateTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/System/Config/Validatevat/ValidateTest.php index ac5625eadef26d993703ae10a3a29d25d43653ec..377f7d331a6d3d43c05a09418dd97ca4f88825fc 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/System/Config/Validatevat/ValidateTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/System/Config/Validatevat/ValidateTest.php @@ -104,7 +104,7 @@ class ValidateTest extends \PHPUnit_Framework_TestCase ]) ->willReturn($json); - $this->assertEquals($json, $this->controller->execute()); + $this->assertEquals($json, $this->controller->executeInternal()); } /** diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php index 77260f56c584d03aa54b3589d2979932e8c1484c..e1ec62d35378ac6ad52ae6ce0ddd22d342dde0c9 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Ajax/LoginTest.php @@ -204,7 +204,7 @@ class LoginTest extends \PHPUnit_Framework_TestCase ->method('setData') ->with($result) ->willReturn($loginSuccessResponse); - $this->assertEquals($loginSuccessResponse, $this->object->execute()); + $this->assertEquals($loginSuccessResponse, $this->object->executeInternal()); } public function testLoginFailure() @@ -260,6 +260,6 @@ class LoginTest extends \PHPUnit_Framework_TestCase ->with($result) ->willReturn($loginFailureResponse); - $this->assertEquals($loginFailureResponse, $this->object->execute()); + $this->assertEquals($loginFailureResponse, $this->object->executeInternal()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Plugin/AccountTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Plugin/AccountTest.php index 8146fce1aa3df0afbada1b802660869feb6a51fe..2c65115532100de62487d5b721a81b3d699899eb 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Plugin/AccountTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Plugin/AccountTest.php @@ -87,9 +87,9 @@ class AccountTest extends \PHPUnit_Framework_TestCase * @param boolean $isActionAllowed * @param boolean $isAuthenticated * - * @dataProvider dataProviderAroundDispatch + * @dataProvider dataProviderAroundExecute */ - public function testAroundDispatch( + public function testAroundExecute( $action, $allowedActions, $isActionAllowed, @@ -128,11 +128,11 @@ class AccountTest extends \PHPUnit_Framework_TestCase $plugin = new Account($this->session, $allowedActions); $this->assertEquals( self::EXPECTED_VALUE, - $plugin->aroundDispatch($this->subject, $this->proceed, $this->request) + $plugin->aroundExecute($this->subject, $this->proceed, $this->request) ); } - public function dataProviderAroundDispatch() + public function dataProviderAroundExecute() { return [ [ diff --git a/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php b/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php index d5fc01b379051a1a0f0fe415e6d88c7a4528627f..62d7232bda0f2145e84cb56a94970882295f366a 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php @@ -265,7 +265,7 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase ->method('getDefaultStore') ->willReturn($store); $customer = $this->getMockBuilder('Magento\Customer\Api\Data\CustomerInterface')->getMock(); - $customer->expects($this->once()) + $customer->expects($this->atLeastOnce()) ->method('getId') ->willReturn($customerId); $customer->expects($this->once()) @@ -341,7 +341,7 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase ->method('getDefaultStore') ->willReturn($store); $customer = $this->getMockBuilder('Magento\Customer\Api\Data\CustomerInterface')->getMock(); - $customer->expects($this->once()) + $customer->expects($this->atLeastOnce()) ->method('getId') ->willReturn($customerId); $customer->expects($this->once()) @@ -478,6 +478,61 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase $this->accountManagement->createAccountWithPasswordHash($customer, $hash); } + /** + * @expectedException \Magento\Framework\Exception\LocalizedException + */ + public function testCreateAccountWithPasswordHashWithNewCustomerAndLocalizedException() + { + $storeId = 1; + $storeName = 'store_name'; + $hash = '4nj54lkj5jfi03j49f8bgujfgsd'; + + $customerMock = $this->getMockBuilder('Magento\Customer\Api\Data\CustomerInterface') + ->getMockForAbstractClass(); + + $customerMock->expects($this->atLeastOnce()) + ->method('getId') + ->willReturn(null); + $customerMock->expects($this->atLeastOnce()) + ->method('getStoreId') + ->willReturn($storeId); + $customerMock->expects($this->once()) + ->method('setCreatedIn') + ->with($storeName) + ->willReturnSelf(); + $customerMock->expects($this->once()) + ->method('getAddresses') + ->willReturn([]); + $customerMock->expects($this->once()) + ->method('setAddresses') + ->with(null) + ->willReturnSelf(); + + $storeMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $storeMock->expects($this->once()) + ->method('getName') + ->willReturn($storeName); + + $this->storeManager->expects($this->once()) + ->method('getStore') + ->with($storeId) + ->willReturn($storeMock); + + $exception = new \Magento\Framework\Exception\LocalizedException( + new \Magento\Framework\Phrase('Exception message') + ); + $this->customerRepository + ->expects($this->once()) + ->method('save') + ->with($customerMock, $hash) + ->willThrowException($exception); + + $this->accountManagement->createAccountWithPasswordHash($customerMock, $hash); + } + /** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ diff --git a/app/code/Magento/Customer/Test/Unit/Model/Address/Config/ReaderTest.php b/app/code/Magento/Customer/Test/Unit/Model/Address/Config/ReaderTest.php index 751b2b8cf68b5efb94531f0917d6eb486dbe5528..558d5845f1f07a91cc1a5d9b57e939b659406676 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/Address/Config/ReaderTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/Address/Config/ReaderTest.php @@ -74,7 +74,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->_schemaLocator = new \Magento\Customer\Model\Address\Config\SchemaLocator($moduleReader); $this->_validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $this->_validationState->expects($this->once())->method('isValidated')->will($this->returnValue(false)); + $this->_validationState->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(false); $this->_model = new \Magento\Customer\Model\Address\Config\Reader( $this->_fileResolverMock, diff --git a/app/code/Magento/Customer/Test/Unit/Model/Address/Config/XsdTest.php b/app/code/Magento/Customer/Test/Unit/Model/Address/Config/XsdTest.php index a69261461775b839c858dd2a5e37e8d833611d1d..3b3ac8221cb1a68ff872c891323e7eeefbdf421d 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/Address/Config/XsdTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/Address/Config/XsdTest.php @@ -27,7 +27,10 @@ class XsdTest extends \PHPUnit_Framework_TestCase */ public function testExemplarXml($fixtureXml, array $expectedErrors) { - $dom = new \Magento\Framework\Config\Dom($fixtureXml, [], null, null, '%message%'); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, '%message%'); $actualResult = $dom->validate($this->_schemaFile, $actualErrors); $this->assertEquals(empty($expectedErrors), $actualResult); $this->assertEquals($expectedErrors, $actualErrors); diff --git a/app/code/Magento/Customer/Test/Unit/Model/App/Action/ContextPluginTest.php b/app/code/Magento/Customer/Test/Unit/Model/App/Action/ContextPluginTest.php index 4d338cef2aaea6fea5c889e0e44b933005a22609..f246b0e9559dd30d6da744c0905f336f5a527769 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/App/Action/ContextPluginTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/App/Action/ContextPluginTest.php @@ -74,9 +74,9 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase } /** - * Test aroundDispatch + * Test aroundExecute */ - public function testAroundDispatch() + public function testAroundExecute() { $this->customerSessionMock->expects($this->once()) ->method('getCustomerGroupId') @@ -96,7 +96,7 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase ); $this->assertEquals( 'ExpectedValue', - $this->plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock) + $this->plugin->aroundExecute($this->subjectMock, $this->closureMock, $this->requestMock) ); } } diff --git a/app/code/Magento/Customer/i18n/de_DE.csv b/app/code/Magento/Customer/i18n/de_DE.csv index e138d63071cf90f8d6ef40ef8de27353c9aec7d5..ec5acd01becc9b74ca3f1dafaee1ce2c7c13844c 100644 --- a/app/code/Magento/Customer/i18n/de_DE.csv +++ b/app/code/Magento/Customer/i18n/de_DE.csv @@ -415,3 +415,5 @@ n/a,"Keine Angabe" "Password forgotten","Passwort vergessen" "My Dashboard","Meine Startseite" "You are now logged out","Sie sind jetzt abgemeldet" +"All Customers", "All Customers" +"Now Online", "Now Online" diff --git a/app/code/Magento/Customer/i18n/en_US.csv b/app/code/Magento/Customer/i18n/en_US.csv index f3ed0e19fb9e3d087f254aa5694a15c5877161f7..24d087d95d06cf5aaca2f26f069e7183e31df66f 100644 --- a/app/code/Magento/Customer/i18n/en_US.csv +++ b/app/code/Magento/Customer/i18n/en_US.csv @@ -414,3 +414,5 @@ n/a,n/a "Password forgotten","Password forgotten" "My Dashboard","My Dashboard" "You are now logged out","You are now logged out" +"All Customers", "All Customers" +"Now Online", "Now Online" diff --git a/app/code/Magento/Customer/i18n/es_ES.csv b/app/code/Magento/Customer/i18n/es_ES.csv index 6ee5727639a0e87b37b1e8b2b606bcc51d7d11ed..a2d8a49b8e6cd62d637b5e6d4030c277788a0b65 100644 --- a/app/code/Magento/Customer/i18n/es_ES.csv +++ b/app/code/Magento/Customer/i18n/es_ES.csv @@ -414,3 +414,5 @@ n/a,n/d "Password forgotten","Olvido de contraseña" "My Dashboard","Mi panel de control" "You are now logged out","Ha cerrado sesión." +"All Customers", "All Customers" +"Now Online", "Now Online" diff --git a/app/code/Magento/Customer/i18n/fr_FR.csv b/app/code/Magento/Customer/i18n/fr_FR.csv index e32c2759c36ce1355a2701d6fa58a33183142e54..ded34d3149b9d6c4040fbf36924014165e94fa67 100644 --- a/app/code/Magento/Customer/i18n/fr_FR.csv +++ b/app/code/Magento/Customer/i18n/fr_FR.csv @@ -414,3 +414,5 @@ n/a,n/a "Password forgotten","Mot de passe oublié" "My Dashboard","Mon espace de travail" "You are now logged out","Vous êtes maintenant déconnecté." +"All Customers", "All Customers" +"Now Online", "Now Online" diff --git a/app/code/Magento/Customer/i18n/nl_NL.csv b/app/code/Magento/Customer/i18n/nl_NL.csv index bde6b074652d886e1e53606600c0dbb044e43596..4953a8783567dfa27d7609249384855839a3fc1a 100644 --- a/app/code/Magento/Customer/i18n/nl_NL.csv +++ b/app/code/Magento/Customer/i18n/nl_NL.csv @@ -414,3 +414,5 @@ n/a,n.v.t. "Password forgotten","Wachtwoord vergeten" "My Dashboard","Mijn Dashboard" "You are now logged out","U bent nu uitgelogd" +"All Customers", "All Customers" +"Now Online", "Now Online" diff --git a/app/code/Magento/Customer/i18n/pt_BR.csv b/app/code/Magento/Customer/i18n/pt_BR.csv index b02e6801702bab888b2741cb932bbf68bf5acf86..e3f1d8e704a73d39f6953849433856919d62fcb7 100644 --- a/app/code/Magento/Customer/i18n/pt_BR.csv +++ b/app/code/Magento/Customer/i18n/pt_BR.csv @@ -414,3 +414,5 @@ n/a,n/d "Password forgotten","Senha esquecida" "My Dashboard","Meu Painel" "You are now logged out","Agora você está desconectado" +"All Customers", "All Customers" +"Now Online", "Now Online" diff --git a/app/code/Magento/Customer/i18n/zh_Hans_CN.csv b/app/code/Magento/Customer/i18n/zh_Hans_CN.csv index e344fa595c39e2e87f0340f5f88f143b18249a5a..927f8db2406783e9a4192f8c4767b83eb04f50c5 100644 --- a/app/code/Magento/Customer/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Customer/i18n/zh_Hans_CN.csv @@ -414,3 +414,5 @@ n/a,ä¸å¯ç”¨ "Password forgotten",密ç 忘记 "My Dashboard",æˆ‘çš„ä»ªè¡¨æ¿ "You are now logged out",您已注销 +"All Customers", "All Customers" +"Now Online", "Now Online" diff --git a/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportCsv.php b/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportCsv.php index d078bd13b335ee55dda3cd4294733d75b930357c..8afd580c5b4a952a6e9f8a688eca8f845ef4ebaa 100644 --- a/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportCsv.php +++ b/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportCsv.php @@ -37,7 +37,7 @@ class ExportCsv extends \Magento\Backend\App\Action * * @return \Magento\Framework\App\ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'customers.csv'; diff --git a/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportXml.php b/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportXml.php index 7a5edb1d2782960e789f5a50d9082ddaf5ba311b..686e829e3c5d98e8dd84c5e2492a666a1553f216 100644 --- a/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportXml.php +++ b/app/code/Magento/CustomerImportExport/Controller/Adminhtml/Index/ExportXml.php @@ -37,7 +37,7 @@ class ExportXml extends \Magento\Backend\App\Action * * @return \Magento\Framework\App\ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'customers.xml'; diff --git a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php index 6cf06f839c175efd29b42a98d63b1ecf8f959b82..513c2a703b5d439ac5df946d9129af9cbce44819 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php @@ -5,6 +5,7 @@ */ namespace Magento\CustomerImportExport\Model\Import; +use Magento\Customer\Api\Data\CustomerInterface; use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface; /** @@ -135,25 +136,25 @@ class Customer extends AbstractCustomer /** * Customer fields in file */ - public $customerFields = [ - 'group_id', - 'store_id', - 'updated_at', - 'created_at', - 'created_in', - 'prefix', - 'firstname', - 'middlename', - 'lastname', - 'suffix', - 'dob', + protected $customerFields = [ + CustomerInterface::GROUP_ID, + CustomerInterface::STORE_ID, + CustomerInterface::UPDATED_AT, + CustomerInterface::CREATED_AT, + CustomerInterface::CREATED_IN, + CustomerInterface::PREFIX, + CustomerInterface::FIRSTNAME, + CustomerInterface::MIDDLENAME, + CustomerInterface::LASTNAME, + CustomerInterface::SUFFIX, + CustomerInterface::DOB, 'password_hash', - 'taxvat', - 'confirmation', - 'gender', + CustomerInterface::TAXVAT, + CustomerInterface::CONFIRMATION, + CustomerInterface::GENDER, 'rp_token', 'rp_token_created_at', - ]; + ]; /** * @param \Magento\Framework\Stdlib\StringUtils $string @@ -237,11 +238,6 @@ class Customer extends AbstractCustomer $this->_initStores(true)->_initAttributes(); - $this->validColumnNames = array_merge( - $this->validColumnNames, - $this->customerFields - ); - $this->_customerModel = $customerFactory->create(); /** @var $customerResource \Magento\Customer\Model\ResourceModel\Customer */ $customerResource = $this->_customerModel->getResource(); @@ -381,7 +377,9 @@ class Customer extends AbstractCustomer $attributeParameters = $this->_attributes[$attributeCode]; if ('select' == $attributeParameters['type']) { - $value = $attributeParameters['options'][strtolower($value)]; + $value = isset($attributeParameters['options'][strtolower($value)]) + ? $attributeParameters['options'][strtolower($value)] + : 0; } elseif ('datetime' == $attributeParameters['type']) { $value = (new \DateTime())->setTimestamp(strtotime($value)); $value = $value->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT); @@ -562,4 +560,17 @@ class Customer extends AbstractCustomer { return $this->_entityTable; } + + /** + * @inheritDoc + */ + public function getValidColumnNames() + { + $this->validColumnNames = array_merge( + $this->validColumnNames, + $this->customerFields + ); + + return $this->validColumnNames; + } } diff --git a/app/code/Magento/CustomerImportExport/Model/Import/CustomerComposite.php b/app/code/Magento/CustomerImportExport/Model/Import/CustomerComposite.php index ed7d2f8fe9e85b92ffaf8da22c75b85fb9ffa7b2..a42167fb68134b428490f5f6f804852340899c22 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/CustomerComposite.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/CustomerComposite.php @@ -224,13 +224,6 @@ class CustomerComposite extends \Magento\ImportExport\Model\Import\AbstractEntit } $this->_initAddressAttributes(); - $this->validColumnNames = array_merge( - $this->validColumnNames, - $this->_customerAttributes, - $this->_addressAttributes, - $this->_customerEntity->customerFields - ); - // next customer id if (isset($data['next_customer_id'])) { $this->_nextCustomerId = $data['next_customer_id']; @@ -489,4 +482,19 @@ class CustomerComposite extends \Magento\ImportExport\Model\Import\AbstractEntit return parent::_prepareRowForDb($rowData); } + + /** + * @inheritDoc + */ + public function getValidColumnNames() + { + $this->validColumnNames = array_merge( + $this->validColumnNames, + $this->_customerAttributes, + $this->_addressAttributes, + $this->_customerEntity->getValidColumnNames() + ); + + return $this->validColumnNames; + } } diff --git a/app/code/Magento/Deploy/Model/Deployer.php b/app/code/Magento/Deploy/Model/Deployer.php index 60480c220e23ccc1762243ab61075bf7fb7aec7b..c63bed567703b56f9b33eec1438537fabd9646b5 100644 --- a/app/code/Magento/Deploy/Model/Deployer.php +++ b/app/code/Magento/Deploy/Model/Deployer.php @@ -312,12 +312,11 @@ class Deployer } } - $logMessage = "Processing file '$filePath' for area '$area', theme '$themePath', locale '$locale'"; - if ($module) { - $logMessage .= ", module '$module'"; - } - if ($this->output->isVeryVerbose()) { + $logMessage = "Processing file '$filePath' for area '$area', theme '$themePath', locale '$locale'"; + if ($module) { + $logMessage .= ", module '$module'"; + } $this->output->writeln($logMessage); } diff --git a/app/code/Magento/Deploy/Model/Filesystem.php b/app/code/Magento/Deploy/Model/Filesystem.php index 178ad26a2d00e322d12dd7dd4c24da97bf424c87..3f695ea47041889903a4fb3c3765b2cb2d0d9d72 100644 --- a/app/code/Magento/Deploy/Model/Filesystem.php +++ b/app/code/Magento/Deploy/Model/Filesystem.php @@ -6,11 +6,10 @@ namespace Magento\Deploy\Model; -use Symfony\Component\Console\Output\OutputInterface; use Magento\Framework\App\State; use Magento\Framework\App\DeploymentConfig\Writer; use Magento\Framework\App\Filesystem\DirectoryList; -use Magento\Developer\Console\Command\CssDeployCommand; +use Magento\Developer\Console\Command\SourceThemeDeployCommand; /** * A class to manage Magento modes @@ -137,9 +136,10 @@ class Filesystem $themeLocalePairs = $this->storeView->retrieveThemeLocalePairs(); foreach ($themeLocalePairs as $themeLocalePair) { $theme = $themeLocalePair['theme'] ?: self::DEFAULT_THEME; - $cmd = $this->functionCallPath . 'dev:css:deploy less' - . ' --' . CssDeployCommand::THEME_OPTION . '="' . $theme . '"' - . ' --' . CssDeployCommand::LOCALE_OPTION . '="' . $themeLocalePair['locale'] . '"'; + $cmd = $this->functionCallPath . 'dev:source_theme:deploy' + . ' --' . SourceThemeDeployCommand::TYPE_ARGUMENT . '="less"' + . ' --' . SourceThemeDeployCommand::THEME_OPTION . '="' . $theme . '"' + . ' --' . SourceThemeDeployCommand::LOCALE_OPTION . '="' . $themeLocalePair['locale'] . '"'; /** * @todo build a solution that does not depend on exec diff --git a/app/code/Magento/Developer/Console/Command/CssDeployCommand.php b/app/code/Magento/Developer/Console/Command/CssDeployCommand.php deleted file mode 100644 index ac651b633d026790bfe6d6d3a50283303e00eaa1..0000000000000000000000000000000000000000 --- a/app/code/Magento/Developer/Console/Command/CssDeployCommand.php +++ /dev/null @@ -1,241 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Developer\Console\Command; - -use Magento\Framework\View\Asset\PreProcessor\Pool; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Magento\Framework\Filesystem; -use Magento\Framework\View\Asset\Source; -use Magento\Framework\App\State; -use Magento\Framework\View\Asset\Repository; -use Magento\Framework\ObjectManagerInterface; -use Magento\Framework\App\ObjectManager\ConfigLoader; -use Magento\Framework\View\Asset\PreProcessor\ChainFactoryInterface; -use Magento\Framework\App\Filesystem\DirectoryList; -use Magento\Framework\Validator\Locale; - -/** - * Class CssDeployCommand - collects, processes and publishes source files like LESS or SASS - * @SuppressWarnings("PMD.CouplingBetweenObjects") - */ -class CssDeployCommand extends Command -{ - /** - * Locale option key - */ - const LOCALE_OPTION = 'locale'; - - /** - * Area option key - */ - const AREA_OPTION = 'area'; - - /** - * Theme option key - */ - const THEME_OPTION = 'theme'; - - /** - * Type argument key - */ - const TYPE_ARGUMENT = 'type'; - - /** - * Files argument key - */ - const FILE_ARGUMENT = 'file'; - - /** - * @var ObjectManagerInterface - */ - private $objectManager; - - /** - * @var Repository - */ - private $assetRepo; - - /** - * @var ConfigLoader - */ - private $configLoader; - - /** - * @var State - */ - private $state; - - /** - * @var Source - */ - private $assetSource; - - /** - * @var ChainFactoryInterface - */ - private $chainFactory; - - /** - * @var Filesystem - */ - private $filesystem; - - /** - * @var Locale - */ - private $validator; - - /** - * @var Pool - */ - private $pool; - - /** - * Inject dependencies - * - * @param ObjectManagerInterface $objectManager - * @param Repository $assetRepo - * @param ConfigLoader $configLoader - * @param State $state - * @param Source $assetSource - * @param ChainFactoryInterface $chainFactory - * @param Filesystem $filesystem - * @param Locale $validator - * @param Pool $pool - */ - public function __construct( - ObjectManagerInterface $objectManager, - Repository $assetRepo, - ConfigLoader $configLoader, - State $state, - Source $assetSource, - ChainFactoryInterface $chainFactory, - Filesystem $filesystem, - Locale $validator, - Pool $pool - ) { - $this->state = $state; - $this->objectManager = $objectManager; - $this->configLoader = $configLoader; - $this->assetRepo = $assetRepo; - $this->assetSource = $assetSource; - $this->chainFactory = $chainFactory; - $this->filesystem = $filesystem; - $this->validator = $validator; - - parent::__construct(); - $this->pool = $pool; - } - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->setName('dev:css:deploy') - ->setDescription('Collects, processes and publishes source LESS files') - ->setDefinition([ - new InputArgument( - self::TYPE_ARGUMENT, - InputArgument::REQUIRED, - 'Type of dynamic stylesheet language: [less]' - ), - new InputArgument( - self::FILE_ARGUMENT, - InputArgument::IS_ARRAY, - 'Files to pre-process (file should be specified without extension)', - ['css/styles-m'] - ), - new InputOption( - self::LOCALE_OPTION, - null, - InputOption::VALUE_REQUIRED, - 'Locale', - 'en_US' - ), - new InputOption( - self::AREA_OPTION, - null, - InputOption::VALUE_REQUIRED, - 'Area, one of [frontend|adminhtml]', - 'frontend' - ), - new InputOption( - self::THEME_OPTION, - null, - InputOption::VALUE_REQUIRED, - 'Theme in format Vendor/theme', - 'Magento/blank' - ), - - ]); - - parent::configure(); - } - - /** - * {@inheritdoc} - * @throws \InvalidArgumentException - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $locale = $input->getOption(self::LOCALE_OPTION); - - if (!$this->validator->isValid($locale)) { - throw new \InvalidArgumentException( - $locale . ' argument has invalid value, please run info:language:list for list of available locales' - ); - } - - $area = $input->getOption(self::AREA_OPTION); - $theme = $input->getOption(self::THEME_OPTION); - - $type = $input->getArgument(self::TYPE_ARGUMENT); - - $this->state->setAreaCode($area); - $this->objectManager->configure($this->configLoader->load($area)); - - foreach ($input->getArgument(self::FILE_ARGUMENT) as $file) { - $file .= '.' . $type; - - $output->writeln("<info>Gathering {$file} sources.</info>"); - - $asset = $this->assetRepo->createAsset( - $file, - [ - 'area' => $area, - 'theme' => $theme, - 'locale' => $locale, - ] - ); - - $rootDir = $this->filesystem->getDirectoryWrite(DirectoryList::ROOT); - $sourceFile = $this->assetSource->findSource($asset); - $relativePath = $rootDir->getRelativePath($sourceFile); - $content = $rootDir->readFile($relativePath); - - $chain = $this->chainFactory->create( - [ - 'asset' => $asset, - 'origContent' => $content, - 'origContentType' => $asset->getContentType(), - 'origAssetPath' => $relativePath - ] - ); - - $this->pool->process($chain); - $targetDir = $this->filesystem->getDirectoryWrite(DirectoryList::STATIC_VIEW); - $targetDir->writeFile($chain->getAsset()->getPath(), $chain->getContent()); - - $output->writeln('<info>Successfully processed dynamic stylesheet into CSS</info>'); - } - } -} diff --git a/app/code/Magento/Developer/Console/Command/SourceThemeDeployCommand.php b/app/code/Magento/Developer/Console/Command/SourceThemeDeployCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..0726f83859c4c410050e418475038d4278d8f1d5 --- /dev/null +++ b/app/code/Magento/Developer/Console/Command/SourceThemeDeployCommand.php @@ -0,0 +1,173 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Developer\Console\Command; + +use Magento\Framework\App\State; +use Magento\Framework\Validator\Locale; +use Magento\Framework\View\Asset\Repository; +use Symfony\Component\Console\Command\Command; +use Magento\Framework\App\View\Asset\Publisher; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Class SourceThemeDeployCommand + * + * Collects and publishes source files for theme + */ +class SourceThemeDeployCommand extends Command +{ + /** + * Locale option key + */ + const LOCALE_OPTION = 'locale'; + + /** + * Area option key + */ + const AREA_OPTION = 'area'; + + /** + * Theme option key + */ + const THEME_OPTION = 'theme'; + + /** + * Type argument key + */ + const TYPE_ARGUMENT = 'type'; + + /** + * Files argument key + */ + const FILE_ARGUMENT = 'file'; + + /** + * @var Locale + */ + private $validator; + + /** + * @var Publisher + */ + private $assetPublisher; + + /** + * @var Repository + */ + private $assetRepository; + + /** + * Constructor + * + * @param Locale $validator + * @param Publisher $assetPublisher + * @param Repository $assetRepository + */ + public function __construct( + Locale $validator, + Publisher $assetPublisher, + Repository $assetRepository + ) { + parent::__construct('dev:source_theme:deploy'); + $this->validator = $validator; + $this->assetPublisher = $assetPublisher; + $this->assetRepository = $assetRepository; + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + parent::configure(); + $this->setDescription('Collects and publishes source files for theme.') + ->setDefinition([ + new InputArgument( + self::FILE_ARGUMENT, + InputArgument::IS_ARRAY, + 'Files to pre-process (file should be specified without extension)', + ['css/styles-m', 'css/styles-l'] + ), + new InputOption( + self::TYPE_ARGUMENT, + null, + InputOption::VALUE_REQUIRED, + 'Type of source files: [less]', + 'less' + ), + new InputOption( + self::LOCALE_OPTION, + null, + InputOption::VALUE_REQUIRED, + 'Locale: [en_US]', + 'en_US' + ), + new InputOption( + self::AREA_OPTION, + null, + InputOption::VALUE_REQUIRED, + 'Area: [frontend|adminhtml]', + 'frontend' + ), + new InputOption( + self::THEME_OPTION, + null, + InputOption::VALUE_REQUIRED, + 'Theme: [Vendor/theme]', + 'Magento/luma' + ), + + ]); + } + + /** + * @inheritdoc + * @throws \InvalidArgumentException + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $area = $input->getOption(self::AREA_OPTION); + $locale = $input->getOption(self::LOCALE_OPTION); + $theme = $input->getOption(self::THEME_OPTION); + $type = $input->getOption(self::TYPE_ARGUMENT); + + $files = $input->getArgument(self::FILE_ARGUMENT); + + if (!$this->validator->isValid($locale)) { + throw new \InvalidArgumentException( + $locale . ' argument has invalid value, please run info:language:list for list of available locales' + ); + } + $message = sprintf( + '<info>Processed Area: %s, Locale: %s, Theme: %s, File type: %s.</info>', + $area, + $locale, + $theme, + $type + ); + $output->writeln($message); + + foreach ($files as $file) { + $fileInfo = pathinfo($file); + $asset = $this->assetRepository->createAsset( + $fileInfo['dirname'] . DIRECTORY_SEPARATOR . $fileInfo['basename'] . '.' . $type, + [ + 'area' => $area, + 'theme' => $theme, + 'locale' => $locale, + ] + ); + + $this->assetPublisher->publish($asset); + $output->writeln('<comment>-> ' . $asset->getFilePath() . '</comment>'); + } + + $output->writeln('<info>Successfully processed.</info>'); + } +} diff --git a/app/code/Magento/Developer/Model/Config/Backend/AllowedIps.php b/app/code/Magento/Developer/Model/Config/Backend/AllowedIps.php index 531e4fc64c3907c591edcc5a1256dc392cec6b4b..d2b481ca06ec3a146ad31c4d403d8b6b523fe7e4 100644 --- a/app/code/Magento/Developer/Model/Config/Backend/AllowedIps.php +++ b/app/code/Magento/Developer/Model/Config/Backend/AllowedIps.php @@ -30,6 +30,7 @@ class AllowedIps extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param \Magento\Framework\Escaper $escaper * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -40,6 +41,7 @@ class AllowedIps extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Message\ManagerInterface $messageManager, \Magento\Framework\Escaper $escaper, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -48,7 +50,7 @@ class AllowedIps extends \Magento\Framework\App\Config\Value ) { $this->messageManager = $messageManager; $this->escaper = $escaper; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Developer/Model/Css/PreProcessor/FileGenerator/PublicationDecorator.php b/app/code/Magento/Developer/Model/Css/PreProcessor/FileGenerator/PublicationDecorator.php index 79c470443192c37a2a4adf6dfdbbdd81cd3785dc..7c14c8f9e1d0ad8ed07ed57868ad2e21b02dc7b3 100644 --- a/app/code/Magento/Developer/Model/Css/PreProcessor/FileGenerator/PublicationDecorator.php +++ b/app/code/Magento/Developer/Model/Css/PreProcessor/FileGenerator/PublicationDecorator.php @@ -5,45 +5,47 @@ */ namespace Magento\Developer\Model\Css\PreProcessor\FileGenerator; -use Magento\Framework\Css\PreProcessor\FileGenerator\RelatedGenerator; use Magento\Framework\View\Asset\LocalInterface; +use Magento\Framework\Css\PreProcessor\FileGenerator\RelatedGenerator; /** * Class PublicationDecorator - * Decorates generator of related assets and publishes them * - * @package Magento\Developer\Model\Less\FileGenerator + * Decorates generator of related assets and publishes them */ class PublicationDecorator extends RelatedGenerator { /** * @var \Magento\Framework\App\View\Asset\Publisher */ - private $publisher; + private $assetPublisher; /** + * Constructor + * * @param \Magento\Framework\Filesystem $filesystem * @param \Magento\Framework\View\Asset\Repository $assetRepo * @param \Magento\Framework\Css\PreProcessor\File\Temporary $temporaryFile - * @param \Magento\Framework\App\View\Asset\Publisher $publisher + * @param \Magento\Framework\App\View\Asset\Publisher $assetPublisher */ public function __construct( \Magento\Framework\Filesystem $filesystem, \Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\Css\PreProcessor\File\Temporary $temporaryFile, - \Magento\Framework\App\View\Asset\Publisher $publisher + \Magento\Framework\App\View\Asset\Publisher $assetPublisher ) { parent::__construct($filesystem, $assetRepo, $temporaryFile); - $this->publisher = $publisher; + $this->assetPublisher = $assetPublisher; } /** - * {inheritdoc} + * @inheritdoc */ protected function generateRelatedFile($relatedFileId, LocalInterface $asset) { $relatedAsset = parent::generateRelatedFile($relatedFileId, $asset); - $this->publisher->publish($relatedAsset); + $this->assetPublisher->publish($relatedAsset); + return $relatedAsset; } } diff --git a/app/code/Magento/Developer/Test/Unit/Console/Command/CssDeployCommandTest.php b/app/code/Magento/Developer/Test/Unit/Console/Command/CssDeployCommandTest.php deleted file mode 100644 index 0d930989e424eefbcd192c0c3ca33322c13ba06a..0000000000000000000000000000000000000000 --- a/app/code/Magento/Developer/Test/Unit/Console/Command/CssDeployCommandTest.php +++ /dev/null @@ -1,191 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Developer\Test\Unit\Console\Command; - -use Magento\Framework\Filesystem; -use Magento\Framework\View\Asset\PreProcessor\Pool; -use Magento\Framework\View\Asset\Source; -use Magento\Framework\App\State; -use Magento\Framework\View\Asset\Repository; -use Magento\Framework\ObjectManagerInterface; -use Magento\Framework\App\ObjectManager\ConfigLoader; -use Magento\Framework\View\Asset\PreProcessor\ChainFactoryInterface; -use Magento\Developer\Console\Command\CssDeployCommand; -use Symfony\Component\Console\Tester\CommandTester; -use Magento\Framework\Validator\Locale; - -/** - * Class CssDeployCommandTest - */ -class CssDeployCommandTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var CssDeployCommand - */ - private $command; - - /** - * @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject - */ - private $objectManager; - - /** - * @var Repository|\PHPUnit_Framework_MockObject_MockObject - */ - private $assetRepo; - - /** - * @var ConfigLoader|\PHPUnit_Framework_MockObject_MockObject - */ - private $configLoader; - - /** - * @var State|\PHPUnit_Framework_MockObject_MockObject - */ - private $state; - - /** - * @var Source|\PHPUnit_Framework_MockObject_MockObject - */ - private $assetSource; - - /** - * @var ChainFactoryInterface|\PHPUnit_Framework_MockObject_MockObject - */ - private $chainFactory; - - /** - * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject - */ - private $filesystem; - - /** - * @var Locale|\PHPUnit_Framework_MockObject_MockObject - */ - private $validator; - - /** - * @var Pool|\PHPUnit_Framework_MockObject_MockObject - */ - private $poolMock; - - public function setUp() - { - $this->objectManager = $this->getMockForAbstractClass('Magento\Framework\ObjectManagerInterface'); - $this->assetRepo = $this->getMock('Magento\Framework\View\Asset\Repository', [], [], '', false); - $this->configLoader = $this->getMock('Magento\Framework\App\ObjectManager\ConfigLoader', [], [], '', false); - $this->state = $this->getMock('Magento\Framework\App\State', [], [], '', false); - $this->assetSource = $this->getMock('Magento\Framework\View\Asset\Source', [], [], '', false); - $this->chainFactory = $this->getMockForAbstractClass( - 'Magento\Framework\View\Asset\PreProcessor\ChainFactoryInterface' - ); - $this->filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); - $this->validator = $this->getMock('Magento\Framework\Validator\Locale', [], [], '', false); - $this->poolMock = $this->getMockBuilder('Magento\Framework\View\Asset\PreProcessor\Pool') - ->disableOriginalConstructor() - ->getMock(); - - $this->command = new CssDeployCommand( - $this->objectManager, - $this->assetRepo, - $this->configLoader, - $this->state, - $this->assetSource, - $this->chainFactory, - $this->filesystem, - $this->validator, - $this->poolMock - ); - } - - public function testExecute() - { - $file = 'css/styles-m' . '.less'; - - $this->configLoader->expects($this->once())->method('load')->with('frontend')->willReturn([]); - $this->objectManager->expects($this->once())->method('configure'); - $asset = $this->getMockForAbstractClass('Magento\Framework\View\Asset\LocalInterface'); - $asset->expects($this->once())->method('getContentType')->willReturn('type'); - $this->assetRepo->expects($this->once()) - ->method('createAsset') - ->with( - $file, - [ - 'area' => 'frontend', - 'theme' => 'Magento/blank', - 'locale' => 'en_US' - ] - ) - ->willReturn($asset); - $this->assetSource->expects($this->once())->method('findSource')->willReturn('/dev/null'); - - $chainMock = $this->getMock('Magento\Framework\View\Asset\PreProcessor\Chain', [], [], '', false); - $assetMock = $this->getMockBuilder('Magento\Framework\View\Asset\LocalInterface') - ->getMockForAbstractClass(); - - $this->chainFactory->expects($this->once()) - ->method('create') - ->with( - [ - 'asset' => $asset, - 'origContent' => 'content', - 'origContentType' => 'type', - 'origAssetPath' => 'relative/path', - ] - )->willReturn($chainMock); - - $chainMock->expects(self::once()) - ->method('getAsset') - ->willReturn($assetMock); - - $rootDir = $this->getMock('\Magento\Framework\Filesystem\Directory\WriteInterface', [], [], '', false); - $this->filesystem->expects($this->at(0))->method('getDirectoryWrite')->willReturn($rootDir); - $this->filesystem->expects($this->at(1))->method('getDirectoryWrite')->willReturn( - $this->getMock('\Magento\Framework\Filesystem\Directory\WriteInterface', [], [], '', false) - ); - $rootDir->expects($this->atLeastOnce())->method('getRelativePath')->willReturn('relative/path'); - $rootDir->expects($this->once())->method('readFile')->willReturn('content'); - - $this->validator->expects($this->once())->method('isValid')->with('en_US')->willReturn(true); - - $commandTester = new CommandTester($this->command); - $commandTester->execute( - [ - 'type' => 'less' - ] - ); - $this->assertContains( - 'Successfully processed dynamic stylesheet into CSS', - $commandTester->getDisplay() - ); - } - - /** - * @expectedException \RuntimeException - * @expectedExceptionMessage Not enough arguments - */ - public function testExecuteWithoutParameters() - { - $commandTester = new CommandTester($this->command); - $commandTester->execute([]); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage WRONG_LOCALE argument has invalid value, please run info:language:list - */ - public function testExecuteWithWrongFormat() - { - $commandTester = new CommandTester($this->command); - $commandTester->execute( - [ - 'type' => 'less', - '--locale' => 'WRONG_LOCALE' - ] - ); - } -} diff --git a/app/code/Magento/Developer/Test/Unit/Console/Command/SourceThemeDeployCommandTest.php b/app/code/Magento/Developer/Test/Unit/Console/Command/SourceThemeDeployCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..cc66a9830f20e6eba578de4eb49b416673e5d115 --- /dev/null +++ b/app/code/Magento/Developer/Test/Unit/Console/Command/SourceThemeDeployCommandTest.php @@ -0,0 +1,156 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Developer\Test\Unit\Console\Command; + +use Magento\Framework\Validator\Locale; +use Magento\Framework\View\Asset\Repository; +use Magento\Framework\App\View\Asset\Publisher; +use Magento\Framework\View\Asset\LocalInterface; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Magento\Developer\Console\Command\SourceThemeDeployCommand; + +/** + * Class SourceThemeDeployCommandTest + * + * @see \Magento\Developer\Console\Command\SourceThemeDeployCommand + */ +class SourceThemeDeployCommandTest extends \PHPUnit_Framework_TestCase +{ + const AREA_TEST_VALUE = 'area-test-value'; + + const LOCALE_TEST_VALUE = 'locale-test-value'; + + const THEME_TEST_VALUE = 'theme-test-value'; + + const TYPE_TEST_VALUE = 'type-test-value'; + + const FILE_TEST_VALUE = 'file-test-value/test/file'; + + /** + * @var SourceThemeDeployCommand + */ + private $sourceThemeDeployCommand; + + /** + * @var Locale|\PHPUnit_Framework_MockObject_MockObject + */ + private $validatorMock; + + /** + * @var Publisher|\PHPUnit_Framework_MockObject_MockObject + */ + private $assetPublisherMock; + + /** + * @var Repository|\PHPUnit_Framework_MockObject_MockObject + */ + private $assetRepositoryMock; + + /** + * Set up + */ + protected function setUp() + { + $this->validatorMock = $this->getMockBuilder(Locale::class) + ->disableOriginalConstructor() + ->getMock(); + $this->assetPublisherMock = $this->getMockBuilder(Publisher::class) + ->disableOriginalConstructor() + ->getMock(); + $this->assetRepositoryMock = $this->getMockBuilder(Repository::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->sourceThemeDeployCommand = new SourceThemeDeployCommand( + $this->validatorMock, + $this->assetPublisherMock, + $this->assetRepositoryMock + ); + } + + /** + * Run test for execute method + */ + public function testExecute() + { + /** @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject $outputMock */ + $outputMock = $this->getMockBuilder(OutputInterface::class) + ->getMockForAbstractClass(); + $assetMock = $this->getMockBuilder(LocalInterface::class) + ->getMockForAbstractClass(); + + $this->validatorMock->expects(self::once()) + ->method('isValid') + ->with(self::LOCALE_TEST_VALUE) + ->willReturn(true); + + $message = sprintf( + '<info>Processed Area: %s, Locale: %s, Theme: %s, File type: %s.</info>', + self::AREA_TEST_VALUE, + self::LOCALE_TEST_VALUE, + self::THEME_TEST_VALUE, + self::TYPE_TEST_VALUE + ); + + $outputMock->expects(self::at(0)) + ->method('writeln') + ->with($message); + $outputMock->expects(self::at(1)) + ->method('writeln') + ->with('<comment>-> file-test-value/test/file</comment>'); + $outputMock->expects(self::at(2)) + ->method('writeln') + ->with('<info>Successfully processed.</info>'); + + $this->assetRepositoryMock->expects(self::once()) + ->method('createAsset') + ->with( + 'file-test-value/test' . DIRECTORY_SEPARATOR . 'file' . '.' . self::TYPE_TEST_VALUE, + [ + 'area' => self::AREA_TEST_VALUE, + 'theme' => self::THEME_TEST_VALUE, + 'locale' => self::LOCALE_TEST_VALUE, + ] + )->willReturn($assetMock); + + $this->assetPublisherMock->expects(self::once()) + ->method('publish') + ->with($assetMock); + + $assetMock->expects(self::once()) + ->method('getFilePath') + ->willReturn(self::FILE_TEST_VALUE); + + $this->sourceThemeDeployCommand->run($this->getInputMock(), $outputMock); + } + + /** + * @return InputInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private function getInputMock() + { + $inputMock = $this->getMockBuilder(InputInterface::class) + ->getMockForAbstractClass(); + + $inputMock->expects(self::exactly(4)) + ->method('getOption') + ->willReturnMap( + [ + ['area', self::AREA_TEST_VALUE], + ['locale', self::LOCALE_TEST_VALUE], + ['theme', self::THEME_TEST_VALUE], + ['type', self::TYPE_TEST_VALUE] + ] + ); + $inputMock->expects(self::once()) + ->method('getArgument') + ->with('file') + ->willReturn([self::FILE_TEST_VALUE]); + + return $inputMock; + } +} diff --git a/app/code/Magento/Developer/Test/Unit/Model/Css/PreProcessor/FileGenerator/PublicationDecoratorTest.php b/app/code/Magento/Developer/Test/Unit/Model/Css/PreProcessor/FileGenerator/PublicationDecoratorTest.php index 56cca40bf6666eb670ba3e2aeb36201e5dd809a7..9d0538f265cd6e8bd937c5900de936f2372d174f 100644 --- a/app/code/Magento/Developer/Test/Unit/Model/Css/PreProcessor/FileGenerator/PublicationDecoratorTest.php +++ b/app/code/Magento/Developer/Test/Unit/Model/Css/PreProcessor/FileGenerator/PublicationDecoratorTest.php @@ -3,11 +3,15 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Developer\Test\Unit\Model\Css\PreProcessor\FileGenerator; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\Filesystem; +use Magento\Framework\Css\PreProcessor\File\Temporary; +use Magento\Developer\Model\Css\PreProcessor\FileGenerator\PublicationDecorator; +/** + * Class PublicationDecoratorTest + */ class PublicationDecoratorTest extends \PHPUnit_Framework_TestCase { /** @@ -15,6 +19,13 @@ class PublicationDecoratorTest extends \PHPUnit_Framework_TestCase */ public function testGenerateRelatedFile() { + $filesystemMock = $this->getMockBuilder(Filesystem::class) + ->disableOriginalConstructor() + ->getMock(); + $fileTemporaryMock = $this->getMockBuilder(Temporary::class) + ->disableOriginalConstructor() + ->getMock(); + $publisherMock = $this->getMockBuilder('Magento\Framework\App\View\Asset\Publisher') ->disableOriginalConstructor() ->getMock(); @@ -33,24 +44,24 @@ class PublicationDecoratorTest extends \PHPUnit_Framework_TestCase $relatedFileId = 'file_id'; $relatedFiles = [[$relatedFileId, $localAssetMock]]; - $importGeneratorMock->expects($this->any()) + + $importGeneratorMock->expects(self::any()) ->method('getRelatedFiles') - ->will($this->onConsecutiveCalls($relatedFiles, [])); - $assetRepoMock->expects($this->any()) + ->will(self::onConsecutiveCalls($relatedFiles, [])); + + $assetRepoMock->expects(self::any()) ->method('createRelated') ->willReturn($relatedAssetMock); - $publisherMock->expects($this->once()) + + $publisherMock->expects(self::once()) ->method('publish') ->with($relatedAssetMock); - $args = [ - 'assetRepo' => $assetRepoMock, - 'publisher' => $publisherMock - ]; - - $model = (new ObjectManager($this))->getObject( - 'Magento\Developer\Model\Css\PreProcessor\FileGenerator\PublicationDecorator', - $args + $model = new PublicationDecorator( + $filesystemMock, + $assetRepoMock, + $fileTemporaryMock, + $publisherMock ); $model->generate($importGeneratorMock); diff --git a/app/code/Magento/Developer/etc/di.xml b/app/code/Magento/Developer/etc/di.xml index a208ec7c5de01f26250b2a93d5d571732899c2d6..a393b0ebce8bc9101a6b69f0f3bdacef49235652 100644 --- a/app/code/Magento/Developer/etc/di.xml +++ b/app/code/Magento/Developer/etc/di.xml @@ -23,11 +23,70 @@ </argument> </arguments> </type> + + <!-- Configuration for \Magento\Developer\Console\Command\SourceThemeDeployCommand --> + <virtualType name="AssetMaterializationStrategyFactoryForSourceThemeDeploy" type="Magento\Framework\App\View\Asset\MaterializationStrategy\Factory"> + <arguments> + <argument name="strategiesList" xsi:type="array"> + <item name="symlink" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Symlink</item> + <item name="copy" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> + </argument> + </arguments> + </virtualType> + <virtualType name="AssetPublisherForSourceThemeDeploy" type="Magento\Framework\App\View\Asset\Publisher"> + <arguments> + <argument name="materializationStrategyFactory" xsi:type="object">AssetMaterializationStrategyFactoryForSourceThemeDeploy</argument> + </arguments> + </virtualType> + <type name="Magento\Developer\Model\Css\PreProcessor\FileGenerator\PublicationDecorator"> + <arguments> + <argument name="assetRepo" xsi:type="object">AssetRepositoryForSourceThemeDeploy</argument> + <argument name="assetPublisher" xsi:type="object">AssetPublisherForSourceThemeDeploy</argument> + </arguments> + </type> + <virtualType name="PreProcessorInstructionImportForSourceThemeDeploy" type="Magento\Framework\Css\PreProcessor\Instruction\Import"> + <arguments> + <argument name="relatedFileGenerator" xsi:type="object">Magento\Developer\Model\Css\PreProcessor\FileGenerator\PublicationDecorator</argument> + </arguments> + </virtualType> + <virtualType name="AssetPreProcessorPoolForSourceThemeDeploy" type="Magento\Framework\View\Asset\PreProcessor\Pool"> + <arguments> + <argument name="preprocessors" xsi:type="array"> + <item name="less" xsi:type="array"> + <item name="magento_import" xsi:type="array"> + <item name="class" xsi:type="string">Magento\Framework\Css\PreProcessor\Instruction\MagentoImport</item> + </item> + <item name="import" xsi:type="array"> + <item name="after" xsi:type="string">magento_import</item> + <item name="class" xsi:type="string">PreProcessorInstructionImportForSourceThemeDeploy</item> + </item> + </item> + </argument> + </arguments> + </virtualType> + <virtualType name="AssetSourceForSourceThemeDeploy" type="Magento\Framework\View\Asset\Source"> + <arguments> + <argument name="preProcessorPool" xsi:type="object">AssetPreProcessorPoolForSourceThemeDeploy</argument> + </arguments> + </virtualType> + <virtualType name="AssetRepositoryForSourceThemeDeploy" type="Magento\Framework\View\Asset\Repository"> + <arguments> + <argument name="assetSource" xsi:type="object">AssetSourceForSourceThemeDeploy</argument> + </arguments> + </virtualType> + <type name="Magento\Developer\Console\Command\SourceThemeDeployCommand"> + <arguments> + <argument name="assetPublisher" xsi:type="object">AssetPublisherForSourceThemeDeploy</argument> + <argument name="assetRepository" xsi:type="object">AssetRepositoryForSourceThemeDeploy</argument> + </arguments> + </type> + <!-- End configuration for \Magento\Developer\Console\Command\SourceThemeDeployCommand --> + <type name="Magento\Framework\Console\CommandList"> <arguments> <argument name="commands" xsi:type="array"> <item name="dev_tests_run" xsi:type="object">Magento\Developer\Console\Command\DevTestsRunCommand</item> - <item name="dev_css_deploy" xsi:type="object">Magento\Developer\Console\Command\CssDeployCommand</item> + <item name="dev_source_theme_deploy" xsi:type="object">Magento\Developer\Console\Command\SourceThemeDeployCommand</item> <item name="xml_converter" xsi:type="object">Magento\Developer\Console\Command\XmlConverterCommand</item> </argument> </arguments> @@ -62,6 +121,11 @@ <type name="Magento\Framework\View\Asset\PreProcessor\Pool"> <arguments> <argument name="defaultPreprocessor" xsi:type="string">Magento\Framework\View\Asset\PreProcessor\Passthrough</argument> + </arguments> + </type> + + <virtualType name="AssetPreProcessorPool" type="Magento\Framework\View\Asset\PreProcessor\Pool"> + <arguments> <argument name="preprocessors" xsi:type="array"> <item name="less" xsi:type="array"> <item name="magento_import" xsi:type="array"> @@ -96,6 +160,12 @@ </item> </argument> </arguments> + </virtualType> + + <type name="Magento\Framework\View\Asset\Source"> + <arguments> + <argument name="preProcessorPool" xsi:type="object">AssetPreProcessorPool</argument> + </arguments> </type> <type name="Magento\Framework\Css\PreProcessor\Instruction\MagentoImport"> diff --git a/app/code/Magento/Developer/i18n/en_US.csv b/app/code/Magento/Developer/i18n/en_US.csv index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1cf1f795360955ee458246a6975d78a27f761282 100644 --- a/app/code/Magento/Developer/i18n/en_US.csv +++ b/app/code/Magento/Developer/i18n/en_US.csv @@ -0,0 +1,40 @@ +"Front-end development workflow","Front-end development workflow" +"Workflow type","Workflow type" +"Not available in production mode","Not available in production mode" +"Developer Client Restrictions","Developer Client Restrictions" +"Allowed IPs (comma separated)","Allowed IPs (comma separated)" +"Leave empty for access from any location.","Leave empty for access from any location." +"Debug","Debug" +"Enabled Template Path Hints for Storefront","Enabled Template Path Hints for Storefront" +"Enabled Template Path Hints for Admin","Enabled Template Path Hints for Admin" +"Add Block Names to Hints","Add Block Names to Hints" +"Template Settings","Template Settings" +"Allow Symlinks","Allow Symlinks" +"Warning! Enabling this feature is not recommended on production environments because it represents a potential security risk.","Warning! Enabling this feature is not recommended on production environments because it represents a potential security risk." +"Minify Html","Minify Html" +"Translate Inline","Translate Inline" +"Enabled for Storefront","Enabled for Storefront" +"Enabled for Admin","Enabled for Admin" +"Translate, blocks and other output caches should be disabled for both Storefront and Admin inline translations.","Translate, blocks and other output caches should be disabled for both Storefront and Admin inline translations." +"JavaScript Settings","JavaScript Settings" +"Enable Javascript Bundling","Enable Javascript Bundling" +"Merge JavaScript Files","Merge JavaScript Files" +"Minify JavaScript Files","Minify JavaScript Files" +"Translation Strategy","Translation Strategy" +"Dictionary (Translation on Storefront side)","Dictionary (Translation on Storefront side)" +"Embedded (Translation on Admin side)","Embedded (Translation on Admin side)" +"Log JS Errors to Session Storage","Log JS Errors to Session Storage" +"Log JS Errors to Session Storage Key","Log JS Errors to Session Storage Key" +"CSS Settings","CSS Settings" +"Merge CSS Files","Merge CSS Files" +"Minify CSS Files","Minify CSS Files" +"Image Processing Settings","Image Processing Settings" +"Image Adapter","Image Adapter" +"Static Files Settings","Static Files Settings" +"Sign Static Files","Sign Static Files" +"Grid Settings","Grid Settings" +"Asynchronous indexing","Asynchronous indexing" +"Client side less compilation","Client side less compilation" +"Server side less compilation","Server side less compilation" +"Disable","Disable" +"Enable","Enable" diff --git a/app/code/Magento/Directory/Controller/Adminhtml/Json/CountryRegion.php b/app/code/Magento/Directory/Controller/Adminhtml/Json/CountryRegion.php index 412028bdd8f78bb0fcf36eb8f492055575004b1a..b8006ccfd07086ce2b8319af2526c7e02cce86cb 100644 --- a/app/code/Magento/Directory/Controller/Adminhtml/Json/CountryRegion.php +++ b/app/code/Magento/Directory/Controller/Adminhtml/Json/CountryRegion.php @@ -13,7 +13,7 @@ class CountryRegion extends \Magento\Backend\App\Action * * @return string */ - public function execute() + public function executeInternal() { $arrRes = []; diff --git a/app/code/Magento/Directory/Controller/Currency/SwitchAction.php b/app/code/Magento/Directory/Controller/Currency/SwitchAction.php index b8aada56cf7fd804c69cb98897ee91f264cb6d7b..1a30600ef8aab7277e01b1f69bd95e9382b7dde8 100644 --- a/app/code/Magento/Directory/Controller/Currency/SwitchAction.php +++ b/app/code/Magento/Directory/Controller/Currency/SwitchAction.php @@ -11,7 +11,7 @@ class SwitchAction extends \Magento\Framework\App\Action\Action /** * @return void */ - public function execute() + public function executeInternal() { /** @var \Magento\Store\Model\StoreManagerInterface $storeManager */ $storeManager = $this->_objectManager->get('Magento\Store\Model\StoreManagerInterface'); diff --git a/app/code/Magento/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php b/app/code/Magento/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php index b07b6e82bdc4d04f71bc4c8a46ac686f82bf2332..ee184dff0e6d59f349ce9b94cfcc07041b7a0523 100644 --- a/app/code/Magento/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php +++ b/app/code/Magento/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php @@ -157,27 +157,13 @@ class Links extends \Magento\Backend\Block\Template } /** - * Retrieve Purchased Separately HTML select + * Get Links can be purchased separately value for current product * - * @return string + * @return bool */ - public function getPurchasedSeparatelySelect() + public function isProductLinksCanBePurchasedSeparately() { - $select = $this->getLayout()->createBlock( - 'Magento\Framework\View\Element\Html\Select' - )->setName( - 'product[links_purchased_separately]' - )->setId( - 'downloadable_link_purchase_type' - )->setOptions( - $this->_sourceModel->toOptionArray() - )->setValue( - $this->getProduct()->getLinksPurchasedSeparately() - )->setClass( - 'admin__control-select' - ); - - return $select->getHtml(); + return (bool) $this->getProduct()->getData('links_purchased_separately'); } /** @@ -463,4 +449,13 @@ class Links extends \Magento\Backend\Block\Template { return $this->_storeManager->getStore($storeId)->getBaseCurrencyCode(); } + + /** + * @param null|string|bool|int|\Magento\Store\Model\Store $storeId $storeId + * @return string + */ + public function getBaseCurrencySymbol($storeId) + { + return $this->_storeManager->getStore($storeId)->getBaseCurrency()->getCurrencySymbol(); + } } diff --git a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/File/Upload.php b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/File/Upload.php index 6e056ee9e45a4c76c5701cca37e7d56563dc878c..a762b2d52c21702be0493f0a3a8dbb92869320f2 100644 --- a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/File/Upload.php +++ b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/File/Upload.php @@ -69,7 +69,7 @@ class Upload extends \Magento\Downloadable\Controller\Adminhtml\Downloadable\Fil * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $type = $this->getRequest()->getParam('type'); $tmpPath = ''; diff --git a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Form.php b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Form.php index 926491e0735952576f902a774d0738c67181876b..1d966b22bfb1dbb1ef9a1d9af5bed0c1371a8942 100644 --- a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Form.php +++ b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Form.php @@ -13,7 +13,7 @@ class Form extends \Magento\Catalog\Controller\Adminhtml\Product\Edit * * @return void */ - public function execute() + public function executeInternal() { $this->_initProduct(); $this->getResponse()->setBody( diff --git a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Link.php b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Link.php index 0da0cf5fb96f8e865f8c21e14c09c01d20432eb8..9cc1bb7b00fb1c439b262fc8c5d42529661c83f3 100644 --- a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Link.php +++ b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Link.php @@ -77,7 +77,7 @@ class Link extends \Magento\Catalog\Controller\Adminhtml\Product\Edit * * @return void */ - public function execute() + public function executeInternal() { $linkId = $this->getRequest()->getParam('id', 0); $type = $this->getRequest()->getParam('type', 0); diff --git a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Sample.php b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Sample.php index 746b5242d5ca4206aa1ec442e0ec39e9a20d76dc..3176cb802ca2f4c6d96a0d59a8340277194783c5 100644 --- a/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Sample.php +++ b/app/code/Magento/Downloadable/Controller/Adminhtml/Downloadable/Product/Edit/Sample.php @@ -31,7 +31,7 @@ class Sample extends \Magento\Downloadable\Controller\Adminhtml\Downloadable\Pro * * @return void */ - public function execute() + public function executeInternal() { $sampleId = $this->getRequest()->getParam('id', 0); /** @var \Magento\Downloadable\Model\Sample $sample */ diff --git a/app/code/Magento/Downloadable/Controller/Customer/Products.php b/app/code/Magento/Downloadable/Controller/Customer/Products.php index 78e865dd8c323488dbed6fab2c70f8e3b4df38f8..b05852738e179dd241dbbe406aecb62d5fd7ae21 100644 --- a/app/code/Magento/Downloadable/Controller/Customer/Products.php +++ b/app/code/Magento/Downloadable/Controller/Customer/Products.php @@ -34,14 +34,14 @@ class Products extends \Magento\Framework\App\Action\Action * @param RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $loginUrl = $this->_objectManager->get('Magento\Customer\Model\Url')->getLoginUrl(); if (!$this->_customerSession->authenticate($loginUrl)) { $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); } - return parent::dispatch($request); + return parent::execute($request); } /** @@ -49,7 +49,7 @@ class Products extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); if ($block = $this->_view->getLayout()->getBlock('downloadable_customer_products_list')) { diff --git a/app/code/Magento/Downloadable/Controller/Download/Link.php b/app/code/Magento/Downloadable/Controller/Download/Link.php index c2cd4b91b92d6fce9e77b40583ca94a0a9898c90..59f49533c9eaff4f28af5ae5d3b314e12eb03bba 100644 --- a/app/code/Magento/Downloadable/Controller/Download/Link.php +++ b/app/code/Magento/Downloadable/Controller/Download/Link.php @@ -31,7 +31,7 @@ class Link extends \Magento\Downloadable\Controller\Download * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.ExitExpression) */ - public function execute() + public function executeInternal() { $session = $this->_getCustomerSession(); diff --git a/app/code/Magento/Downloadable/Controller/Download/LinkSample.php b/app/code/Magento/Downloadable/Controller/Download/LinkSample.php index 351fc26c55c5f73eb3d02914e044da4b69267a2c..46747905711ef77420924c358fc59bc5d9883b65 100644 --- a/app/code/Magento/Downloadable/Controller/Download/LinkSample.php +++ b/app/code/Magento/Downloadable/Controller/Download/LinkSample.php @@ -17,7 +17,7 @@ class LinkSample extends \Magento\Downloadable\Controller\Download * @return ResponseInterface * @SuppressWarnings(PHPMD.ExitExpression) */ - public function execute() + public function executeInternal() { $linkId = $this->getRequest()->getParam('link_id', 0); /** @var \Magento\Downloadable\Model\Link $link */ diff --git a/app/code/Magento/Downloadable/Controller/Download/Sample.php b/app/code/Magento/Downloadable/Controller/Download/Sample.php index a8cecbc48bd075a86d2f201c024d3e790fcadff2..c6715dbf90c1ec75dfbafa92c31b921928fe9cf5 100644 --- a/app/code/Magento/Downloadable/Controller/Download/Sample.php +++ b/app/code/Magento/Downloadable/Controller/Download/Sample.php @@ -17,7 +17,7 @@ class Sample extends \Magento\Downloadable\Controller\Download * @return ResponseInterface * @SuppressWarnings(PHPMD.ExitExpression) */ - public function execute() + public function executeInternal() { $sampleId = $this->getRequest()->getParam('sample_id', 0); /** @var \Magento\Downloadable\Model\Sample $sample */ diff --git a/app/code/Magento/Downloadable/Setup/InstallData.php b/app/code/Magento/Downloadable/Setup/InstallData.php index 28b92d361ce2c926c445bac20c57b9ca94253459..594f08fad3d9f23b64245b3ceb300f2f7941ff42 100644 --- a/app/code/Magento/Downloadable/Setup/InstallData.php +++ b/app/code/Magento/Downloadable/Setup/InstallData.php @@ -56,7 +56,7 @@ class InstallData implements InstallDataInterface 'input' => '', 'class' => '', 'source' => '', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => false, 'required' => true, 'user_defined' => false, @@ -82,7 +82,7 @@ class InstallData implements InstallDataInterface 'input' => '', 'class' => '', 'source' => '', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, 'required' => true, 'user_defined' => false, @@ -107,7 +107,7 @@ class InstallData implements InstallDataInterface 'input' => '', 'class' => '', 'source' => '', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'visible' => false, 'required' => true, 'user_defined' => false, diff --git a/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/File/UploadTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/File/UploadTest.php index 7c1040876e8b0ffbf40e70dbb7ea3335113dbb2b..1a900b56c3f7a3d043476627ef3204000b6f59d5 100644 --- a/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/File/UploadTest.php +++ b/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/File/UploadTest.php @@ -165,6 +165,6 @@ class UploadTest extends \PHPUnit_Framework_TestCase $this->resultFactory->expects($this->once())->method('create')->willReturn($resultJson); $resultJson->expects($this->once())->method('setData')->willReturnSelf(); - $this->assertEquals($resultJson, $this->upload->execute()); + $this->assertEquals($resultJson, $this->upload->executeInternal()); } } diff --git a/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/LinkTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/LinkTest.php index 5e8c472595f660ddb4a033561d432df87c434aa5..887e35d8b11544c454026e8f1a55a1539b42550f 100644 --- a/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/LinkTest.php +++ b/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/LinkTest.php @@ -171,7 +171,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase $this->objectManager->expects($this->once())->method('create') ->will($this->returnValue($this->linkModel)); - $this->link->execute(); + $this->link->executeInternal(); } /** @@ -217,7 +217,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase $this->objectManager->expects($this->once())->method('create') ->will($this->returnValue($this->linkModel)); - $this->link->execute(); + $this->link->executeInternal(); } /** diff --git a/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/SampleTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/SampleTest.php index 88f7b2a301c09c802e11d7859f3c55c5ccb66226..e2de4bde3478f74e42ee9ca28233c089c497779e 100644 --- a/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/SampleTest.php +++ b/app/code/Magento/Downloadable/Test/Unit/Controller/Adminhtml/Downloadable/Product/Edit/SampleTest.php @@ -164,7 +164,7 @@ class SampleTest extends \PHPUnit_Framework_TestCase $this->objectManager->expects($this->once())->method('create') ->will($this->returnValue($this->sampleModel)); - $this->sample->execute(); + $this->sample->executeInternal(); } /** @@ -205,6 +205,6 @@ class SampleTest extends \PHPUnit_Framework_TestCase $this->objectManager->expects($this->once())->method('create') ->will($this->returnValue($this->sampleModel)); - $this->sample->execute(); + $this->sample->executeInternal(); } } diff --git a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkSampleTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkSampleTest.php index 110ce5fe279120a9d3849a8e55871184de0b8699..9d58bbd27efc332508fa9418861afb50485cd54c 100644 --- a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkSampleTest.php +++ b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkSampleTest.php @@ -191,7 +191,7 @@ class LinkSampleTest extends \PHPUnit_Framework_TestCase $this->redirect->expects($this->once())->method('getRedirectUrl')->willReturn('redirect_url'); $this->response->expects($this->once())->method('setRedirect')->with('redirect_url')->willReturnSelf(); - $this->assertEquals($this->response, $this->linkSample->execute()); + $this->assertEquals($this->response, $this->linkSample->executeInternal()); } public function testExecuteLinkTypeFile() @@ -238,6 +238,6 @@ class LinkSampleTest extends \PHPUnit_Framework_TestCase $this->redirect->expects($this->once())->method('getRedirectUrl')->willReturn('redirect_url'); $this->response->expects($this->once())->method('setRedirect')->with('redirect_url')->willReturnSelf(); - $this->assertEquals($this->response, $this->linkSample->execute()); + $this->assertEquals($this->response, $this->linkSample->executeInternal()); } } diff --git a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php index 7801f285941000e0c1eccbb7f01fe21bab22dec2..939b3786f129597bfc4212ee5a01ced67816583d 100644 --- a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php +++ b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php @@ -236,7 +236,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase ->with("We can't find the link you requested."); $this->redirect->expects($this->once())->method('redirect')->with($this->response, '*/customer/products', []); - $this->assertEquals($this->response, $this->link->execute()); + $this->assertEquals($this->response, $this->link->executeInternal()); } public function testGetLinkForGuestCustomer() @@ -287,7 +287,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase ->willReturn('before_auth_url'); $this->session->expects($this->once())->method('setBeforeAuthUrl')->with('before_auth_url')->willReturnSelf(); - $this->assertNull($this->link->execute()); + $this->assertNull($this->link->executeInternal()); } public function testGetLinkForWrongCustomer() @@ -327,7 +327,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase ->with("We can't find the link you requested."); $this->redirect->expects($this->once())->method('redirect')->with($this->response, '*/customer/products', []); - $this->assertEquals($this->response, $this->link->execute()); + $this->assertEquals($this->response, $this->link->executeInternal()); } public function testExceptionInUpdateLinkStatus() @@ -371,7 +371,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); $this->redirect->expects($this->once())->method('redirect')->with($this->response, '*/customer/products', []); - $this->assertEquals($this->response, $this->link->execute()); + $this->assertEquals($this->response, $this->link->executeInternal()); } private function processDownload($resource, $resourceType) @@ -448,7 +448,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase $this->linkPurchasedItem->expects($this->once())->method('getStatus')->willReturn($status); $this->messageManager->expects($this->once())->method($messageType)->with($notice)->willReturnSelf(); - $this->assertEquals($this->response, $this->link->execute()); + $this->assertEquals($this->response, $this->link->executeInternal()); } /** diff --git a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/SampleTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/SampleTest.php index 7366846899d6fd39dc1be3e8fcce0777a4263371..42933e534d00efa123f7ef12f8758a9773f781ef 100644 --- a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/SampleTest.php +++ b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/SampleTest.php @@ -191,7 +191,7 @@ class SampleTest extends \PHPUnit_Framework_TestCase $this->redirect->expects($this->once())->method('getRedirectUrl')->willReturn('redirect_url'); $this->response->expects($this->once())->method('setRedirect')->with('redirect_url')->willReturnSelf(); - $this->assertEquals($this->response, $this->sample->execute()); + $this->assertEquals($this->response, $this->sample->executeInternal()); } public function testExecuteLinkTypeFile() @@ -234,6 +234,6 @@ class SampleTest extends \PHPUnit_Framework_TestCase $this->redirect->expects($this->once())->method('getRedirectUrl')->willReturn('redirect_url'); $this->response->expects($this->once())->method('setRedirect')->with('redirect_url')->willReturnSelf(); - $this->assertEquals($this->response, $this->sample->execute()); + $this->assertEquals($this->response, $this->sample->executeInternal()); } } diff --git a/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable.phtml b/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable.phtml index 0c4077543059fd746f88a67b946889ca286ce287..dd2cf918d704e910e5712a57e0634ac5a84c6064 100644 --- a/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable.phtml +++ b/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable.phtml @@ -25,17 +25,6 @@ require([ //<![CDATA[> var uploaderTemplate = '<div class="no-display" id="[[idName]]-template">' + - '<div id="<%- data.id %>" class="file-row file-row-narrow">' + - '<span class="file-info">' + - '<span class="file-info-name"><%= data.name %></span>' + - ' ' + - '<span class="file-info-size">(<%- data.size %>)</span>' + - '</span>' + - '<div class="progressbar-container">' + - '<div class="progressbar upload-progress" style="width: 0%;"></div>' + - '</div>' + - '<div class="clear"></div>' + - '</div>' + '</div>' + '<div class="no-display" id="[[idName]]-template-progress">' + '<%- data.percent %>% <%- data.uploaded %> / <%- data.total %>' + @@ -67,9 +56,9 @@ var uploaderTemplate = '<div class="no-display" id="[[idName]]-template">' + } }; - var configurationSectionMessageHandler = (new function(attributeTitle, attributeTab) { + var configurationSectionMessageHandler = (new function(attributeTitle, buttons) { this.title = jQuery(attributeTitle); - this.buttons = jQuery('button', attributeTab); + this.buttons = jQuery(buttons); this.newText = '<?= /* @noEscape */ __('Configurations cannot be created for a standard product with downloadable files.' . ' To create configurations, first remove all downloadable files.');?>'; this.oldText = this.title.text(); @@ -86,7 +75,7 @@ var uploaderTemplate = '<div class="no-display" id="[[idName]]-template">' + this.title.text(this.newText); this.buttons.hide(); } - }('[data-role="product-create-configuration-info"]', '[data-tab="super_config"]')); + }('[data-role="product-create-configuration-info"]', '[data-action="product-create-configuration-buttons"]')); downloadableCheckbox.on('change', function () { switchConfigurationSectionMessage(!jQuery(this).is(':checked')); diff --git a/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/links.phtml b/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/links.phtml index d5c4b6dca86ea769bc9bb04fe98309bffcccd0e5..909ab56b200492fafa5e5611832c919e2ecdd726 100644 --- a/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/links.phtml +++ b/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/links.phtml @@ -34,7 +34,34 @@ <div class="admin__field" <?php echo !$block->isSingleStoreMode() ? ' data-config-scope="' . __('[GLOBAL]') . '"' : ''; ?>> <label class="admin__field-label" for="downloadable_link_purchase_type"><span><?php /* @escapeNotVerified */ echo __('Links can be purchased separately')?></span></label> <div class="admin__field-control"> - <?php /* @escapeNotVerified */ echo $block->getPurchasedSeparatelySelect()?> + <div class="admin__field-control link-switcher" data-role="link-switcher"> + <div class="admin__field-control-group"> + <div class="admin__field admin__field-option"> + <input type="radio" name="product[links_purchased_separately]" value="1" + class="admin__control-radio" + id="link-switcher1" + <?php if($block->isProductLinksCanBePurchasedSeparately()): ?> + checked="checked" + <?php endif; ?> + > + <label class="admin__field-label" for="link-switcher1"> + <span>Yes</span> + </label> + </div> + <div class="admin__field admin__field-option"> + <input type="radio" name="product[links_purchased_separately]" value="0" + class="admin__control-radio" + id="link-switcher0" + <?php if(!$block->isProductLinksCanBePurchasedSeparately()): ?> + checked="checked" + <?php endif; ?> + > + <label class="admin__field-label" for="link-switcher0"> + <span>No</span> + </label> + </div> + </div> + </div> </div> </div> <div class="admin__field admin__field-wide"> @@ -107,8 +134,10 @@ require([ '</td>'+ <?php if ($block->getCanReadPrice() !== false) : ?> '<td class="col-price">'+ - '<input type="text" id="downloadable_link_<%- data.id %>_price_value" class="input-text admin__control-text validate-number link-prices<?php if ($block->getCanEditPrice() === false) : ?> disabled<?php endif; ?>" name="downloadable[link][<%- data.id %>][price]" value="<%- data.price %>"<?php if ($block->getCanEditPrice() === false) : ?> disabled="disabled"<?php endif; ?> /> ' + - '<div class="note">[<?php /* @escapeNotVerified */ echo $block->getBaseCurrencyCode($_product->getStoreId()) ?>]</div>' + + '<div class="admin__control-addon">' + + '<input type="text" id="downloadable_link_<%- data.id %>_price_value" class="input-text admin__control-text validate-number link-prices<?php if ($block->getCanEditPrice() === false) : ?> disabled<?php endif; ?>" name="downloadable[link][<%- data.id %>][price]" value="<%- data.price %>"<?php if ($block->getCanEditPrice() === false) : ?> disabled="disabled"<?php endif; ?> /> ' + + '<label class="admin__addon-prefix"><span><?php echo $block->escapeHtml($block->getBaseCurrencySymbol($_product->getStoreId())) ?></span></label>' + + '</div>' + <?php if ($_product->getStoreId() && $block->getIsPriceWebsiteScope()) : ?> '<div class="admin__field admin__field-option">'+ '<input type="checkbox" id="downloadable_link_<%- data.id %>_price" name="downloadable[link][<%- data.id %>][use_default_price]" value="1"<?php if ($block->getCanEditPrice() === false) : ?> disabled="disabled"<?php endif; ?> class="admin__control-checkbox" />'+ @@ -355,9 +384,9 @@ require([ } }, togglePriceFields : function(){ - var toogleTo = $('downloadable_link_purchase_type').value; + var toogleTo = jQuery('#link-switcher1').is(':checked'); var disableFlag = true; - if (toogleTo == '1') { + if (toogleTo) { disableFlag = false; } $$('.link-prices[type="text"]').each(function(elm){ @@ -440,9 +469,10 @@ require([ })(jQuery); }; - - if ($('downloadable_link_purchase_type')) { - Event.observe('downloadable_link_purchase_type', 'change', linkItems.togglePriceFields.bind()); + if (jQuery('input[name="product[links_purchased_separately]"]')) { + jQuery('input[name="product[links_purchased_separately]"]').on('change', function () { + linkItems.togglePriceFields.bind() + }); } if($('add_link_item')) { diff --git a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php index 14147d6849de94bee388891d8ecfe389fd252ee5..f26e634b865aa67d0147cb74b1819d63757f5084 100644 --- a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php +++ b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php @@ -1296,11 +1296,11 @@ abstract class AbstractEntity extends AbstractResource implements EntityInterfac } elseif (!is_numeric($v) && $v !== $origData[$k] || is_numeric($v) && $v != $origData[$k]) { $update[$attrId] = [ 'value_id' => $attribute->getBackend()->getEntityValueId($newObject), - 'value' => $v, + 'value' => is_array($v) ? array_shift($v) : $v,//@TODO: MAGETWO-44182, ]; } } elseif (!$this->_isAttributeValueEmpty($attribute, $v)) { - $insert[$attrId] = $v; + $insert[$attrId] = is_array($v) ? array_shift($v) : $v;//@TODO: MAGETWO-44182 } } @@ -1513,7 +1513,7 @@ abstract class AbstractEntity extends AbstractResource implements EntityInterfac 'value' => $this->_prepareValueForSave($value, $attribute), ]; - if (!$this->getEntityTable()) { + if (!$this->getEntityTable() || $this->getEntityTable() == \Magento\Eav\Model\Entity::DEFAULT_ENTITY_TABLE) { $data['entity_type_id'] = $object->getEntityTypeId(); } diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Frontend/AbstractFrontend.php b/app/code/Magento/Eav/Model/Entity/Attribute/Frontend/AbstractFrontend.php index 65644c94f260574a221062bd559a0d335291cdb4..943cf2d3530de8edd94cfef35f95dc0fa3d36fa2 100644 --- a/app/code/Magento/Eav/Model/Entity/Attribute/Frontend/AbstractFrontend.php +++ b/app/code/Magento/Eav/Model/Entity/Attribute/Frontend/AbstractFrontend.php @@ -70,7 +70,7 @@ abstract class AbstractFrontend implements \Magento\Eav\Model\Entity\Attribute\F } /** - * Retrieve lable + * Retrieve label * * @return string */ @@ -84,6 +84,16 @@ abstract class AbstractFrontend implements \Magento\Eav\Model\Entity\Attribute\F return $label; } + /** + * Retrieve localized label + * + * @return \Magento\Framework\Phrase + */ + public function getLocalizedLabel() + { + return __($this->getLabel()); + } + /** * Retrieve attribute value * diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Group.php b/app/code/Magento/Eav/Model/Entity/Attribute/Group.php index b8c123718f89f23362c1c6c68106c09975229698..b0603a54ebc939988a1d9e07bae05834c74906fe 100644 --- a/app/code/Magento/Eav/Model/Entity/Attribute/Group.php +++ b/app/code/Magento/Eav/Model/Entity/Attribute/Group.php @@ -6,6 +6,8 @@ namespace Magento\Eav\Model\Entity\Attribute; +use Magento\Framework\Api\AttributeValueFactory; + /** * @author Magento Core Team <core@magentocommerce.com> * @@ -23,6 +25,43 @@ namespace Magento\Eav\Model\Entity\Attribute; class Group extends \Magento\Framework\Model\AbstractExtensibleModel implements \Magento\Eav\Api\Data\AttributeGroupInterface { + /** + * @var \Magento\Framework\Filter\Translit + */ + private $translitFilter; + + /** + * @param \Magento\Framework\Model\Context $context + * @param \Magento\Framework\Registry $registry + * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory + * @param AttributeValueFactory $customAttributeFactory + * @param \Magento\Framework\Filter\Translit $translitFilter + * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource + * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection + * @param array $data + */ + public function __construct( + \Magento\Framework\Model\Context $context, + \Magento\Framework\Registry $registry, + \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory, + AttributeValueFactory $customAttributeFactory, + \Magento\Framework\Filter\Translit $translitFilter, + \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, + array $data = [] + ) { + parent::__construct( + $context, + $registry, + $extensionFactory, + $customAttributeFactory, + $resource, + $resourceCollection, + $data + ); + $this->translitFilter = $translitFilter; + } + /** * Resource initialization * @@ -66,7 +105,14 @@ class Group extends \Magento\Framework\Model\AbstractExtensibleModel implements if (!$this->getAttributeGroupCode()) { $groupName = $this->getAttributeGroupName(); if ($groupName) { - $attributeGroupCode = trim(preg_replace('/[^a-z0-9]+/', '-', strtolower($groupName)), '-'); + $attributeGroupCode = trim( + preg_replace( + '/[^a-z0-9]+/', + '-', + $this->translitFilter->filter(strtolower($groupName)) + ), + '-' + ); if (empty($attributeGroupCode)) { // in the following code md5 is not used for security purposes $attributeGroupCode = md5($groupName); diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/ScopedAttributeInterface.php b/app/code/Magento/Eav/Model/Entity/Attribute/ScopedAttributeInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..2b2412fe05bb440e6bf2dbb3d837b670db77dc70 --- /dev/null +++ b/app/code/Magento/Eav/Model/Entity/Attribute/ScopedAttributeInterface.php @@ -0,0 +1,15 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Eav\Model\Entity\Attribute; + +interface ScopedAttributeInterface +{ + const SCOPE_STORE = 0; + + const SCOPE_GLOBAL = 1; + + const SCOPE_WEBSITE = 2; +} diff --git a/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php index 0a1587fc8fc3f7a25c8a70ff5e76348e5efeeca9..f7b565f9055edccb78469e254779ea79aadbc04b 100644 --- a/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php +++ b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php @@ -35,7 +35,11 @@ class PropertyMapper extends PropertyMapperAbstract 'default_value' => $this->_getValue($input, 'default'), 'is_unique' => $this->_getValue($input, 'unique', 0), 'note' => $this->_getValue($input, 'note'), - 'is_global' => $this->_getValue($input, 'global', Attribute::SCOPE_GLOBAL) + 'is_global' => $this->_getValue( + $input, + 'global', + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL + ) ]; } } diff --git a/app/code/Magento/Eav/Setup/EavSetup.php b/app/code/Magento/Eav/Setup/EavSetup.php index 828523bb0c08f73bf965c2e34a8ff2b982a260e1..d1d0452fe7b772f6d13babdb14374d5d3deadf6a 100644 --- a/app/code/Magento/Eav/Setup/EavSetup.php +++ b/app/code/Magento/Eav/Setup/EavSetup.php @@ -527,6 +527,14 @@ class EavSetup if ($sortOrder === null) { $data['sort_order'] = $this->getAttributeGroupSortOrder($entityTypeId, $setId, $sortOrder); } + if (empty($data['attribute_group_code'])) { + $attributeGroupCode = trim(preg_replace('/[^a-z0-9]+/', '-', strtolower($name)), '-'); + if (empty($attributeGroupCode)) { + // in the following code md5 is not used for security purposes + $attributeGroupCode = md5($name); + } + $data['attribute_group_code'] = $attributeGroupCode; + } $this->setup->getConnection()->insert($this->setup->getTable('eav_attribute_group'), $data); } diff --git a/app/code/Magento/Eav/Setup/InstallSchema.php b/app/code/Magento/Eav/Setup/InstallSchema.php index 24c041c7e2c05bd1365bfb0166cae0f253d3c0c5..75ae06b1a3076a98f906f626016f3d858c9b0b48 100644 --- a/app/code/Magento/Eav/Setup/InstallSchema.php +++ b/app/code/Magento/Eav/Setup/InstallSchema.php @@ -895,7 +895,7 @@ class InstallSchema implements InstallSchemaInterface 'attribute_group_code', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 255, - ['default' => null], + ['nullable' => false], 'Attribute Group Code' )->addColumn( 'tab_group_code', diff --git a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Frontend/DatetimeTest.php b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Frontend/DatetimeTest.php index f28fe8386eee309b308d26a8455012ba045ffbcb..6c1263ef01ecef944e5f0426c123c93dca3a34e6 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Frontend/DatetimeTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Frontend/DatetimeTest.php @@ -38,17 +38,14 @@ class DatetimeTest extends \PHPUnit_Framework_TestCase '', false ); - $this->localeDateMock = $this->getMock('\Magento\Framework\Stdlib\DateTime\TimezoneInterface'); - $this->attributeMock = $this->getMock( '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute', - [], + ['getAttributeCode', 'getFrontendLabel'], [], '', false ); - $this->attributeMock->expects($this->any())->method('getAttributeCode')->will($this->returnValue('datetime')); $this->model = new Datetime($this->booleanFactoryMock, $this->localeDateMock); $this->model->setAttribute($this->attributeMock); @@ -59,13 +56,50 @@ class DatetimeTest extends \PHPUnit_Framework_TestCase $attributeValue = '11-11-2011'; $date = new \DateTime($attributeValue); $object = new \Magento\Framework\DataObject(['datetime' => $attributeValue]); - $this->attributeMock->expects($this->any())->method('getData')->with('frontend_input') - ->will($this->returnValue('text')); - $this->localeDateMock->expects($this->once())->method('formatDateTime') + $this->attributeMock->expects($this->any()) + ->method('getAttributeCode') + ->willReturn('datetime'); + $this->attributeMock->expects($this->any()) + ->method('getData') + ->with('frontend_input') + ->willReturn('text'); + $this->localeDateMock->expects($this->once()) + ->method('formatDateTime') ->with($date, \IntlDateFormatter::MEDIUM, \IntlDateFormatter::NONE, null, null, null) ->willReturn($attributeValue); $this->assertEquals($attributeValue, $this->model->getValue($object)); } + + /** + * @param mixed $labelText + * @param string $attributeCode + * @param string $expectedResult + * @dataProvider getLabelDataProvider + */ + public function testGetLocalizedLabel($labelText, $attributeCode, $expectedResult) + { + $this->attributeMock->expects($this->exactly(2)) + ->method('getFrontendLabel') + ->willReturn($labelText); + $this->attributeMock->expects($this->any()) + ->method('getAttributeCode') + ->willReturn($attributeCode); + + $this->assertInstanceOf('\Magento\Framework\Phrase', $this->model->getLocalizedLabel()); + $this->assertSame($expectedResult, (string)$this->model->getLocalizedLabel()); + } + + /** + * @return array + */ + public function getLabelDataProvider() + { + return [ + [null, 'test code', 'test code'], + ['', 'test code', 'test code'], + ['test label', 'test code', 'test label'], + ]; + } } diff --git a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/GroupTest.php b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/GroupTest.php index a9a9eff9b9ec23b93d1ca2a42115fa713ee7a3f0..cde8db9b42470a758b9412ff571ffd1dd9b6f584 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/GroupTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/GroupTest.php @@ -34,11 +34,17 @@ class GroupTest extends \PHPUnit_Framework_TestCase '', false ); + $translitFilter = $this->getMockBuilder(\Magento\Framework\Filter\Translit::class) + ->disableOriginalConstructor() + ->getMock(); + $translitFilter->expects($this->atLeastOnce())->method('filter')->willReturnArgument(0); + $this->eventManagerMock = $this->getMock('Magento\Framework\Event\ManagerInterface'); $contextMock = $this->getMock('Magento\Framework\Model\Context', [], [], '', false); $contextMock->expects($this->any())->method('getEventDispatcher')->willReturn($this->eventManagerMock); $constructorArguments = [ 'resource' => $this->resourceMock, + 'translitFilter' => $translitFilter, 'context' => $contextMock, ]; $objectManager = new ObjectManager($this); diff --git a/app/code/Magento/Email/Block/Adminhtml/Template/Preview.php b/app/code/Magento/Email/Block/Adminhtml/Template/Preview.php index eb34ed100fd5c2ac178744ea260aa74a3aa5d8da..d215d37d7df3aa59aaaac441f4f08251268f3328 100644 --- a/app/code/Magento/Email/Block/Adminhtml/Template/Preview.php +++ b/app/code/Magento/Email/Block/Adminhtml/Template/Preview.php @@ -23,6 +23,11 @@ class Preview extends \Magento\Backend\Block\Widget */ protected $_emailFactory; + /** + * @var string + */ + protected $profilerName = 'email_template_proccessing'; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Framework\Filter\Input\MaliciousCode $maliciousCode @@ -48,16 +53,10 @@ class Preview extends \Magento\Backend\Block\Widget protected function _toHtml() { $storeId = $this->getAnyStoreView()->getId(); - /** @var $template \Magento\Email\Model\Template */ - $template = $this->_emailFactory->create( - ['data' => [ - 'area' => \Magento\Framework\App\Area::AREA_FRONTEND, - 'store' => $storeId - ]] - ); - $id = (int) $this->getRequest()->getParam('id'); - if ($id) { + $template = $this->_emailFactory->create(); + + if ($id = (int)$this->getRequest()->getParam('id')) { $template->load($id); } else { $template->setTemplateType($this->getRequest()->getParam('type')); @@ -67,7 +66,7 @@ class Preview extends \Magento\Backend\Block\Widget $template->setTemplateText($this->_maliciousCode->filter($template->getTemplateText())); - \Magento\Framework\Profiler::start("email_template_proccessing"); + \Magento\Framework\Profiler::start($this->profilerName); $template->emulateDesign($storeId); $templateProcessed = $this->_appState->emulateAreaCode( @@ -80,7 +79,7 @@ class Preview extends \Magento\Backend\Block\Widget $templateProcessed = "<pre>" . htmlspecialchars($templateProcessed) . "</pre>"; } - \Magento\Framework\Profiler::stop("email_template_proccessing"); + \Magento\Framework\Profiler::stop($this->profilerName); return $templateProcessed; } diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/DefaultTemplate.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/DefaultTemplate.php index 116d88710173e97f8e9af57ea125f6f3da5389f7..3ffb0528e23f60d551fccdc0bcae31f99b59f120 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/DefaultTemplate.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/DefaultTemplate.php @@ -32,7 +32,7 @@ class DefaultTemplate extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $template = $this->_initTemplate('id'); diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php index 7022d18ff3cc9700f85fd4ec83da3461dd290bb7..04127a7c311c13b750af484becb31fa8bfdc9bcb 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { $template = $this->_initTemplate('id'); if ($template->getId()) { diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Edit.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Edit.php index 017f05898d99ac9a93d7ee31cb319011ecc57d53..653094a7baf512bc136f492618505c21be2b1ce5 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Edit.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $template = $this->_initTemplate('id'); diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Grid.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Grid.php index 8205fa3e7dfb3775c8f2b9ef1c9faa2d0088e0f1..0a63dad7192af9e0216921619eb0483d0c76565c 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Grid.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Index.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Index.php index 39f1684934517d97dbec800bec6a3d5ea0e72e26..892affd8da87a636801698f126f572b92a9287c9 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Index.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getQuery('ajax')) { $this->_forward('grid'); diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/NewAction.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/NewAction.php index 4e405353acf027ca1c0640a2fd7df3ce4754b1e1..b92f01f12bf014dcbc1ed386eed29e3a2188c68b 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/NewAction.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Preview.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Preview.php index fceea747f03b99ffbde4a9ccc23a6bf700feac0c..81558a7805c863c52fb8f52c7aafa428eceb4e2b 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Preview.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Preview.php @@ -13,10 +13,11 @@ class Preview extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { try { - $this->_view->loadLayout('systemPreview'); + $this->_view->loadLayout(); + $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Email Preview')); $this->_view->renderLayout(); } catch (\Exception $e) { $this->messageManager->addError(__('An error occurred. The email template can not be opened for preview.')); diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php index ecb8f8c55ad57e73cca70f4043e772945be45c02..be2022ffa7e7791dd3d6d80cb390a3c58a9642f2 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php @@ -15,7 +15,7 @@ class Save extends \Magento\Email\Controller\Adminhtml\Email\Template * * @return void */ - public function execute() + public function executeInternal() { $request = $this->getRequest(); $id = $this->getRequest()->getParam('id'); diff --git a/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/PreviewTest.php b/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/PreviewTest.php index 599c1b81010d4c5688df278234ccac6cae4e0608..3a7d91dfefb72d2ab23ac1c54867b46fd017ddcc 100644 --- a/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/PreviewTest.php +++ b/app/code/Magento/Email/Test/Unit/Block/Adminhtml/Template/PreviewTest.php @@ -46,42 +46,37 @@ class PreviewTest extends \PHPUnit_Framework_TestCase 'revertDesign' ]) ->disableOriginalConstructor() - ->getMock() - ; + ->getMock(); $template->expects($this->once()) ->method('getProcessedTemplate') ->with($this->equalTo([])) - ->will($this->returnValue(self::MALICIOUS_TEXT)); - $designConfigData = [ - 'area' => \Magento\Framework\App\Area::AREA_FRONTEND, - 'store' => $storeId - ]; + ->willReturn(self::MALICIOUS_TEXT); + $designConfigData = []; $template->expects($this->atLeastOnce()) ->method('getDesignConfig') - ->will($this->returnValue(new \Magento\Framework\DataObject( + ->willReturn(new \Magento\Framework\DataObject( $designConfigData - ))); + )); $emailFactory = $this->getMock('Magento\Email\Model\TemplateFactory', ['create'], [], '', false); - $emailFactory->expects($this->once()) + $emailFactory->expects($this->any()) ->method('create') - ->with($this->equalTo(['data' => $designConfigData])) - ->will($this->returnValue($template)); + ->willReturn($template); $request = $this->getMock('Magento\Framework\App\RequestInterface'); - $request->expects($this->any())->method('getParam')->will($this->returnValueMap($requestParamMap)); + $request->expects($this->any())->method('getParam')->willReturnMap($requestParamMap); $eventManage = $this->getMock('Magento\Framework\Event\ManagerInterface'); $scopeConfig = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface'); $design = $this->getMock('Magento\Framework\View\DesignInterface'); $store = $this->getMock('Magento\Store\Model\Store', ['getId', '__wakeup'], [], '', false); - $store->expects($this->any())->method('getId')->will($this->returnValue($storeId)); + $store->expects($this->any())->method('getId')->willReturn($storeId); $storeManager = $this->getMockBuilder('\Magento\Store\Model\StoreManagerInterface') ->disableOriginalConstructor() ->getMock(); $storeManager->expects($this->atLeastOnce()) ->method('getDefaultStoreView') - ->will($this->returnValue($store)); - $storeManager->expects($this->any())->method('getDefaultStoreView')->will($this->returnValue(null)); - $storeManager->expects($this->any())->method('getStores')->will($this->returnValue([$store])); + ->willReturn($store); + $storeManager->expects($this->any())->method('getDefaultStoreView')->willReturn(null); + $storeManager->expects($this->any())->method('getStores')->willReturn([$store]); $appState = $this->getMockBuilder('Magento\Framework\App\State') ->setConstructorArgs([ $scopeConfig @@ -94,12 +89,12 @@ class PreviewTest extends \PHPUnit_Framework_TestCase ['getRequest', 'getEventManager', 'getScopeConfig', 'getDesignPackage', 'getStoreManager', 'getAppState'], [], '', false ); - $context->expects($this->any())->method('getRequest')->will($this->returnValue($request)); - $context->expects($this->any())->method('getEventManager')->will($this->returnValue($eventManage)); - $context->expects($this->any())->method('getScopeConfig')->will($this->returnValue($scopeConfig)); - $context->expects($this->any())->method('getDesignPackage')->will($this->returnValue($design)); - $context->expects($this->any())->method('getStoreManager')->will($this->returnValue($storeManager)); - $context->expects($this->once())->method('getAppState')->will($this->returnValue($appState)); + $context->expects($this->any())->method('getRequest')->willReturn($request); + $context->expects($this->any())->method('getEventManager')->willReturn($eventManage); + $context->expects($this->any())->method('getScopeConfig')->willReturn($scopeConfig); + $context->expects($this->any())->method('getDesignPackage')->willReturn($design); + $context->expects($this->any())->method('getStoreManager')->willReturn($storeManager); + $context->expects($this->once())->method('getAppState')->willReturn($appState); $maliciousCode = $this->getMock( 'Magento\Framework\Filter\Input\MaliciousCode', @@ -108,9 +103,12 @@ class PreviewTest extends \PHPUnit_Framework_TestCase '', false ); - $maliciousCode->expects($this->once())->method('filter')->with($this->equalTo($requestParamMap[1][2])) - ->will($this->returnValue(self::MALICIOUS_TEXT)); + $maliciousCode->expects($this->once()) + ->method('filter') + ->with($this->equalTo($requestParamMap[1][2])) + ->willReturn(self::MALICIOUS_TEXT); + /** @var \Magento\Email\Block\Adminhtml\Template\Preview $preview */ $preview = $this->objectManagerHelper->getObject( 'Magento\Email\Block\Adminhtml\Template\Preview', [ diff --git a/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/EditTest.php b/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/EditTest.php index 905318c274a3901b8f43cfc3f8afed87b4e04bdc..6838b1ba1b1fc3bdd6688081c40aaf11f930bbc8 100644 --- a/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/EditTest.php +++ b/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/EditTest.php @@ -184,7 +184,7 @@ class EditTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Edit::execute + * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Edit::executeInternal */ public function testExecuteNewTemplate() { @@ -217,11 +217,11 @@ class EditTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertNull($this->editController->execute()); + $this->assertNull($this->editController->executeInternal()); } /** - * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Edit::execute + * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Edit::executeInternal */ public function testExecuteEdit() { @@ -254,6 +254,6 @@ class EditTest extends \PHPUnit_Framework_TestCase ] ); - $this->assertNull($this->editController->execute()); + $this->assertNull($this->editController->executeInternal()); } } diff --git a/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/IndexTest.php b/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/IndexTest.php index c5ada6573f6b86c0c52a99a850944c56aacfc26b..027e66b1670e10927c9588510b197fe218f4f0cb 100644 --- a/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/IndexTest.php +++ b/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/IndexTest.php @@ -118,9 +118,9 @@ class IndexTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Index::execute + * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Index::executeInternal */ - public function testExecute() + public function testExecuteInternal() { $this->prepareExecute(); @@ -157,13 +157,13 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->method('addLink') ->willReturnSelf(); - $this->assertNull($this->indexController->execute()); + $this->assertNull($this->indexController->executeInternal()); } /** - * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Index::execute + * @covers \Magento\Email\Controller\Adminhtml\Email\Template\Index::executeInternal */ - public function testExecuteAjax() + public function testExecuteInternalAjax() { $this->prepareExecute(true); $indexController = $this->getMockBuilder('Magento\Email\Controller\Adminhtml\Email\Template\Index') @@ -176,7 +176,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase $indexController->expects($this->once()) ->method('_forward') ->with('grid'); - $this->assertNull($indexController->execute()); + $this->assertNull($indexController->executeInternal()); } /** diff --git a/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/PreviewTest.php b/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/PreviewTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e1f80f7f1336e084b30c18314f635998ab366de1 --- /dev/null +++ b/app/code/Magento/Email/Test/Unit/Controller/Adminhtml/Email/Template/PreviewTest.php @@ -0,0 +1,115 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Email\Test\Unit\Controller\Adminhtml\Email\Template; + +use Magento\Email\Controller\Adminhtml\Email\Template\Preview; +use Magento\Framework\App\Action\Context; +use Magento\Framework\App\RequestInterface; +use Magento\Framework\App\View; +use Magento\Framework\Registry; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\View\Config; +use Magento\Framework\View\Page\Title; +use Magento\Framework\View\Result\Page; + +/** + * Preview Test + */ +class PreviewTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Preview + */ + protected $object; + + /** + * @var Context + */ + protected $context; + + /** + * @var Registry|\PHPUnit_Framework_MockObject_MockObject + */ + protected $coreRegistryMock; + + /** + * @var View|\PHPUnit_Framework_MockObject_MockObject + */ + protected $viewMock; + + /** + * @var RequestInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $requestMock; + + /** + * @var Page|\PHPUnit_Framework_MockObject_MockObject + */ + protected $pageMock; + + /** + * @var Config|\PHPUnit_Framework_MockObject_MockObject + */ + protected $pageConfigMock; + + /** + * @var Title|\PHPUnit_Framework_MockObject_MockObject + */ + protected $pageTitleMock; + + protected function setUp() + { + $objectManager = new ObjectManager($this); + + $this->coreRegistryMock = $this->getMockBuilder('Magento\Framework\Registry') + ->disableOriginalConstructor() + ->getMock(); + $this->viewMock = $this->getMockBuilder('Magento\Framework\App\View') + ->disableOriginalConstructor() + ->getMock(); + $this->requestMock = $this->getMockBuilder('Magento\Framework\App\RequestInterface') + ->getMock(); + $this->pageMock = $this->getMockBuilder('Magento\Framework\View\Result\Page') + ->disableOriginalConstructor() + ->setMethods(['getConfig']) + ->getMock(); + $this->pageConfigMock = $this->getMockBuilder('Magento\Framework\View\Page\Config') + ->setMethods(['getTitle']) + ->disableOriginalConstructor() + ->getMock(); + $this->pageTitleMock = $this->getMockBuilder('Magento\Framework\View\Page\Title') + ->setMethods(['prepend']) + ->disableOriginalConstructor() + ->getMock(); + + $this->context = $objectManager->getObject('Magento\Backend\App\Action\Context', [ + 'request' => $this->requestMock, + 'view' => $this->viewMock + ]); + $this->object = $objectManager->getObject('Magento\Email\Controller\Adminhtml\Email\Template\Preview', [ + 'context' => $this->context, + 'coreRegistry' => $this->coreRegistryMock, + ]); + } + + public function testExecuteInternal() + { + $this->viewMock->expects($this->once()) + ->method('getPage') + ->willReturn($this->pageMock); + $this->pageMock->expects($this->once()) + ->method('getConfig') + ->willReturn($this->pageConfigMock); + $this->pageConfigMock->expects($this->once()) + ->method('getTitle') + ->willReturn($this->pageTitleMock); + $this->pageTitleMock->expects($this->once()) + ->method('prepend') + ->willReturnSelf(); + + $this->assertNull($this->object->executeInternal()); + } +} diff --git a/app/code/Magento/Email/Test/Unit/Model/Template/Config/ReaderTest.php b/app/code/Magento/Email/Test/Unit/Model/Template/Config/ReaderTest.php index e572b67abee1ea3d2fad797cdd9f580cbb65a888..baf28034f78b386e3036891e87bf4ca0c14968ca 100644 --- a/app/code/Magento/Email/Test/Unit/Model/Template/Config/ReaderTest.php +++ b/app/code/Magento/Email/Test/Unit/Model/Template/Config/ReaderTest.php @@ -69,8 +69,10 @@ class ReaderTest extends \PHPUnit_Framework_TestCase ); $schemaLocator = new \Magento\Email\Model\Template\Config\SchemaLocator($moduleReader); - $validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationState->expects($this->once())->method('isValidated')->will($this->returnValue(false)); + $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface', [], [], '', true); + $validationStateMock->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(false); $this->_moduleDirResolver = $this->getMock( 'Magento\Framework\Module\Dir\ReverseResolver', @@ -109,7 +111,7 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $fileResolver, $this->_converter, $schemaLocator, - $validationState + $validationStateMock ); } diff --git a/app/code/Magento/Email/Test/Unit/Model/Template/Config/XsdTest.php b/app/code/Magento/Email/Test/Unit/Model/Template/Config/XsdTest.php index f2eb7b69f76d8bb955898f4adaf0f38d83716c1c..ed03f792be1828a2a67bb057ac7e9928ba51d7e7 100644 --- a/app/code/Magento/Email/Test/Unit/Model/Template/Config/XsdTest.php +++ b/app/code/Magento/Email/Test/Unit/Model/Template/Config/XsdTest.php @@ -113,7 +113,10 @@ class XsdTest extends \PHPUnit_Framework_TestCase */ protected function _testXmlAgainstXsd($fixtureXml, $schemaFile, array $expectedErrors) { - $dom = new \Magento\Framework\Config\Dom($fixtureXml, [], null, null, '%message%'); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, '%message%'); $actualResult = $dom->validate($schemaFile, $actualErrors); $this->assertEquals(empty($expectedErrors), $actualResult); $this->assertEquals($expectedErrors, $actualErrors); diff --git a/app/code/Magento/Email/view/adminhtml/layout/adminhtml_email_template_preview.xml b/app/code/Magento/Email/view/adminhtml/layout/adminhtml_email_template_preview.xml new file mode 100644 index 0000000000000000000000000000000000000000..242cda682c53ffda07febb0fe612d0b70aae3616 --- /dev/null +++ b/app/code/Magento/Email/view/adminhtml/layout/adminhtml_email_template_preview.xml @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> + <body> + <referenceContainer name="page.content"> + <block name="preview.page.content" class="Magento\Framework\View\Element\Template" template="Magento_Email::template/preview.phtml"> + <block class="Magento\Email\Block\Adminhtml\Template\Preview" name="content" as="content"/> + </block> + </referenceContainer> + </body> +</page> diff --git a/app/code/Magento/Email/view/adminhtml/layout/systemPreview.xml b/app/code/Magento/Email/view/adminhtml/layout/systemPreview.xml deleted file mode 100644 index f58984cc6ed62500df26595e7355357dcb713bab..0000000000000000000000000000000000000000 --- a/app/code/Magento/Email/view/adminhtml/layout/systemPreview.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd"> - <container name="root"> - <block class="Magento\Framework\View\Element\Template" name="page.block" template="Magento_Email::template/preview.phtml"> - <block class="Magento\Email\Block\Adminhtml\Template\Preview" name="content" as="content"/> - </block> - </container> -</layout> diff --git a/app/code/Magento/Email/view/adminhtml/templates/template/preview.phtml b/app/code/Magento/Email/view/adminhtml/templates/template/preview.phtml index d54075edcb69bebe0854a65fd36359d4d82a95cc..c90ad26855528e3faf831ff36838cf3ba5add04e 100644 --- a/app/code/Magento/Email/view/adminhtml/templates/template/preview.phtml +++ b/app/code/Magento/Email/view/adminhtml/templates/template/preview.phtml @@ -3,6 +3,8 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ + +/* @var $block \Magento\Email\Block\Adminhtml\Template\Preview */ ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="en"> diff --git a/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Index.php b/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Index.php index 0c2ad5395a93edf006ba312a1bd87d67f6e97703..31b7833485ffddb1f6508633f3f0f8a1114eed79 100644 --- a/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Index.php +++ b/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Index.php @@ -16,7 +16,7 @@ class Index extends \Magento\EncryptionKey\Controller\Adminhtml\Crypt\Key * * @return void */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\App\DeploymentConfig\Writer $writer */ $writer = $this->_objectManager->get('Magento\Framework\App\DeploymentConfig\Writer'); diff --git a/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Save.php b/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Save.php index b06c18cae6b64194b168c8170f87ea4b989e1191..6921d482c1d230e89df1b9a33d046422c79a0c51 100644 --- a/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Save.php +++ b/app/code/Magento/EncryptionKey/Controller/Adminhtml/Crypt/Key/Save.php @@ -50,7 +50,7 @@ class Save extends \Magento\EncryptionKey\Controller\Adminhtml\Crypt\Key * * @return void */ - public function execute() + public function executeInternal() { try { $key = null; diff --git a/app/code/Magento/EncryptionKey/Test/Unit/Controller/Adminhtml/Crypt/Key/SaveTest.php b/app/code/Magento/EncryptionKey/Test/Unit/Controller/Adminhtml/Crypt/Key/SaveTest.php index f4f697418343d467ccc06c061c6bd78b1b9d705a..13f8f772138e37860449c5419367eb820a748367 100644 --- a/app/code/Magento/EncryptionKey/Test/Unit/Controller/Adminhtml/Crypt/Key/SaveTest.php +++ b/app/code/Magento/EncryptionKey/Test/Unit/Controller/Adminhtml/Crypt/Key/SaveTest.php @@ -90,7 +90,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->cacheMock->expects($this->once())->method('clean'); $this->responseMock->expects($this->once())->method('setRedirect'); - $this->model->execute(); + $this->model->executeInternal(); } public function testExecuteNonRandomAndWithoutCryptKey() @@ -108,7 +108,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->willReturn($key); $this->managerMock->expects($this->once())->method('addErrorMessage'); - $this->model->execute(); + $this->model->executeInternal(); } public function testExecuteRandom() @@ -125,6 +125,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->cacheMock->expects($this->once())->method('clean'); $this->responseMock->expects($this->once())->method('setRedirect'); - $this->model->execute(); + $this->model->executeInternal(); } } diff --git a/app/code/Magento/EncryptionKey/i18n/de_DE.csv b/app/code/Magento/EncryptionKey/i18n/de_DE.csv index 6f364baa1ff9fbf44f2e7c5a64f1b795a02a3b58..705d98a99d2982a35101e309641c8d508a084f75 100644 --- a/app/code/Magento/EncryptionKey/i18n/de_DE.csv +++ b/app/code/Magento/EncryptionKey/i18n/de_DE.csv @@ -17,3 +17,4 @@ Username,Benutzername "The encryption key format is invalid.","The encryption key format is invalid." "File %1 is not writeable.","File %1 is not writeable." "Encryption Key Change","Änderung des Verschlüsselungscodes" +"Manage Encryption Key","Manage Encryption Key" diff --git a/app/code/Magento/EncryptionKey/i18n/en_US.csv b/app/code/Magento/EncryptionKey/i18n/en_US.csv index 792bc2f60f5a8def580c8675735e45a6e085fe99..f111edc33abb1104585153b846ad91ac3d42ed24 100644 --- a/app/code/Magento/EncryptionKey/i18n/en_US.csv +++ b/app/code/Magento/EncryptionKey/i18n/en_US.csv @@ -17,3 +17,4 @@ Username,Username "The encryption key format is invalid.","The encryption key format is invalid." "File %1 is not writeable.","File %1 is not writeable." "Encryption Key Change","Encryption Key Change" +"Manage Encryption Key","Manage Encryption Key" diff --git a/app/code/Magento/EncryptionKey/i18n/es_ES.csv b/app/code/Magento/EncryptionKey/i18n/es_ES.csv index 0840d0cb0b5b2e257052b579913561c1e47d62ab..16fe7d35f56db0e6d6765344bc56a664b8c288ae 100644 --- a/app/code/Magento/EncryptionKey/i18n/es_ES.csv +++ b/app/code/Magento/EncryptionKey/i18n/es_ES.csv @@ -17,3 +17,4 @@ Username,"Nombre de Usuario" "The encryption key format is invalid.","The encryption key format is invalid." "File %1 is not writeable.","File %1 is not writeable." "Encryption Key Change","Cambio de clave de encriptación" +"Manage Encryption Key","Manage Encryption Key" diff --git a/app/code/Magento/EncryptionKey/i18n/fr_FR.csv b/app/code/Magento/EncryptionKey/i18n/fr_FR.csv index 0604b96989aef7ece5052119ada362ddb58325f5..6311d1da4f3e34cb60e93229c9e13e045a494b5f 100644 --- a/app/code/Magento/EncryptionKey/i18n/fr_FR.csv +++ b/app/code/Magento/EncryptionKey/i18n/fr_FR.csv @@ -17,3 +17,4 @@ Username,"Nom d'utilisateur" "The encryption key format is invalid.","The encryption key format is invalid." "File %1 is not writeable.","File %1 is not writeable." "Encryption Key Change","Modification Clé de Chiffrement" +"Manage Encryption Key","Manage Encryption Key" diff --git a/app/code/Magento/EncryptionKey/i18n/nl_NL.csv b/app/code/Magento/EncryptionKey/i18n/nl_NL.csv index cffae21b4184be2befdef775de0bf08798fa9cd8..11268b36d5d1bb5e228d8fcea0255a9b06f9a455 100644 --- a/app/code/Magento/EncryptionKey/i18n/nl_NL.csv +++ b/app/code/Magento/EncryptionKey/i18n/nl_NL.csv @@ -17,3 +17,4 @@ Username,Gebruikersnaam "The encryption key format is invalid.","The encryption key format is invalid." "File %1 is not writeable.","File %1 is not writeable." "Encryption Key Change","Encryptie Code Veranderen" +"Manage Encryption Key","Manage Encryption Key" diff --git a/app/code/Magento/EncryptionKey/i18n/pt_BR.csv b/app/code/Magento/EncryptionKey/i18n/pt_BR.csv index 495e0c38d96cff463f3235907d667bd4203158ff..2529b0b015a7d1b0b6d8a72df6ebfdd0f8f9227e 100644 --- a/app/code/Magento/EncryptionKey/i18n/pt_BR.csv +++ b/app/code/Magento/EncryptionKey/i18n/pt_BR.csv @@ -17,3 +17,4 @@ Username,"Nome do usuário" "The encryption key format is invalid.","The encryption key format is invalid." "File %1 is not writeable.","File %1 is not writeable." "Encryption Key Change","Mudança na Chave de Criptografia" +"Manage Encryption Key","Manage Encryption Key" diff --git a/app/code/Magento/EncryptionKey/i18n/zh_Hans_CN.csv b/app/code/Magento/EncryptionKey/i18n/zh_Hans_CN.csv index 3b5711dc0af9b1b68e12220bd7aaa16372859c67..02b9c53f97bb4de358834eaa8a9148bec10cfd71 100644 --- a/app/code/Magento/EncryptionKey/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/EncryptionKey/i18n/zh_Hans_CN.csv @@ -17,3 +17,4 @@ Username,用户å "The encryption key format is invalid.","The encryption key format is invalid." "File %1 is not writeable.","File %1 is not writeable." "Encryption Key Change",åŠ å¯†å¯†é’¥å·²æ›´æ”¹ +"Manage Encryption Key","Manage Encryption Key" diff --git a/app/code/Magento/GoogleAdwords/Model/Config/Backend/AbstractConversion.php b/app/code/Magento/GoogleAdwords/Model/Config/Backend/AbstractConversion.php index b3cc66a1ed13c0bd06ae5ffdc4bc35b06aa892ea..d86e2dc5565ed04f1bc1fe3a7e5da25d82cb010d 100644 --- a/app/code/Magento/GoogleAdwords/Model/Config/Backend/AbstractConversion.php +++ b/app/code/Magento/GoogleAdwords/Model/Config/Backend/AbstractConversion.php @@ -26,6 +26,7 @@ abstract class AbstractConversion extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\Validator\DataObjectFactory $validatorCompositeFactory * @param \Magento\GoogleAdwords\Model\Validator\Factory $validatorFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -36,13 +37,14 @@ abstract class AbstractConversion extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Validator\DataObjectFactory $validatorCompositeFactory, \Magento\GoogleAdwords\Model\Validator\Factory $validatorFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->_validatorFactory = $validatorFactory; $this->_validatorComposite = $validatorCompositeFactory->create(); diff --git a/app/code/Magento/GroupedProduct/Controller/Adminhtml/Edit/Popup.php b/app/code/Magento/GroupedProduct/Controller/Adminhtml/Edit/Popup.php index 5a46c44b01fd41f20a4e48fde629fb2dc00f301b..258c74c4bafb03a13b903f086b401cf48eb7892d 100644 --- a/app/code/Magento/GroupedProduct/Controller/Adminhtml/Edit/Popup.php +++ b/app/code/Magento/GroupedProduct/Controller/Adminhtml/Edit/Popup.php @@ -62,7 +62,7 @@ class Popup extends AbstractAction * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $productId = (int)$this->getRequest()->getParam('id'); diff --git a/app/code/Magento/GroupedProduct/Test/Unit/Controller/Adminhtml/Edit/PopupTest.php b/app/code/Magento/GroupedProduct/Test/Unit/Controller/Adminhtml/Edit/PopupTest.php index 4daa62a813c2c1379e4cda9318f805b7d9823df6..fab1db70710464522416a7c6709c0be90cd67a53 100644 --- a/app/code/Magento/GroupedProduct/Test/Unit/Controller/Adminhtml/Edit/PopupTest.php +++ b/app/code/Magento/GroupedProduct/Test/Unit/Controller/Adminhtml/Edit/PopupTest.php @@ -118,7 +118,7 @@ class PopupTest extends \PHPUnit_Framework_TestCase $this->request->expects($this->at(3))->method('getParam')->with('set')->will($this->returnValue($setId)); $this->registry->expects($this->once())->method('register')->with('current_product', $product); - $this->assertSame($this->resultLayoutMock, $this->action->execute()); + $this->assertSame($this->resultLayoutMock, $this->action->executeInternal()); } public function testPopupActionWithProductIdNoSetId() @@ -155,6 +155,6 @@ class PopupTest extends \PHPUnit_Framework_TestCase $this->request->expects($this->at(3))->method('getParam')->with('set')->will($this->returnValue($setId)); $this->registry->expects($this->once())->method('register')->with('current_product', $product); - $this->assertSame($this->resultLayoutMock, $this->action->execute()); + $this->assertSame($this->resultLayoutMock, $this->action->executeInternal()); } } diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php index a223c72ccd190a334da45cb15bd6a51d6b89ff82..343c24d910461acbcc2c9b62eae2089a2b29c69d 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php @@ -37,7 +37,7 @@ class Export extends ExportController * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getPost(ExportModel::FILTER_ELEMENT_GROUP)) { try { diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php index 7e50e5fca3062d7feb807a0a8888ab2502af6c74..81d0aa4a8e3cbb5f1a4701070ea358787d6ea9d4 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php @@ -15,7 +15,7 @@ class GetFilter extends ExportController * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getParams(); if ($this->getRequest()->isXmlHttpRequest() && $data) { diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Index.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Index.php index 9b1a0c3ecbdf5beeae1ed0f02a1752d55020f460..a9f4b02e784555766d3ff16437dfd9b6b2c9d7f4 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Index.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Index.php @@ -15,7 +15,7 @@ class Index extends ExportController * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/History/Download.php b/app/code/Magento/ImportExport/Controller/Adminhtml/History/Download.php index 84d3cb4d59b0a40b9e5a174bb296bdea15c224ab..64ab7b253d8c3fc69a28dea77d8d0bde5b88c5f4 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/History/Download.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/History/Download.php @@ -37,7 +37,7 @@ class Download extends \Magento\ImportExport\Controller\Adminhtml\History * * @return void|\Magento\Backend\App\Action */ - public function execute() + public function executeInternal() { $fileName = $this->getRequest()->getParam('filename'); diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/History/Index.php b/app/code/Magento/ImportExport/Controller/Adminhtml/History/Index.php index 5c88c232807dcf901a109fcd21220d41b815126a..df70dff2a4083b1600ad022c3590866ff09f99ce 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/History/Index.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/History/Index.php @@ -15,7 +15,7 @@ class Index extends HistoryController * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Download.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Download.php index 005a2b0cde1212220c2667c47b8445fdc859c141..240067a4f1ff2585dceb4e1806624e43d786efad 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Download.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Download.php @@ -65,7 +65,7 @@ class Download extends ImportController * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $fileName = $this->getRequest()->getParam('filename') . '.csv'; $moduleDir = $this->reader->getModuleDir('', self::SAMPLE_FILES_MODULE); diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Index.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Index.php index ec4f027d4a9ac8dfc1e57e9f5ae3a43306057da6..6bf064e68694843890523f3a22b8e503658038ee 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Index.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Index.php @@ -15,7 +15,7 @@ class Index extends ImportController * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->messageManager->addNotice( $this->_objectManager->get('Magento\ImportExport\Helper\Data')->getMaxUploadSizeMessage() diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Start.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Start.php index 54c9049bcc91df196cf112062d57a14ccd060962..d58b1a1f81f55d618ab7cd3d44ed8e9cd50b96ae 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Start.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Start.php @@ -38,7 +38,7 @@ class Start extends ImportResultController * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); if ($data) { diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php index 631966a9a40c20c1c7e5d2d440ea36bafc4b6101..bc009302895e1edd477b80bbb9a944a22a564fef 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php @@ -19,7 +19,7 @@ class Validate extends ImportResultController * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); /** @var \Magento\Framework\View\Result\Layout $resultLayout */ diff --git a/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php index e9b684c2bd2a9aeb74dbbc6368c7ff6c0e6b71a5..085c9261e341229fb19bebc078874f87e9dff561 100644 --- a/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php +++ b/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php @@ -792,7 +792,7 @@ abstract class AbstractEntity $emptyHeaderColumns[] = $columnNumber; } elseif (!preg_match('/^[a-z][a-z0-9_]*$/', $columnName)) { $invalidColumns[] = $columnName; - } elseif ($this->needColumnCheck && !in_array($columnName, $this->validColumnNames)) { + } elseif ($this->needColumnCheck && !in_array($columnName, $this->getValidColumnNames())) { $invalidAttributes[] = $columnName; } } @@ -854,4 +854,14 @@ abstract class AbstractEntity $this->countItemsDeleted = count($deleted); return $this; } + + /** + * Retrieve valid column names + * + * @return array + */ + public function getValidColumnNames() + { + return $this->validColumnNames; + } } diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php index 81422c45e13a871f8162a0535802db1cf96a2df5..9a0971d18e1042fea2339d50508d0816e2cbdac9 100644 --- a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php +++ b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php @@ -763,7 +763,7 @@ abstract class AbstractEntity $emptyHeaderColumns[] = $columnNumber; } elseif (!preg_match('/^[a-z][a-z0-9_]*$/', $columnName)) { $invalidColumns[] = $columnName; - } elseif ($this->needColumnCheck && !in_array($columnName, $this->validColumnNames)) { + } elseif ($this->needColumnCheck && !in_array($columnName, $this->getValidColumnNames())) { $invalidAttributes[] = $columnName; } } @@ -818,4 +818,14 @@ abstract class AbstractEntity { return $this->countItemsDeleted; } + + /** + * Retrieve valid column names + * + * @return array + */ + public function getValidColumnNames() + { + return $this->validColumnNames; + } } diff --git a/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/DownloadTest.php b/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/DownloadTest.php index e9661264810d02cd1f870b8efd98db0d09fce623..532cf1d718ae009fe308891080b281f2928101ed 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/DownloadTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/DownloadTest.php @@ -172,7 +172,7 @@ class DownloadTest extends \PHPUnit_Framework_TestCase { $this->reportHelper->expects($this->any())->method('importFileExists')->willReturn(true); $this->resultRaw->expects($this->once())->method('setContents'); - $this->downloadController->execute(); + $this->downloadController->executeInternal(); } /** @@ -182,6 +182,6 @@ class DownloadTest extends \PHPUnit_Framework_TestCase { $this->reportHelper->expects($this->any())->method('importFileExists')->willReturn(false); $this->resultRaw->expects($this->never())->method('setContents'); - $this->downloadController->execute(); + $this->downloadController->executeInternal(); } } diff --git a/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/IndexTest.php b/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/IndexTest.php index 789854701f5875f36e2266b22fe6922149949c5a..aa9adfde2c22f91fe0fee10f895622ce3c43d38d 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/IndexTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Controller/Adminhtml/History/IndexTest.php @@ -75,6 +75,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase */ public function testExecute() { - $this->indexController->execute(); + $this->indexController->executeInternal(); } } diff --git a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/ListAction.php b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/ListAction.php index f76a7d9ca1a9f9a1caf09a9826891daa90b6bef1..f84c939bf9323a1d96e5d7f64a0ce9346956a0f1 100644 --- a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/ListAction.php +++ b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/ListAction.php @@ -13,7 +13,7 @@ class ListAction extends \Magento\Indexer\Controller\Adminhtml\Indexer * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_Indexer::system_index'); diff --git a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php index 1ea64de8b75d606f5659da9ad0698066b7d94307..af4730a66629f130e88449e4436710af81bb3e68 100644 --- a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php +++ b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php @@ -13,7 +13,7 @@ class MassChangelog extends \Magento\Indexer\Controller\Adminhtml\Indexer * * @return void */ - public function execute() + public function executeInternal() { $indexerIds = $this->getRequest()->getParam('indexer_ids'); if (!is_array($indexerIds)) { diff --git a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php index fecf0df7a53d7936dbe11ab55e9d6228bd52b4de..7fe6dd3a60b2a794e67bee16fdb12ec608f7d95e 100644 --- a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php +++ b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php @@ -13,7 +13,7 @@ class MassOnTheFly extends \Magento\Indexer\Controller\Adminhtml\Indexer * * @return void */ - public function execute() + public function executeInternal() { $indexerIds = $this->getRequest()->getParam('indexer_ids'); if (!is_array($indexerIds)) { diff --git a/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/ListActionTest.php b/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/ListActionTest.php index 958125477b992137675feac46d8fe52170e5d8c7..57364ec6060228b13d9510211d399d6d6ec17b0f 100644 --- a/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/ListActionTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/ListActionTest.php @@ -60,6 +60,7 @@ class ListActionTest extends \PHPUnit_Framework_TestCase /** * Set up test + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function setUp() { @@ -200,6 +201,6 @@ class ListActionTest extends \PHPUnit_Framework_TestCase ->method('renderLayout') ->will($this->returnValue(1)); - $this->object->execute(); + $this->object->executeInternal(); } } diff --git a/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassChangelogTest.php b/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassChangelogTest.php index 133a763f8312dc014bd94662bfcd087767c0260e..c08535d27318971ca71485a21cdeb4bd511b1191 100644 --- a/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassChangelogTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassChangelogTest.php @@ -243,7 +243,7 @@ class MassChangelogTest extends \PHPUnit_Framework_TestCase $this->helper->expects($this->any())->method("getUrl")->willReturn("magento.com"); $this->response->expects($this->any())->method("setRedirect")->willReturn(1); - $this->model->execute(); + $this->model->executeInternal(); } /** diff --git a/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassOnTheFlyTest.php b/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassOnTheFlyTest.php index c535ed59f686f9b9c915dc8fb0f8d05815f999d9..8adaf2d07fe9245ee69ee004791df38367277d3c 100644 --- a/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassOnTheFlyTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Controller/Adminhtml/Indexer/MassOnTheFlyTest.php @@ -242,7 +242,7 @@ class MassOnTheFlyTest extends \PHPUnit_Framework_TestCase $this->helper->expects($this->any())->method("getUrl")->willReturn("magento.com"); $this->response->expects($this->any())->method("setRedirect")->willReturn(1); - $this->model->execute(); + $this->model->executeInternal(); } /** diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Delete.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Delete.php index 8771947fce6f31301a79cc78b4d08ea9f9c3ec9a..42409bd208cc07230dcc78a88f28d917872b45d4 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Delete.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Delete.php @@ -17,7 +17,7 @@ class Delete extends \Magento\Integration\Controller\Adminhtml\Integration * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Edit.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Edit.php index db23246d371c35c02276b791aee6565c1f1b1136..6c45010bfb2d06d9c051c0ff16ea5517893a1c86 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Edit.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Edit.php @@ -17,7 +17,7 @@ class Edit extends \Magento\Integration\Controller\Adminhtml\Integration * * @return void */ - public function execute() + public function executeInternal() { /** Try to recover integration data from session if it was added during previous request which failed. */ $integrationId = (int)$this->getRequest()->getParam(self::PARAM_INTEGRATION_ID); diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Grid.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Grid.php index 24b4fc3af40e9a984ac445a6155d13adaaf49a92..e5750479e09fcb59f2d6278b9f6b0d9dbee0f11b 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Grid.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Integration\Controller\Adminhtml\Integration * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Index.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Index.php index aa4411b45986605d9671665b9a3027be8a5a7119..f759279d7f3baa20ccb5aa2b589fd2b0f1bd6be6 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Index.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Integration\Controller\Adminhtml\Integration * * @return void */ - public function execute() + public function executeInternal() { $unsecureIntegrationsCount = $this->_integrationCollection->addUnsecureUrlsFilter()->getSize(); if ($unsecureIntegrationsCount > 0) { diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/LoginSuccessCallback.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/LoginSuccessCallback.php index 7b72344442057760cf3bd644b6d4644427c95a32..befdfbedc848b44477ff6aa7cec0e3e52375de19 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/LoginSuccessCallback.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/LoginSuccessCallback.php @@ -13,7 +13,7 @@ class LoginSuccessCallback extends \Magento\Integration\Controller\Adminhtml\Int * * @return void */ - public function execute() + public function executeInternal() { $this->getResponse()->setBody('<script>setTimeout("self.close()",1000);</script>'); } diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/NewAction.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/NewAction.php index 50a971031872b1a58dc79e2a19e0eb392d193159..2e32315b5e596550b56fc19a98de2be1cccef49b 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/NewAction.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\Integration\Controller\Adminhtml\Integration * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_Integration::system_integrations'); diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/PermissionsDialog.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/PermissionsDialog.php index 50f6302b49c2ba64495aceef0e3bf2d2d8833e14..d8de19f8d96bbd9ba2c4f82d0fdf4cdb945a98c9 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/PermissionsDialog.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/PermissionsDialog.php @@ -15,7 +15,7 @@ class PermissionsDialog extends \Magento\Integration\Controller\Adminhtml\Integr * * @return void */ - public function execute() + public function executeInternal() { $integrationId = (int)$this->getRequest()->getParam(self::PARAM_INTEGRATION_ID); if ($integrationId) { diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Save.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Save.php index 53cccbb46b058d90c5857248c5343df85880c362..d6581e6004dcbf1ba3048c61fa8547600aa7e380 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/Save.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/Save.php @@ -32,7 +32,7 @@ class Save extends \Magento\Integration\Controller\Adminhtml\Integration * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { /** @var array $integrationData */ $integrationData = []; diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensDialog.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensDialog.php index 1dcff4547e3c7f22a3b0c0d1d3b8be3116018966..8ad72835c71aefc72895ac766e8007bf1262f979 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensDialog.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensDialog.php @@ -35,7 +35,7 @@ class TokensDialog extends \Magento\Integration\Controller\Adminhtml\Integration * * @return void */ - public function execute() + public function executeInternal() { try { $integrationId = $this->getRequest()->getParam(self::PARAM_INTEGRATION_ID); diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php index a6ab708350a7b50b24b89dd6af99f4dd80826b7d..a186dc016a795761d89803ec11ca7be12d3b4067 100644 --- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php +++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php @@ -34,7 +34,7 @@ class TokensExchange extends \Magento\Integration\Controller\Adminhtml\Integrati * * @return void */ - public function execute() + public function executeInternal() { try { $integrationId = $this->getRequest()->getParam(self::PARAM_INTEGRATION_ID); diff --git a/app/code/Magento/Integration/Controller/Token/Access.php b/app/code/Magento/Integration/Controller/Token/Access.php index c9c5c7c3124b0544b5ae8eb622c6070cb0267d80..979a63cbbd973dd29e321895fbf2f05300f6f076 100644 --- a/app/code/Magento/Integration/Controller/Token/Access.php +++ b/app/code/Magento/Integration/Controller/Token/Access.php @@ -58,7 +58,7 @@ class Access extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { try { $requestUrl = $this->helper->getRequestUrl($this->getRequest()); diff --git a/app/code/Magento/Integration/Controller/Token/Request.php b/app/code/Magento/Integration/Controller/Token/Request.php index d1ee7d042969b7802ef4d8098d2836b047956f45..be75117d2c489a29051b06cdc13f27dfeb5abbe9 100644 --- a/app/code/Magento/Integration/Controller/Token/Request.php +++ b/app/code/Magento/Integration/Controller/Token/Request.php @@ -38,7 +38,7 @@ class Request extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { try { $requestUrl = $this->helper->getRequestUrl($this->getRequest()); diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/DeleteTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/DeleteTest.php index f31d362287602b2594eb88974556f281eb481bbd..4be5b0c73979e9c7c4dbadf003952ffd032fa4f2 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/DeleteTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/DeleteTest.php @@ -60,7 +60,7 @@ class DeleteTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Int ->method('addSuccess') ->with(__('The integration \'%1\' has been deleted.', $intData[Info::DATA_NAME])); - $this->integrationController->execute(); + $this->integrationController->executeInternal(); } public function testDeleteActionWithConsumer() @@ -89,7 +89,7 @@ class DeleteTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Int ->method('addSuccess') ->with(__('The integration \'%1\' has been deleted.', $intData[Info::DATA_NAME])); - $this->integrationController->execute(); + $this->integrationController->executeInternal(); } public function testDeleteActionConfigSetUp() @@ -117,7 +117,7 @@ class DeleteTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Int // verify success message $this->_messageManager->expects($this->never())->method('addSuccess'); - $this->integrationController->execute(); + $this->integrationController->executeInternal(); } public function testDeleteActionMissingId() @@ -131,7 +131,7 @@ class DeleteTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Int ->method('addError') ->with(__('Integration ID is not specified or is invalid.')); - $this->integrationController->execute(); + $this->integrationController->executeInternal(); } public function testDeleteActionForServiceIntegrationException() @@ -153,7 +153,7 @@ class DeleteTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Int ->willThrowException($invalidIdException); $this->_messageManager->expects($this->once())->method('addError'); - $this->integrationController->execute(); + $this->integrationController->executeInternal(); } public function testDeleteActionForServiceGenericException() @@ -175,6 +175,6 @@ class DeleteTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Int ->willThrowException($invalidIdException); $this->_messageManager->expects($this->never())->method('addError'); - $this->integrationController->execute(); + $this->integrationController->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/EditTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/EditTest.php index 0bd7ab3e4663269734c5a9fabe3adbf0e0b76c7d..e4529c88f5fd13c754508dd8caa23a036992376e 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/EditTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/EditTest.php @@ -53,7 +53,7 @@ class EditTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ ->method('prepend'); $this->_verifyLoadAndRenderLayout(); $controller = $this->_createIntegrationController('Edit'); - $controller->execute(); + $controller->executeInternal(); } public function testEditActionNonExistentIntegration() @@ -81,7 +81,7 @@ class EditTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ ); $this->_verifyLoadAndRenderLayout(); $integrationContr = $this->_createIntegrationController('Edit'); - $integrationContr->execute(); + $integrationContr->executeInternal(); } public function testEditActionNoDataAdd() @@ -91,7 +91,7 @@ class EditTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ $this->_messageManager->expects($this->once())->method('addError')->with($this->equalTo($exceptionMessage)); $this->_verifyLoadAndRenderLayout(); $integrationContr = $this->_createIntegrationController('Edit'); - $integrationContr->execute(); + $integrationContr->executeInternal(); } public function testEditException() @@ -100,6 +100,6 @@ class EditTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ // verify the error $this->_messageManager->expects($this->once())->method('addError')->with($this->equalTo($exceptionMessage)); $this->_controller = $this->_createIntegrationController('Edit'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/IndexTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/IndexTest.php index 8dd1bfd69f535419fe613657c355973b3108d20b..4adf09665751e64eae98f20427d862743bdb6f69 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/IndexTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/IndexTest.php @@ -14,6 +14,6 @@ class IndexTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Inte $this->_verifyLoadAndRenderLayout(); // renderLayout $this->_controller = $this->_createIntegrationController('Index'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/NewActionTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/NewActionTest.php index 013857d809f3bf434fb14bfcfeb21288110f839f..a24b1787a8edd65a439a2de3d778bee1bb0e0502 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/NewActionTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/NewActionTest.php @@ -25,6 +25,6 @@ class NewActionTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\ $this->returnValue($this->_requestMock) ); $integrationContr = $this->_createIntegrationController('NewAction'); - $integrationContr->execute(); + $integrationContr->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/PermissionsDialogTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/PermissionsDialogTest.php index 484267a7296135f2fdb0fea28cdc4b6c06e887d3..28e3c19b0128517ce486df5fa504c95d2400d755 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/PermissionsDialogTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/PermissionsDialogTest.php @@ -72,6 +72,6 @@ HANDLE; $this->equalTo(['adminhtml_integration_activate_permissions_webapi']) ); - $controller->execute(); + $controller->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/SaveTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/SaveTest.php index d29767e6091b2b1c86647e2ec61cbc6aaeefbafe..68526871593995f79ee9b218d752ee5c0807f698 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/SaveTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/SaveTest.php @@ -59,7 +59,7 @@ class SaveTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ __('The integration \'%1\' has been saved.', $intData[Info::DATA_NAME]) ); $integrationContr = $this->_createIntegrationController('Save'); - $integrationContr->execute(); + $integrationContr->executeInternal(); } public function testSaveActionException() @@ -80,7 +80,7 @@ class SaveTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ // Verify error $this->_messageManager->expects($this->once())->method('addError')->with($this->equalTo($exceptionMessage)); $integrationContr = $this->_createIntegrationController('Save'); - $integrationContr->execute(); + $integrationContr->executeInternal(); } public function testSaveActionIntegrationException() @@ -101,7 +101,7 @@ class SaveTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ // Verify error $this->_messageManager->expects($this->once())->method('addError')->with($this->equalTo($exceptionMessage)); $integrationContr = $this->_createIntegrationController('Save'); - $integrationContr->execute(); + $integrationContr->executeInternal(); } public function testSaveActionNew() @@ -146,7 +146,7 @@ class SaveTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ __('The integration \'%1\' has been saved.', $integration->getName()) ); $integrationContr = $this->_createIntegrationController('Save'); - $integrationContr->execute(); + $integrationContr->executeInternal(); } public function testSaveActionExceptionDuringServiceCreation() @@ -186,6 +186,6 @@ class SaveTest extends \Magento\Integration\Test\Unit\Controller\Adminhtml\Integ // Verify success message $this->_messageManager->expects($this->once())->method('addError')->with($exceptionMessage); $integrationController = $this->_createIntegrationController('Save'); - $integrationController->execute(); + $integrationController->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/TokensDialogTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/TokensDialogTest.php index cb7b484f40be5936bf066d89ee00552dd702a440..3db548316f5bdb2ecc51251c90139d7ed799cd3b 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/TokensDialogTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Adminhtml/Integration/TokensDialogTest.php @@ -48,7 +48,7 @@ class TokensDialogTest extends \Magento\Integration\Test\Unit\Controller\Adminht $this->_viewMock->expects($this->any())->method('loadLayout'); $this->_viewMock->expects($this->any())->method('renderLayout'); - $controller->execute(); + $controller->executeInternal(); } public function testTokensExchangeReauthorize() @@ -95,6 +95,6 @@ class TokensDialogTest extends \Magento\Integration\Test\Unit\Controller\Adminht $this->_responseMock->expects($this->once())->method('getBody'); $this->_responseMock->expects($this->once())->method('representJson'); - $controller->execute(); + $controller->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Token/AccessTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Token/AccessTest.php index 121db1fb723574a8fb71dc0d646d8777a4ce0240..140000c8bfc5dea9788a4fc6369ff1c712544571 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Token/AccessTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Token/AccessTest.php @@ -178,6 +178,6 @@ class AccessTest extends \PHPUnit_Framework_TestCase $this->response->expects($this->once()) ->method('setBody'); - $this->accessAction->execute(); + $this->accessAction->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Controller/Token/RequestTest.php b/app/code/Magento/Integration/Test/Unit/Controller/Token/RequestTest.php index f387829278f90232f85982ccb6446bcdba3dabf8..275e30191f0efaf63c09d7e96863caed27a47ede 100644 --- a/app/code/Magento/Integration/Test/Unit/Controller/Token/RequestTest.php +++ b/app/code/Magento/Integration/Test/Unit/Controller/Token/RequestTest.php @@ -142,6 +142,6 @@ class RequestTest extends \PHPUnit_Framework_TestCase ->willReturn(['response']); $this->response->expects($this->once()) ->method('setBody'); - $this->requestAction->execute(); + $this->requestAction->executeInternal(); } } diff --git a/app/code/Magento/Integration/Test/Unit/Model/Config/Integration/XsdTest.php b/app/code/Magento/Integration/Test/Unit/Model/Config/Integration/XsdTest.php index 5413ec66a33b1bceb05b1d50f0283acf3c74461f..e3988ecdbb15676eb9a7633c7a0f22f68b6c201e 100644 --- a/app/code/Magento/Integration/Test/Unit/Model/Config/Integration/XsdTest.php +++ b/app/code/Magento/Integration/Test/Unit/Model/Config/Integration/XsdTest.php @@ -30,8 +30,11 @@ class XsdTest extends \PHPUnit_Framework_TestCase */ public function testExemplarXml($fixtureXml, array $expectedErrors) { + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); $messageFormat = '%message%'; - $dom = new \Magento\Framework\Config\Dom($fixtureXml, [], null, null, $messageFormat); + $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, $messageFormat); $actualResult = $dom->validate($this->_schemaFile, $actualErrors); $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid."); $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match."); diff --git a/app/code/Magento/Integration/Test/Unit/Model/Config/XsdTest.php b/app/code/Magento/Integration/Test/Unit/Model/Config/XsdTest.php index 8e1c4195a34a643fa08c516e3e8bea7006d2ed0b..ee833328e24c15dec849ab406df3c61c147872dc 100644 --- a/app/code/Magento/Integration/Test/Unit/Model/Config/XsdTest.php +++ b/app/code/Magento/Integration/Test/Unit/Model/Config/XsdTest.php @@ -30,8 +30,11 @@ class XsdTest extends \PHPUnit_Framework_TestCase */ public function testExemplarXml($fixtureXml, array $expectedErrors) { + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); $messageFormat = '%message%'; - $dom = new \Magento\Framework\Config\Dom($fixtureXml, [], null, null, $messageFormat); + $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, $messageFormat); $actualResult = $dom->validate($this->_schemaFile, $actualErrors); $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid."); $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match."); diff --git a/app/code/Magento/LayeredNavigation/view/frontend/layout/2columns-right.xml b/app/code/Magento/LayeredNavigation/view/frontend/layout/2columns-right.xml deleted file mode 100644 index 5e8b8e338716d710d43d7859a77557443cb0662e..0000000000000000000000000000000000000000 --- a/app/code/Magento/LayeredNavigation/view/frontend/layout/2columns-right.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="All Two-Column Layout Pages (Right Column)" design_abstraction="page_layout"> - <body> - <move element="catalog.leftnav" destination="sidebar.main" before="-"/> - </body> -</page> diff --git a/app/code/Magento/LayeredNavigation/view/frontend/layout/page_empty.xml b/app/code/Magento/LayeredNavigation/view/frontend/layout/page_empty.xml deleted file mode 100644 index aaf387bdfdea016140bcf8e179ddd1174013d721..0000000000000000000000000000000000000000 --- a/app/code/Magento/LayeredNavigation/view/frontend/layout/page_empty.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="All Empty Layout Pages" design_abstraction="page_layout"> - <body> - <move element="catalog.leftnav" destination="category.product.list.additional" before="-"/> - </body> -</page> diff --git a/app/code/Magento/LayeredNavigation/view/frontend/page_layout/1column.xml b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/1column.xml new file mode 100644 index 0000000000000000000000000000000000000000..d35beff77e8b896b26611c0cf123e88e1bcf4919 --- /dev/null +++ b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/1column.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> + <move element="catalog.leftnav" destination="content.top" after="-"/> +</layout> diff --git a/app/code/Magento/LayeredNavigation/view/frontend/page_layout/2columns-left.xml b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/2columns-left.xml new file mode 100644 index 0000000000000000000000000000000000000000..94286e3cd4d3ea68ea42680dffa5cf51eff52af2 --- /dev/null +++ b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/2columns-left.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> + <move element="catalog.leftnav" destination="sidebar.main" before="-"/> +</layout> diff --git a/app/code/Magento/LayeredNavigation/view/frontend/page_layout/2columns-right.xml b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/2columns-right.xml new file mode 100644 index 0000000000000000000000000000000000000000..94286e3cd4d3ea68ea42680dffa5cf51eff52af2 --- /dev/null +++ b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/2columns-right.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> + <move element="catalog.leftnav" destination="sidebar.main" before="-"/> +</layout> diff --git a/app/code/Magento/LayeredNavigation/view/frontend/page_layout/3columns.xml b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/3columns.xml new file mode 100644 index 0000000000000000000000000000000000000000..94286e3cd4d3ea68ea42680dffa5cf51eff52af2 --- /dev/null +++ b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/3columns.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> + <move element="catalog.leftnav" destination="sidebar.main" before="-"/> +</layout> diff --git a/app/code/Magento/LayeredNavigation/view/frontend/page_layout/empty.xml b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/empty.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a45bb383141099dd4d367120ecfe131c77fa4c7 --- /dev/null +++ b/app/code/Magento/LayeredNavigation/view/frontend/page_layout/empty.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd"> + <move element="catalog.leftnav" destination="category.product.list.additional" before="-"/> +</layout> diff --git a/app/code/Magento/Marketplace/Controller/Adminhtml/Index/Index.php b/app/code/Magento/Marketplace/Controller/Adminhtml/Index/Index.php index 8ce0b1b3c10cd9108716a423dba424fc0aa67197..f808bbbc3f87559ff48ebe45b2bc18820c260836 100644 --- a/app/code/Magento/Marketplace/Controller/Adminhtml/Index/Index.php +++ b/app/code/Magento/Marketplace/Controller/Adminhtml/Index/Index.php @@ -28,7 +28,7 @@ class Index extends \Magento\Marketplace\Controller\Adminhtml\Index /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->getResultPageFactory()->create(); diff --git a/app/code/Magento/Marketplace/Controller/Adminhtml/Partners/Index.php b/app/code/Magento/Marketplace/Controller/Adminhtml/Partners/Index.php index 774f80491b17fb8d89ce25f0cf2ea8bc4afe56fc..f1657b4c1826dc92c1f182406e8df04cec39e924 100644 --- a/app/code/Magento/Marketplace/Controller/Adminhtml/Partners/Index.php +++ b/app/code/Magento/Marketplace/Controller/Adminhtml/Partners/Index.php @@ -33,7 +33,7 @@ class Index extends \Magento\Marketplace\Controller\Adminhtml\Partners /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { if ($this->getRequest()->isAjax()) { $output = $this->getLayoutFactory()->create() diff --git a/app/code/Magento/Marketplace/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Marketplace/Test/Unit/Controller/Index/IndexTest.php index 4983cd76e0f448d6d974c84dc262981ae77837dc..ebb9386d3ef52a60ea6fe0279d339e9cd561b908 100644 --- a/app/code/Magento/Marketplace/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Marketplace/Test/Unit/Controller/Index/IndexTest.php @@ -19,7 +19,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Marketplace\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Marketplace\Controller\Adminhtml\Index\Index::executeInternal */ public function testExecute() { @@ -50,7 +50,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->method('getConfig') ->will($this->returnValue($configMock)); - $this->indexControllerMock->execute(); + $this->indexControllerMock->executeInternal(); } /** diff --git a/app/code/Magento/Marketplace/Test/Unit/Controller/Partners/IndexTest.php b/app/code/Magento/Marketplace/Test/Unit/Controller/Partners/IndexTest.php index 2a9538a1bb7feb032b803c3e08f83a2dbb600be4..c285f31c9958ddba825e687cf791a6ae09ffd2ca 100644 --- a/app/code/Magento/Marketplace/Test/Unit/Controller/Partners/IndexTest.php +++ b/app/code/Magento/Marketplace/Test/Unit/Controller/Partners/IndexTest.php @@ -25,7 +25,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Marketplace\Controller\Adminhtml\Partners\Index::execute + * @covers \Magento\Marketplace\Controller\Adminhtml\Partners\Index::executeInternal */ public function testExecute() { @@ -65,7 +65,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->method('getResponse') ->will($this->returnValue($responseMock)); - $this->partnersControllerMock->execute(); + $this->partnersControllerMock->executeInternal(); } /** diff --git a/app/code/Magento/Marketplace/i18n/de_DE.csv b/app/code/Magento/Marketplace/i18n/de_DE.csv new file mode 100644 index 0000000000000000000000000000000000000000..e0a266e1291f3390c5baee7087ada17c1bcdf28a --- /dev/null +++ b/app/code/Magento/Marketplace/i18n/de_DE.csv @@ -0,0 +1 @@ +"Find Partners & Extensions","Find Partners & Extensions" diff --git a/app/code/Magento/Marketplace/i18n/en_US.csv b/app/code/Magento/Marketplace/i18n/en_US.csv new file mode 100644 index 0000000000000000000000000000000000000000..8c1698ba3b1abe8ad5120033d8d2b25e56502596 --- /dev/null +++ b/app/code/Magento/Marketplace/i18n/en_US.csv @@ -0,0 +1,13 @@ +"Platinum Partners","Platinum Partners" +"Representing Magento's highest level of partner engagement, Magento Platinum Partners have established themselves as leaders and innovators of key products and services designed to help merchants and brands grow their business. Magento reserves the Platinum level for select trusted partners that are committed to offering integrations of commerce features, functions, and tools, as well as back-end systems and operations, to extend and enhance the power of the Magento commerce platform.","Representing Magento's highest level of partner engagement, Magento Platinum Partners have established themselves as leaders and innovators of key products and services designed to help merchants and brands grow their business. Magento reserves the Platinum level for select trusted partners that are committed to offering integrations of commerce features, functions, and tools, as well as back-end systems and operations, to extend and enhance the power of the Magento commerce platform." +"Featured Platinum Partners","Featured Platinum Partners" +"Partner search","Partner search" +"Magento has a thriving ecosystem of technology partners to help merchants and brands deliver the best possible customer experiences. They are recognized as experts in eCommerce, search, email marketing, payments, tax, fraud, optimization and analytics, fulfillment, and more. Visit the Magento Partner Directory to see all of our trusted partners.","Magento has a thriving ecosystem of technology partners to help merchants and brands deliver the best possible customer experiences. They are recognized as experts in eCommerce, search, email marketing, payments, tax, fraud, optimization and analytics, fulfillment, and more. Visit the Magento Partner Directory to see all of our trusted partners." +"More Partners","More Partners" +"Magento Marketplace","Magento Marketplace" +"Extensions and Themes are an essential component of the Magento Ecosystem. Please visit the Magento Marketplace to see the latest innovations that developers have created to enhance your Magento Store.","Extensions and Themes are an essential component of the Magento Ecosystem. Please visit the Magento Marketplace to see the latest innovations that developers have created to enhance your Magento Store." +"Visit Magento Marketplaces","Visit Magento Marketplaces" +"Read More","Read More" +"Partner Page","Partner Page" +"No partners were found","No partners were found" +"Find Partners & Extensions","Find Partners & Extensions" diff --git a/app/code/Magento/Marketplace/i18n/es_ES.csv b/app/code/Magento/Marketplace/i18n/es_ES.csv new file mode 100644 index 0000000000000000000000000000000000000000..e0a266e1291f3390c5baee7087ada17c1bcdf28a --- /dev/null +++ b/app/code/Magento/Marketplace/i18n/es_ES.csv @@ -0,0 +1 @@ +"Find Partners & Extensions","Find Partners & Extensions" diff --git a/app/code/Magento/Marketplace/i18n/fr_FR.csv b/app/code/Magento/Marketplace/i18n/fr_FR.csv new file mode 100644 index 0000000000000000000000000000000000000000..e0a266e1291f3390c5baee7087ada17c1bcdf28a --- /dev/null +++ b/app/code/Magento/Marketplace/i18n/fr_FR.csv @@ -0,0 +1 @@ +"Find Partners & Extensions","Find Partners & Extensions" diff --git a/app/code/Magento/Marketplace/i18n/nl_NL.csv b/app/code/Magento/Marketplace/i18n/nl_NL.csv new file mode 100644 index 0000000000000000000000000000000000000000..e0a266e1291f3390c5baee7087ada17c1bcdf28a --- /dev/null +++ b/app/code/Magento/Marketplace/i18n/nl_NL.csv @@ -0,0 +1 @@ +"Find Partners & Extensions","Find Partners & Extensions" diff --git a/app/code/Magento/Marketplace/i18n/pt_BR.csv b/app/code/Magento/Marketplace/i18n/pt_BR.csv new file mode 100644 index 0000000000000000000000000000000000000000..e0a266e1291f3390c5baee7087ada17c1bcdf28a --- /dev/null +++ b/app/code/Magento/Marketplace/i18n/pt_BR.csv @@ -0,0 +1 @@ +"Find Partners & Extensions","Find Partners & Extensions" diff --git a/app/code/Magento/Marketplace/i18n/zh_Hans_CN.csv b/app/code/Magento/Marketplace/i18n/zh_Hans_CN.csv new file mode 100644 index 0000000000000000000000000000000000000000..e0a266e1291f3390c5baee7087ada17c1bcdf28a --- /dev/null +++ b/app/code/Magento/Marketplace/i18n/zh_Hans_CN.csv @@ -0,0 +1 @@ +"Find Partners & Extensions","Find Partners & Extensions" diff --git a/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml b/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml index 53c60cf1d7a00bebac89179f49548b916811f8eb..4a2301057c6e576896001027351e90fc5a15b77f 100644 --- a/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml +++ b/app/code/Magento/Marketplace/view/adminhtml/templates/index.phtml @@ -3,21 +3,20 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ + +// @codingStandardsIgnoreFile ?> <section class="page-partners"> - <h2 class="page-sub-title">Platinum Partners</h2> + <h2 class="page-sub-title"><?php /* @escapeNotVerified */ echo __('Platinum Partners'); ?></h2> <p class="partners-description"> - Representing Magento's highest level of partner engagement, - Magento Platinum Partners have established themselves as - leaders and innovators of key products and services designed - to help merchants and brands grow their business. Magento - reserves the Platinum level for select trusted partners that - are committed to offering integrations of commerce features, - functions, and tools, as well as back-end systems and operations, - to extend and enhance the power of the Magento commerce platform. + <?php /* @escapeNotVerified */ + echo __( + 'Representing Magento\'s highest level of partner engagement, Magento Platinum Partners have established themselves as leaders and innovators of key products and services designed to help merchants and brands grow their business. ' . + 'Magento reserves the Platinum level for select trusted partners that are committed to offering integrations of commerce features, functions, and tools, as well as back-end systems and operations, to extend and enhance the power of the Magento commerce platform.' + ); ?> </p> - <h3 class="page-sub-sub-title">Featured Platinum Partners</h3> + <h3 class="page-sub-sub-title"><?php /* @escapeNotVerified */ echo __('Featured Platinum Partners'); ?></h3> <div data-role="partners-block"> <div data-role="spinner" class="admin__data-grid-loading-mask" data-bind="visible: loading"> <div class="spinner"> @@ -30,19 +29,18 @@ <div class="row row-gutter partners-footer"> <div class="col-m-5"> <div class="partners-search"> - <h2 class="page-sub-title">Partner search</h2> + <h2 class="page-sub-title"><?php /* @escapeNotVerified */ echo __('Partner search'); ?></h2> <p> - Magento has a thriving ecosystem of technology partners to - help merchants and brands deliver the best possible - customer experiences. They are recognized as experts in - eCommerce, search, email marketing, payments, tax, - fraud, optimization and analytics, fulfillment, and more. - Visit the Magento Partner Directory to see all of - our trusted partners. + <?php /* @escapeNotVerified */ + echo __( + 'Magento has a thriving ecosystem of technology partners to help merchants and brands deliver the best possible customer experiences. ' . + 'They are recognized as experts in eCommerce, search, email marketing, payments, tax, fraud, optimization and analytics, fulfillment, and more. ' . + 'Visit the Magento Partner Directory to see all of our trusted partners.' + ); ?> </p> <a class="action-secondary" target="_blank" href="http://partners.magento.com/partner_locator/search.aspx"> - More Partners + <?php /* @escapeNotVerified */ echo __('More Partners'); ?> </a> </div> </div> @@ -55,16 +53,16 @@ alt="Partner"/> </div> <div class="col-m-4"> - <h2 class="page-sub-title">Magento Marketplace</h2> + <h2 class="page-sub-title"><?php /* @escapeNotVerified */ echo __('Magento Marketplace'); ?></h2> <p class="partner-description"> - Extensions and Themes are an essential component of the Magento - Ecosystem. Please visit the Magento Marketplace - to see the latest innovations that developers - have created to enhance your Magento Store. + <?php /* @escapeNotVerified */ echo __( + 'Extensions and Themes are an essential component of the Magento Ecosystem. ' . + 'Please visit the Magento Marketplace to see the latest innovations that developers have created to enhance your Magento Store.' + ); ?> </p> <a class="action-secondary" target="_blank" href="http://www.magentocommerce.com/magento-connect/"> - Visit Magento Marketplaces + <?php /* @escapeNotVerified */ echo __('Visit Magento Marketplaces'); ?> </a> </div> </div> diff --git a/app/code/Magento/Marketplace/view/adminhtml/templates/partners.phtml b/app/code/Magento/Marketplace/view/adminhtml/templates/partners.phtml index ae31e3005513a88478cae04b1435f00616856ad3..7787b9d33a47da2879d700d15aeb0ddd657409f9 100644 --- a/app/code/Magento/Marketplace/view/adminhtml/templates/partners.phtml +++ b/app/code/Magento/Marketplace/view/adminhtml/templates/partners.phtml @@ -23,11 +23,11 @@ $partners = $block->getPartners(); <?php echo $block->escapeHtml($partner['description']);?> <br /> <a href="<?php echo $block->escapeHtml($partner['url_page']);?>" target="_blank"> - Read More + <?php /* @escapeNotVerified */ echo __('Read More'); ?> </a> <br /> <a href="<?php echo $block->escapeHtml($partner['url_partner_page']);?>" target="_blank"> - Partner Page + <?php /* @escapeNotVerified */ echo __('Partner Page'); ?> </a> </p> </div> @@ -35,6 +35,6 @@ $partners = $block->getPartners(); </div> <?php else : ?> <p> - No partners were found + <?php /* @escapeNotVerified */ echo __('No partners were found'); ?> </p> <?php endif; ?> diff --git a/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Status.php b/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Status.php index 3d2b755575ad00c7391ba92af82e10b33b958cec..469da98b91fa2e46e148e9de537eab8d820b277f 100644 --- a/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Status.php +++ b/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Status.php @@ -31,7 +31,7 @@ class Status extends \Magento\MediaStorage\Controller\Adminhtml\System\Config\Sy * @return \Magento\Framework\Controller\Result\Json * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { $result = []; $flag = $this->_getSyncFlag(); diff --git a/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Synchronize.php b/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Synchronize.php index 5078929270609b916be3629bf7ad551f075cb5a0..af0239448f9db8ed30f5d5085211cac092f36451 100644 --- a/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Synchronize.php +++ b/app/code/Magento/MediaStorage/Controller/Adminhtml/System/Config/System/Storage/Synchronize.php @@ -13,7 +13,7 @@ class Synchronize extends \Magento\MediaStorage\Controller\Adminhtml\System\Conf * * @return void */ - public function execute() + public function executeInternal() { session_write_close(); diff --git a/app/code/Magento/MediaStorage/Model/Config/Backend/Storage/Media/Database.php b/app/code/Magento/MediaStorage/Model/Config/Backend/Storage/Media/Database.php index 7bd243fd0ac2fb2f365ce97144d873e67a5485c0..f5f367e40eba786ab376d90da7f47c1115ee6835 100644 --- a/app/code/Magento/MediaStorage/Model/Config/Backend/Storage/Media/Database.php +++ b/app/code/Magento/MediaStorage/Model/Config/Backend/Storage/Media/Database.php @@ -18,6 +18,7 @@ class Database extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\MediaStorage\Helper\File\Storage $coreFileStorage * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -27,13 +28,14 @@ class Database extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\MediaStorage\Helper\File\Storage $coreFileStorage, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_coreFileStorage = $coreFileStorage; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -46,6 +48,6 @@ class Database extends \Magento\Framework\App\Config\Value $helper = $this->_coreFileStorage; $helper->getStorageModel(null, ['init' => true]); - return $this; + return parent::afterSave(); } } diff --git a/app/code/Magento/Msrp/Setup/InstallData.php b/app/code/Magento/Msrp/Setup/InstallData.php index 080637c88e3df7da85327e194280bc846456c310..e9e76b117c11a595f469de231d72503eceb01b0c 100644 --- a/app/code/Magento/Msrp/Setup/InstallData.php +++ b/app/code/Magento/Msrp/Setup/InstallData.php @@ -60,7 +60,7 @@ class InstallData implements InstallDataInterface 'label' => 'Manufacturer\'s Suggested Retail Price', 'type' => 'decimal', 'input' => 'price', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'visible' => true, 'required' => false, 'user_defined' => false, @@ -86,7 +86,7 @@ class InstallData implements InstallDataInterface 'input' => 'select', 'source' => 'Magento\Msrp\Model\Product\Attribute\Source\Type\Price', 'source_model' => 'Magento\Msrp\Model\Product\Attribute\Source\Type\Price', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'visible' => true, 'required' => false, 'user_defined' => false, diff --git a/app/code/Magento/Multishipping/Controller/Checkout.php b/app/code/Magento/Multishipping/Controller/Checkout.php index f6b391b0d89bb8684abff322b96757d47f70f46e..1940acf759573ec76b0f371c4386b9c4a2fab34d 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout.php +++ b/app/code/Magento/Multishipping/Controller/Checkout.php @@ -86,11 +86,11 @@ abstract class Checkout extends \Magento\Checkout\Controller\Action implements * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $this->_request = $request; if ($this->_actionFlag->get('', 'redirectLogin')) { - return parent::dispatch($request); + return parent::execute($request); } $action = $request->getActionName(); @@ -109,7 +109,7 @@ abstract class Checkout extends \Magento\Checkout\Controller\Action implements ) { $this->_redirect('*/*/index'); $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); - return parent::dispatch($request); + return parent::execute($request); } if (!in_array($action, ['login', 'register'])) { @@ -123,7 +123,7 @@ abstract class Checkout extends \Magento\Checkout\Controller\Action implements $this->messageManager->addError($error); $this->getResponse()->setRedirect($this->_getHelper()->getCartUrl()); $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); - return parent::dispatch($request); + return parent::execute($request); } } @@ -142,11 +142,11 @@ abstract class Checkout extends \Magento\Checkout\Controller\Action implements ) { $this->getResponse()->setRedirect($this->_getHelper()->getCartUrl()); $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); - return parent::dispatch($request); + return parent::execute($request); } if ($action == 'success' && $this->_getCheckout()->getCheckoutSession()->getDisplaySuccess(true)) { - return parent::dispatch($request); + return parent::execute($request); } $quote = $this->_getCheckout()->getQuote(); @@ -155,7 +155,7 @@ abstract class Checkout extends \Magento\Checkout\Controller\Action implements $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address.php b/app/code/Magento/Multishipping/Controller/Checkout/Address.php index 41f7377c58773c8cd2ef159f590b64de486704a8..ee525003fa7c5d751959ed05a9108df08193ee9b 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address.php @@ -13,12 +13,12 @@ abstract class Address extends \Magento\Framework\App\Action\Action /** * {@inheritdoc} */ - public function dispatch(\Magento\Framework\App\RequestInterface $request) + public function execute(\Magento\Framework\App\RequestInterface $request) { if (!$this->_getCheckout()->getCustomer()->getId()) { return $this->_redirect('customer/account/login'); } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditAddress.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditAddress.php index 724226b2e27ce32d924d537a6124f53416871dbe..919c55c2cc8a7e6ce39ef1753dc0178d5903daae 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditAddress.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditAddress.php @@ -11,7 +11,7 @@ class EditAddress extends \Magento\Multishipping\Controller\Checkout\Address /** * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); if ($addressForm = $this->_view->getLayout()->getBlock('customer_address_edit')) { diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditBilling.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditBilling.php index eaa98e4e7c403333220c5e9573bcdb984dd497e9..df532c5384b5a62c21e68e7a0b7557f2d1be869f 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditBilling.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditBilling.php @@ -11,7 +11,7 @@ class EditBilling extends \Magento\Multishipping\Controller\Checkout\Address /** * @return void */ - public function execute() + public function executeInternal() { $this->_getState()->setActiveStep( \Magento\Multishipping\Model\Checkout\Type\Multishipping\State::STEP_BILLING diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShipping.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShipping.php index 8409ed59f3687933c06c098808670e64800d2e23..3d9c8ada633ccb198abb989e382106bdf1cec267 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShipping.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShipping.php @@ -11,7 +11,7 @@ class EditShipping extends \Magento\Multishipping\Controller\Checkout\Address /** * @return void */ - public function execute() + public function executeInternal() { $this->_getState()->setActiveStep( \Magento\Multishipping\Model\Checkout\Type\Multishipping\State::STEP_SHIPPING diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShippingPost.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShippingPost.php index ff73e374f39dbcd12a5799de4861e59e0170176e..bf62a2dbb56eb02770a6baf442899bf842ce128f 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShippingPost.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/EditShippingPost.php @@ -11,7 +11,7 @@ class EditShippingPost extends \Magento\Multishipping\Controller\Checkout\Addres /** * @return void */ - public function execute() + public function executeInternal() { if ($addressId = $this->getRequest()->getParam('id')) { $this->_objectManager->create( diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/NewBilling.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/NewBilling.php index 23b209b60b4790baf03475b85a283a68c164a9bc..7f7293bdf9929d4287283a941a62baa5c60deac1 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/NewBilling.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/NewBilling.php @@ -11,7 +11,7 @@ class NewBilling extends \Magento\Multishipping\Controller\Checkout\Address /** * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); if ($addressForm = $this->_view->getLayout()->getBlock('customer_address_edit')) { diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/NewShipping.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/NewShipping.php index 1a05f9cc46cf42746740e621d8ab0e859ca46df8..a0a69c2a216489c2304c1ef3818b7a1ff89d9faf 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/NewShipping.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/NewShipping.php @@ -13,7 +13,7 @@ class NewShipping extends \Magento\Multishipping\Controller\Checkout\Address * * @return void */ - public function execute() + public function executeInternal() { $this->_getState()->setActiveStep( \Magento\Multishipping\Model\Checkout\Type\Multishipping\State::STEP_SELECT_ADDRESSES diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/SaveBilling.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/SaveBilling.php index f19e427f14b4c57800b50bba459a067fefe59e2c..6e254071ee03765ffc1c982b8e68299587e6adc8 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/SaveBilling.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/SaveBilling.php @@ -11,7 +11,7 @@ class SaveBilling extends \Magento\Multishipping\Controller\Checkout\Address /** * @return void */ - public function execute() + public function executeInternal() { if ($addressId = $this->getRequest()->getParam('id')) { $this->_objectManager->create( diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/SelectBilling.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/SelectBilling.php index a64e877d586829c52d3e31f4d54b80f26fea59ca..cb7a1216760d16183f593a0538d5729a1cde1d3f 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/SelectBilling.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/SelectBilling.php @@ -11,7 +11,7 @@ class SelectBilling extends \Magento\Multishipping\Controller\Checkout\Address /** * @return void */ - public function execute() + public function executeInternal() { $this->_getState()->setActiveStep( \Magento\Multishipping\Model\Checkout\Type\Multishipping\State::STEP_BILLING diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/SetBilling.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/SetBilling.php index 4781ff1fd8d8a1178825a73131e4d2512b8248bf..60cf5d6988785c453911b69964799989a94e24ce 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/SetBilling.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/SetBilling.php @@ -11,7 +11,7 @@ class SetBilling extends \Magento\Multishipping\Controller\Checkout\Address /** * @return void */ - public function execute() + public function executeInternal() { if ($addressId = $this->getRequest()->getParam('id')) { $this->_objectManager->create( diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Address/ShippingSaved.php b/app/code/Magento/Multishipping/Controller/Checkout/Address/ShippingSaved.php index 01187fce181844787daf0f8ce7f1c5080a98393f..dc301de3eb29c6d8d8bb002ab532fdd671ee01d4 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Address/ShippingSaved.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Address/ShippingSaved.php @@ -56,7 +56,7 @@ class ShippingSaved extends Address /** * @return void */ - public function execute() + public function executeInternal() { $filter = $this->filterBuilder->setField('parent_id')->setValue($this->_getCheckout()->getCustomer()->getId()) ->setConditionType('eq')->create(); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Addresses.php b/app/code/Magento/Multishipping/Controller/Checkout/Addresses.php index 38ae81fadc81d58a6faaa36603b88e508792a26a..477ca6dbf2a0d6b394e5c9e2abe0c13e2d68aded 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Addresses.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Addresses.php @@ -15,7 +15,7 @@ class Addresses extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { // If customer do not have addresses if (!$this->_getCheckout()->getCustomerDefaultShippingAddress()) { diff --git a/app/code/Magento/Multishipping/Controller/Checkout/AddressesPost.php b/app/code/Magento/Multishipping/Controller/Checkout/AddressesPost.php index e78d126f413901498792e1c4c56fc2ab0d66e362..f6c74959e4108cc3df9ececccaef7ba02bef43e6 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/AddressesPost.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/AddressesPost.php @@ -15,7 +15,7 @@ class AddressesPost extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { if (!$this->_getCheckout()->getCustomerDefaultShippingAddress()) { $this->_redirect('*/checkout_address/newShipping'); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/BackToAddresses.php b/app/code/Magento/Multishipping/Controller/Checkout/BackToAddresses.php index 9f9e2352e3a3284c7085cd00869a12ebfc73cce6..82a1ecce2b0c4d60161d92dd0f071bc93bdb36b9 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/BackToAddresses.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/BackToAddresses.php @@ -13,7 +13,7 @@ class BackToAddresses extends \Magento\Multishipping\Controller\Checkout /** * @return void */ - public function execute() + public function executeInternal() { $this->_getState()->setActiveStep(State::STEP_SELECT_ADDRESSES); $this->_getState()->unsCompleteStep(State::STEP_SHIPPING); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/BackToBilling.php b/app/code/Magento/Multishipping/Controller/Checkout/BackToBilling.php index 49c98834c679511095da5fb5f72088622dccda94..d2db0277429d71c4e59f7e01ccb8c2faf87cb906 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/BackToBilling.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/BackToBilling.php @@ -15,7 +15,7 @@ class BackToBilling extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { $this->_getState()->setActiveStep(State::STEP_BILLING); $this->_getState()->unsCompleteStep(State::STEP_OVERVIEW); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/BackToShipping.php b/app/code/Magento/Multishipping/Controller/Checkout/BackToShipping.php index dddf2dab0b8708c15b557c6a5843b818cacf35e9..2bc68f69ee2378ecb813f04a9ca5d30618ac753d 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/BackToShipping.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/BackToShipping.php @@ -13,7 +13,7 @@ class BackToShipping extends \Magento\Multishipping\Controller\Checkout /** * @return void */ - public function execute() + public function executeInternal() { $this->_getState()->setActiveStep(State::STEP_SHIPPING); $this->_getState()->unsCompleteStep(State::STEP_BILLING); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Billing.php b/app/code/Magento/Multishipping/Controller/Checkout/Billing.php index 0f3d9a0103c8516f6e5f52e5563aa6945d7bddb6..7ca829db580abd6aa9785cc6fcd08966affdaa6d 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Billing.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Billing.php @@ -30,7 +30,7 @@ class Billing extends \Magento\Multishipping\Controller\Checkout * * @return void|ResponseInterface */ - public function execute() + public function executeInternal() { if (!$this->_validateBilling()) { return; diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Index.php b/app/code/Magento/Multishipping/Controller/Checkout/Index.php index c71c54ca8e241979257c7713f06b34403675e0f8..03607155b8769470ccb05cb048b10f674111871f 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Index.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { $this->_getCheckoutSession()->setCartWasUpdated(false); $this->_redirect('*/*/addresses'); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Login.php b/app/code/Magento/Multishipping/Controller/Checkout/Login.php index 8b68c678010deb19e42260173dbfc2aa326dc708..4c68fd50819c5c701f560d3473572eebf70da924 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Login.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Login.php @@ -13,7 +13,7 @@ class Login extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { if ($this->_objectManager->get('Magento\Customer\Model\Session')->isLoggedIn()) { $this->_redirect('*/*/'); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Overview.php b/app/code/Magento/Multishipping/Controller/Checkout/Overview.php index 9ab19c70889d283f78650c99a4e4228b24204271..cb693c019ffff5affee75dc7f2679be8ddd30e86 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Overview.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Overview.php @@ -15,7 +15,7 @@ class Overview extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { if (!$this->_validateMinimumAmount()) { return; diff --git a/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php b/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php index fe288a54f74b906944ad444a18e9c8a7aaf1bdf7..7e80e00754b01316b2a0d01e8e323be4ac3d3b78 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php @@ -65,7 +65,7 @@ class OverviewPost extends \Magento\Multishipping\Controller\Checkout * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { if (!$this->formKeyValidator->validate($this->getRequest())) { $this->_forward('backToAddresses'); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Plugin.php b/app/code/Magento/Multishipping/Controller/Checkout/Plugin.php index 3467cc8b9a85adf5b3c6b3859379b57e5fb8f011..4fbd38f11781cc40a9e0ef1afc182a762ae195d6 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Plugin.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Plugin.php @@ -28,7 +28,7 @@ class Plugin * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function beforeExecute(\Magento\Framework\App\Action\Action $subject) + public function beforeExecuteInternal(\Magento\Framework\App\Action\Action $subject) { $this->cart->getQuote()->setIsMultiShipping(0); } diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Register.php b/app/code/Magento/Multishipping/Controller/Checkout/Register.php index 34aba23698077b6c0d90b33aa7c6bc38995238fa..4033d985801714633057babe25dd99f6afc0c113 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Register.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Register.php @@ -13,7 +13,7 @@ class Register extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { if ($this->_objectManager->get('Magento\Customer\Model\Session')->isLoggedIn()) { $this->getResponse()->setRedirect($this->_getHelper()->getMSCheckoutUrl()); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/RemoveItem.php b/app/code/Magento/Multishipping/Controller/Checkout/RemoveItem.php index 4bba45d3047011d77e2485e8dd7fc0e60940ea20..1dced5c2360b9a21f68742474e543a196088d0d9 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/RemoveItem.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/RemoveItem.php @@ -13,7 +13,7 @@ class RemoveItem extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { $itemId = $this->getRequest()->getParam('id'); $addressId = $this->getRequest()->getParam('address'); diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Shipping.php b/app/code/Magento/Multishipping/Controller/Checkout/Shipping.php index d8ffd0d2b6af0a1a6d98893879e57a615c352dfd..8d8e9c4643e012e43d4af40cb98abf6f7369c1ef 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Shipping.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Shipping.php @@ -16,7 +16,7 @@ class Shipping extends \Magento\Multishipping\Controller\Checkout * * @return ResponseInterface|void */ - public function execute() + public function executeInternal() { if (!$this->_validateMinimumAmount()) { return; diff --git a/app/code/Magento/Multishipping/Controller/Checkout/ShippingPost.php b/app/code/Magento/Multishipping/Controller/Checkout/ShippingPost.php index e5c1a001b9eacf5c1a692fdee028f19e8d7f34bb..d3693051344def797c34e10fedf97a18f854721b 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/ShippingPost.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/ShippingPost.php @@ -13,7 +13,7 @@ class ShippingPost extends \Magento\Multishipping\Controller\Checkout /** * @return void */ - public function execute() + public function executeInternal() { $shippingMethods = $this->getRequest()->getPost('shipping_method'); try { diff --git a/app/code/Magento/Multishipping/Controller/Checkout/Success.php b/app/code/Magento/Multishipping/Controller/Checkout/Success.php index 52a7de51c1839ccc63f707c4e9dacb551b449e41..ea4838ee85f51539b6e385ed4d153218de7bd69f 100644 --- a/app/code/Magento/Multishipping/Controller/Checkout/Success.php +++ b/app/code/Magento/Multishipping/Controller/Checkout/Success.php @@ -15,7 +15,7 @@ class Success extends \Magento\Multishipping\Controller\Checkout * * @return void */ - public function execute() + public function executeInternal() { if (!$this->_getState()->getCompleteStep(State::STEP_OVERVIEW)) { $this->_redirect('*/*/addresses'); diff --git a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditAddressTest.php b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditAddressTest.php index 54c431ecd3fb8be01ed918a48ceb12147a5be23f..4f15a7d7055c4f65f9bef33b80303698950bab1a 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditAddressTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditAddressTest.php @@ -126,7 +126,7 @@ class EditAddressTest extends \PHPUnit_Framework_TestCase $this->titleMock->expects($this->once())->method('set')->with('Address title - default_title'); $this->addressFormMock->expects($this->once())->method('setBackUrl')->with('success/url'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } @@ -140,6 +140,6 @@ class EditAddressTest extends \PHPUnit_Framework_TestCase ->with('customer_address_edit'); $this->urlMock->expects($this->never())->method('getUrl'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditBillingTest.php b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditBillingTest.php index e0b516a09e74ad0f03fdbbb2b24dac447ce56f4d..232add6bf1e41a5b141485eb679dc227e448b543 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditBillingTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditBillingTest.php @@ -153,7 +153,7 @@ class EditBillingTest extends \PHPUnit_Framework_TestCase $this->titleMock->expects($this->once())->method('set')->with('Address title - default_title'); $this->addressFormMock->expects($this->once())->method('setBackUrl')->with('back/address'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWhenCustomerAddressBlockNotExist() @@ -170,7 +170,7 @@ class EditBillingTest extends \PHPUnit_Framework_TestCase ->with('customer_address_edit'); $this->urlMock->expects($this->never())->method('getUrl'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditShippingTest.php b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditShippingTest.php index dbe004b62d0051a3c0baca4c25994eb805b362c1..0b9a5fb2f80e1632300f65a45644279339b871cc 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditShippingTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/EditShippingTest.php @@ -157,7 +157,7 @@ class EditShippingTest extends \PHPUnit_Framework_TestCase ->willReturn('shipping_addres'); $this->addressFormMock->expects($this->once())->method('setBackUrl')->with('back/address'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWhenCustomerAddressBlockNotExist() @@ -174,6 +174,6 @@ class EditShippingTest extends \PHPUnit_Framework_TestCase ->with('customer_address_edit'); $this->urlMock->expects($this->never())->method('getUrl'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewBillingTest.php b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewBillingTest.php index 7afb5d6ee2fa03dd408b5e0658a7d167094c04f8..e5c701b3c216106d305a75e5b329e273d0d85721 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewBillingTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewBillingTest.php @@ -118,7 +118,7 @@ class NewBillingTest extends \PHPUnit_Framework_TestCase $this->titleMock->expects($this->once())->method('set')->with('Address title - default_title'); $this->addressFormMock->expects($this->once())->method('setBackUrl')->with('success/url'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } @@ -132,6 +132,6 @@ class NewBillingTest extends \PHPUnit_Framework_TestCase ->with('customer_address_edit'); $this->urlMock->expects($this->never())->method('getUrl'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewShippingTest.php b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewShippingTest.php index 1f98daffc1d8d3179b95a03dfd1c052fcdf6c45e..3b1b76d9c7ca0983356c348c3350f19417353e76 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewShippingTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/NewShippingTest.php @@ -157,7 +157,7 @@ class NewShippingTest extends \PHPUnit_Framework_TestCase ->willReturn($shippingAddress); $this->addressFormMock->expects($this->once())->method('setBackUrl')->with($url); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } public function executeDataProvider() @@ -183,6 +183,6 @@ class NewShippingTest extends \PHPUnit_Framework_TestCase ->with('customer_address_edit'); $this->urlMock->expects($this->never())->method('getUrl'); $this->viewMock->expects($this->once())->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/ShippingSavedTest.php b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/ShippingSavedTest.php index ffb91ebb4e132a67c22d9ac9fdfdf9a80a5260a8..23ff549744ccc43c3386bf90911fc5bf294de636 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/ShippingSavedTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/Address/ShippingSavedTest.php @@ -100,7 +100,7 @@ class ShippingSavedTest extends \PHPUnit_Framework_TestCase // check that checkout is reset $this->checkoutMock->expects($this->once())->method('reset'); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteDoesNotResetCheckoutIfCustomerHasMoreThanOneAddress() @@ -120,7 +120,7 @@ class ShippingSavedTest extends \PHPUnit_Framework_TestCase // check that checkout is not reset $this->checkoutMock->expects($this->never())->method('reset'); - $this->controller->execute(); + $this->controller->executeInternal(); } /** diff --git a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/PluginTest.php b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/PluginTest.php index 9cfb6a0c75f553e05f6710099bed558608eb02d3..dc9a3056acdc9768371a9191078ee5b29e147673 100644 --- a/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/PluginTest.php +++ b/app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/PluginTest.php @@ -39,10 +39,10 @@ class PluginTest extends \PHPUnit_Framework_TestCase $this->object = new \Magento\Multishipping\Controller\Checkout\Plugin($this->cartMock); } - public function testExecuteTurnsOffMultishippingModeOnQuote() + public function testExecuteInternalTurnsOffMultishippingModeOnQuote() { $subject = $this->getMock('Magento\Checkout\Controller\Index\Index', [], [], '', false); $this->quoteMock->expects($this->once())->method('setIsMultiShipping')->with(0); - $this->object->beforeExecute($subject); + $this->object->beforeExecuteInternal($subject); } } diff --git a/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout.xml b/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout.xml index 097574d31074727178ac7c858fbccd10ee295b24..46ec2dcccadd71ea6de1922c03f0cdfd42259fe8 100644 --- a/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout.xml +++ b/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout.xml @@ -7,6 +7,24 @@ --> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="Multishipping Checkout" design_abstraction="custom"> <body> + <referenceBlock name="authentication-popup"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="components" xsi:type="array"> + <item name="authenticationPopup" xsi:type="array"> + <item name="children" xsi:type="array"> + <item name="captcha" xsi:type="array"> + <item name="component" xsi:type="string">Magento_Captcha/js/view/checkout/loginCaptcha</item> + <item name="displayArea" xsi:type="string">additional-login-form-fields</item> + <item name="formId" xsi:type="string">user_login</item> + <item name="configSource" xsi:type="string">authenticationPopup</item> + </item> + </item> + </item> + </item> + </argument> + </arguments> + </referenceBlock> <referenceContainer name="sidebar.main"> <block class="Magento\Multishipping\Block\Checkout\State" name="checkout_state" template="checkout/state.phtml" cacheable="false"/> </referenceContainer> diff --git a/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml index dc0c669468da9a1aaae43fc83bfa32cc22776044..21b83793d7d27f94ea511f1e7a6cde2ab0a8384f 100644 --- a/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml +++ b/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml @@ -8,16 +8,16 @@ ?> <div class="multicheckout success"> - <h2 class="subtitle"><?php /* @noEscape */ echo __('Thank you for your purchase!') ?></h2> - <p><?php /* @escapeNotVerified */ echo __('Thanks for your order. We\'ll email you order details and tracking information.') ?></p> + <h2 class="subtitle"><?php echo $block->escapeHtml(__('Thank you for your purchase!')) ?></h2> + <p><?php echo $block->escapeHtml(__('Thanks for your order. We\'ll email you order details and tracking information.')) ?></p> <?php if ($_orderIds = $block->getOrderIds()): ?> <p class="order-number"> <?php $flag = false ?> <span> <?php if (count($_orderIds) > 1): ?> - <?php /* @noEscape */ echo __('Your order numbers are: ') ?> + <?php echo $block->escapeHtml(__('Your order numbers are: ')) ?> <?php else : ?> - <?php /* @noEscape */ echo __('Your order number is: ') ?> + <?php echo $block->escapeHtml(__('Your order number is: ')) ?> <?php endif; ?> </span> <?php foreach ($_orderIds as $orderId => $incrementId): ?><?php if ($flag): ?><?php echo ', ' ?><?php endif; ?><?php $flag = true ?><a href="<?php /* @escapeNotVerified */ echo $block->getViewOrderUrl($orderId) ?>"><?php /* @escapeNotVerified */ echo $incrementId ?></a><?php endforeach; ?> @@ -25,6 +25,6 @@ <?php endif; ?> <?php echo $block->getChildHtml() ?> <div class="actions"> - <a class="action continue" title="<?php /* @noEscape */ echo __('Continue Shopping') ?>" href="<?php /* @escapeNotVerified */ echo $block->getContinueUrl() ?>"><span><?php /* @noEscape */ echo __('Continue Shopping') ?></span></a> + <a class="action continue" title="<?php echo $block->escapeHtml(__('Continue Shopping')) ?>" href="<?php /* @escapeNotVerified */ echo $block->getContinueUrl() ?>"><span><?php echo $block->escapeHtml(__('Continue Shopping')) ?></span></a> </div> </div> diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Grid.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Grid.php index cf2ae4964f7678c1dc864cbab2bbaf8dff9cb9f1..e3904f2efadcd8f9fb7215fd09b45a8fb217a8f7 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Grid.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Newsletter\Controller\Adminhtml\Problem * * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('_unsubscribe')) { $problems = (array)$this->getRequest()->getParam('problem', []); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Index.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Index.php index 2b377e93c2867717e8c8c3733f1b7684a00f4834..89045ddfa6ab91e2aa8575a86e8147967769d55d 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Index.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Problem/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Newsletter\Controller\Adminhtml\Problem * * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getQuery('ajax')) { $this->_forward('grid'); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Cancel.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Cancel.php index eda2ee69860a83fab43452773f6f09a4c6ce3c51..a04519e190e6e1e774425951b96c06abe120db3c 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Cancel.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Cancel.php @@ -13,7 +13,7 @@ class Cancel extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $queue = $this->_objectManager->get( 'Magento\Newsletter\Model\Queue' diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Drop.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Drop.php index ff410c926fcb674eb8d352797dd48b83ff659fdd..af2cc33cca501e5f60d2531f7f85700df7bd7d00 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Drop.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Drop.php @@ -13,7 +13,7 @@ class Drop extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout('newsletter_queue_preview_popup'); $this->_view->renderLayout(); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Edit.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Edit.php index ea3cfed3771ec5127676d6956982c08b6a40a431..d8881fa43aca6d5cdf82aed2a2e681933c5d800b 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Edit.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Edit.php @@ -30,7 +30,7 @@ class Edit extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $this->_coreRegistry->register('current_queue', $this->_objectManager->get('Magento\Newsletter\Model\Queue')); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Grid.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Grid.php index 509b868d29eeafa685d8e0ac8777fd746fa19efb..33df60e59212af5cbee0faa2e2022f95fc5a6ffd 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Grid.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Index.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Index.php index 412d531b7d40295000373f712b71285e3ca1c598..cd9b39395f7a3b8d4c06b5fed31f35cb810edac8 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Index.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getQuery('ajax')) { $this->_forward('grid'); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Pause.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Pause.php index 1e890edcb36dc3ae7be66a206634f6cd27776437..2e2cad6b58808b5c0811b1c8aa7768f6056235c5 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Pause.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Pause.php @@ -13,7 +13,7 @@ class Pause extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $queue = $this->_objectManager->get( 'Magento\Newsletter\Model\Queue' diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Preview.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Preview.php index 3a6f564f90d142f4bca862feb947e90f3eb57194..488dc897f8f98b78abd7f4bec1ef1629eae5f19c 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Preview.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Preview.php @@ -13,7 +13,7 @@ class Preview extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $data = $this->getRequest()->getParams(); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Resume.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Resume.php index f92ab4bf691dbfab10b95dd9edf2b8c324309334..da87317dda95e5c3a87ffca720893a24945a8e44 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Resume.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Resume.php @@ -13,7 +13,7 @@ class Resume extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $queue = $this->_objectManager->get( 'Magento\Newsletter\Model\Queue' diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php index 33fd2052a42056497f4e1be99d1571952a9aa210..28990582b66769c25b24943c2830e5b1dfba23e9 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php @@ -18,7 +18,7 @@ class Save extends \Magento\Newsletter\Controller\Adminhtml\Queue * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { try { /* @var $queue \Magento\Newsletter\Model\Queue */ diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Sending.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Sending.php index bc6053c67aa8f2b363a4185d89cdef6bde3cecc4..6e5000bbb27f12c789c424ef9a7374031d5c3d33 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Sending.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Sending.php @@ -13,7 +13,7 @@ class Sending extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { // Todo: put it somewhere in config! $countOfQueue = 3; diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Start.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Start.php index 1917681ca21ea5d35686396df6f3c18953ba46bf..bda80ec99015cdc9ec0b987ece1c4db2adb3b1bb 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Start.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Start.php @@ -13,7 +13,7 @@ class Start extends \Magento\Newsletter\Controller\Adminhtml\Queue * * @return void */ - public function execute() + public function executeInternal() { $queue = $this->_objectManager->create( 'Magento\Newsletter\Model\Queue' diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportCsv.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportCsv.php index 8a795384b148b3b93d199d023ba2519d38d07a15..398a7ef8221a232620e4d613edc9018cf723a903 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportCsv.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportCsv.php @@ -16,7 +16,7 @@ class ExportCsv extends \Magento\Newsletter\Controller\Adminhtml\Subscriber * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'subscribers.csv'; diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportXml.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportXml.php index 44b68aa1afe6c4dabdb338d7bc9ccb814a5a216f..ac16f90c852dd00f0920c66881acced65cd77e45 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportXml.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/ExportXml.php @@ -16,7 +16,7 @@ class ExportXml extends \Magento\Newsletter\Controller\Adminhtml\Subscriber * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'subscribers.xml'; diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Grid.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Grid.php index 89aa1b46520964572bc485cec238e14d64a56cda..5a06ac05d3c1df0d6b0c9f8bf57e30708a082ee6 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Grid.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Newsletter\Controller\Adminhtml\Subscriber * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Index.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Index.php index 9aed2baed18b70d628d82f084e96935a3696ad7d..a8d7f096b6476b8ed79b0f303addba897037f12a 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Index.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Newsletter\Controller\Adminhtml\Subscriber * * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('ajax')) { $this->_forward('grid'); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php index 4ea5f85728efdd7f2df57bf5d8ff742382774950..ebc712cefb7776e093596ccff042879ec0d4fb21 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php @@ -13,7 +13,7 @@ class MassDelete extends \Magento\Newsletter\Controller\Adminhtml\Subscriber * * @return void */ - public function execute() + public function executeInternal() { $subscribersIds = $this->getRequest()->getParam('subscriber'); if (!is_array($subscribersIds)) { diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassUnsubscribe.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassUnsubscribe.php index d6b6df7c19a6915d391282aeb75351531331c192..8a6feb8b349aead42db1224e69329ebd22a2a7f5 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassUnsubscribe.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassUnsubscribe.php @@ -13,7 +13,7 @@ class MassUnsubscribe extends \Magento\Newsletter\Controller\Adminhtml\Subscribe * * @return void */ - public function execute() + public function executeInternal() { $subscribersIds = $this->getRequest()->getParam('subscriber'); if (!is_array($subscribersIds)) { diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Delete.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Delete.php index 188e800f3bfaedfe3954271913103fd6d0216fdf..9b1ebaa45ffabd335520249aa9517bc797dea1eb 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Delete.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void */ - public function execute() + public function executeInternal() { $template = $this->_objectManager->create( 'Magento\Newsletter\Model\Template' diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Drop.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Drop.php index f96ac80e7f07abcfc65d153cbf30756d8ea22634..bf4ac7d5ff74c39dc7bae1d5cc9cdb743140cba2 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Drop.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Drop.php @@ -13,7 +13,7 @@ class Drop extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout('newsletter_template_preview_popup'); $this->_view->renderLayout(); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Edit.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Edit.php index b1030723790e27d67005983ac887e68e4da5a3c7..fb52832aca992bc75689235a9a951465cf3c5d24 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Edit.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Edit.php @@ -30,7 +30,7 @@ class Edit extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void */ - public function execute() + public function executeInternal() { $model = $this->_objectManager->create('Magento\Newsletter\Model\Template'); $id = $this->getRequest()->getParam('id'); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Grid.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Grid.php index dbd0e7195a56ad7eab9a3efd7796d4c70912205c..d3c850e81b4873f646f649526c11657bbc1b4a39 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Grid.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $grid = $this->_view->getLayout()->createBlock('Magento\Newsletter\Block\Adminhtml\Template\Grid')->toHtml(); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Index.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Index.php index f4c51a0f590a504201406d3cb80ea49768c8661c..4647c06de1f8c798b71e72f19ee0f525dbc59d32 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Index.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getQuery('ajax')) { $this->_forward('grid'); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/NewAction.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/NewAction.php index 9409faf0f6abf8244fddf612863371d8943e313e..a03fd5c6f3789fb3e15b413b41d543aba2f1ad16 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/NewAction.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Preview.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Preview.php index 5594435c98d3830a2ff4b4a58972f5fe9bb7fe41..fc04569de3173a2cc04d99e7274333bde9c45bf9 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Preview.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Preview.php @@ -13,7 +13,7 @@ class Preview extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void|$this */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php index 4378ac6ba704cbde91693671857351ae3e87bf90..7f9c4bdb76ea0ceaa666435e6bfafad1e519c4e1 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php @@ -16,7 +16,7 @@ class Save extends \Magento\Newsletter\Controller\Adminhtml\Template * * @return void */ - public function execute() + public function executeInternal() { $request = $this->getRequest(); if (!$request->isPost()) { diff --git a/app/code/Magento/Newsletter/Controller/Manage.php b/app/code/Magento/Newsletter/Controller/Manage.php index 6bc940662cebe77e55fcb546623cd9427132654d..16ba747c011e8e41559ddd8c31be7f1543ffba8e 100644 --- a/app/code/Magento/Newsletter/Controller/Manage.php +++ b/app/code/Magento/Newsletter/Controller/Manage.php @@ -37,11 +37,11 @@ abstract class Manage extends \Magento\Framework\App\Action\Action * @param RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { if (!$this->_customerSession->authenticate()) { $this->_actionFlag->set('', 'no-dispatch', true); } - return parent::dispatch($request); + return parent::execute($request); } } diff --git a/app/code/Magento/Newsletter/Controller/Manage/Index.php b/app/code/Magento/Newsletter/Controller/Manage/Index.php index de782a3d3bc093b814b49bdcdc704a74c6e42eb6..0ef350892c3fb0b4614f7eed876a47dc9a4d3e67 100644 --- a/app/code/Magento/Newsletter/Controller/Manage/Index.php +++ b/app/code/Magento/Newsletter/Controller/Manage/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Newsletter\Controller\Manage * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); diff --git a/app/code/Magento/Newsletter/Controller/Manage/Save.php b/app/code/Magento/Newsletter/Controller/Manage/Save.php index 92ba7f93628b36b2a1f4afa4add9eca0b7f52910..67fe6e4dd2c76936141b11f92fa325b0a934899c 100644 --- a/app/code/Magento/Newsletter/Controller/Manage/Save.php +++ b/app/code/Magento/Newsletter/Controller/Manage/Save.php @@ -60,7 +60,7 @@ class Save extends \Magento\Newsletter\Controller\Manage * * @return void|null */ - public function execute() + public function executeInternal() { if (!$this->formKeyValidator->validate($this->getRequest())) { return $this->_redirect('customer/account/'); diff --git a/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php b/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php index 91d4f0d2880559b175e2282d4ff696e899bd3c16..785f3ab018538fd632e0bdd5e9f478b4d8503390 100644 --- a/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php +++ b/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php @@ -12,7 +12,7 @@ class Confirm extends \Magento\Newsletter\Controller\Subscriber * Subscription confirm action * @return void */ - public function execute() + public function executeInternal() { $id = (int)$this->getRequest()->getParam('id'); $code = (string)$this->getRequest()->getParam('code'); diff --git a/app/code/Magento/Newsletter/Controller/Subscriber/NewAction.php b/app/code/Magento/Newsletter/Controller/Subscriber/NewAction.php index 5e8850de308daea3b0c9c4b114744a1412318e97..11dcfacb44fb533e72dff4cebc41bcce71bd7a48 100644 --- a/app/code/Magento/Newsletter/Controller/Subscriber/NewAction.php +++ b/app/code/Magento/Newsletter/Controller/Subscriber/NewAction.php @@ -111,7 +111,7 @@ class NewAction extends \Magento\Newsletter\Controller\Subscriber * @throws \Magento\Framework\Exception\LocalizedException * @return void */ - public function execute() + public function executeInternal() { if ($this->getRequest()->isPost() && $this->getRequest()->getPost('email')) { $email = (string)$this->getRequest()->getPost('email'); diff --git a/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php index 9fb7575699a4958000ca564134fcb3569e0440bb..9449f3336f9f69e4390c0596377fd3b7530562f3 100644 --- a/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php +++ b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php @@ -12,7 +12,7 @@ class Unsubscribe extends \Magento\Newsletter\Controller\Subscriber * Unsubscribe newsletter * @return void */ - public function execute() + public function executeInternal() { $id = (int)$this->getRequest()->getParam('id'); $code = (string)$this->getRequest()->getParam('code'); diff --git a/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php b/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php index 7ee8fc1c9f6aad5c28d8dd2e1f67f355ad23af8e..781c181eb903a4d6216a4da6fb0ca1ab6d6a3412 100644 --- a/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php +++ b/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php @@ -5,6 +5,8 @@ */ namespace Magento\Newsletter\Model\Queue; +use Magento\Email\Model\AbstractTemplate; + class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder { /** @@ -26,17 +28,30 @@ class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder return $this; } + /** + * @param AbstractTemplate $template + * @return void + */ + protected function setTemplateFilter(AbstractTemplate $template) + { + if (isset($this->templateData['template_filter'])) { + $template->setTemplateFilter($this->templateData['template_filter']); + } + } + /** * @inheritdoc */ protected function prepareMessage() { + /** @var AbstractTemplate $template */ $template = $this->getTemplate()->setData($this->templateData); + $this->setTemplateFilter($template); $this->message->setMessageType( \Magento\Framework\Mail\MessageInterface::TYPE_HTML )->setBody( - $template->getProcessedTemplate() + $template->getProcessedTemplate($this->templateVars) )->setSubject( $template->getSubject() ); diff --git a/app/code/Magento/Newsletter/Model/Template/Filter.php b/app/code/Magento/Newsletter/Model/Template/Filter.php index 43a68d085bbf9a1b079f8751d5a5d52a99b910ff..0a2abbcacfd6ce468b345f20d841f337ef168dcf 100644 --- a/app/code/Magento/Newsletter/Model/Template/Filter.php +++ b/app/code/Magento/Newsletter/Model/Template/Filter.php @@ -11,7 +11,7 @@ */ namespace Magento\Newsletter\Model\Template; -class Filter extends \Magento\Widget\Model\Template\Filter +class Filter extends \Magento\Widget\Model\Template\FilterEmulate { /** * Generate widget HTML if template variables are assigned diff --git a/app/code/Magento/Newsletter/Test/Unit/Controller/Manage/SaveTest.php b/app/code/Magento/Newsletter/Test/Unit/Controller/Manage/SaveTest.php index f592aafcbc9c269a47e716130dd693af76f8e338..99bb1abdfc13c100990d42b987d730af7d327423 100644 --- a/app/code/Magento/Newsletter/Test/Unit/Controller/Manage/SaveTest.php +++ b/app/code/Magento/Newsletter/Test/Unit/Controller/Manage/SaveTest.php @@ -107,7 +107,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->method('addSuccess'); $this->messageManagerMock->expects($this->never()) ->method('addError'); - $this->action->execute(); + $this->action->executeInternal(); } public function testSaveActionNoCustomerInSession() @@ -126,7 +126,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->once()) ->method('addError') ->with('Something went wrong while saving your subscription.'); - $this->action->execute(); + $this->action->executeInternal(); } public function testSaveActionWithException() @@ -156,6 +156,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->once()) ->method('addError') ->with('Something went wrong while saving your subscription.'); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php index 52a501f9ef3b6b15fd72079266db9629fef8fa98..dd7ff0eac5fb90056221ad1c244dc8ba69992f97 100644 --- a/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php +++ b/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php @@ -32,11 +32,13 @@ class TransportBuilderTest extends \Magento\Framework\Mail\Test\Unit\Template\Tr $messageType = MessageInterface::TYPE_HTML, $bodyText = '<h1>Html message</h1>' ) { + $filter = $this->getMock('Magento\Email\Model\Template\Filter', [], [], '', false); $data = [ 'template_subject' => 'Email Subject', 'template_text' => $bodyText, 'template_styles' => 'Styles', 'template_type' => $templateType, + 'template_filter' => $filter, ]; $vars = ['reason' => 'Reason', 'customer' => 'Customer']; $options = ['area' => 'frontend', 'store' => 1]; @@ -52,8 +54,14 @@ class TransportBuilderTest extends \Magento\Framework\Mail\Test\Unit\Template\Tr $this->returnSelf() ); $template->expects($this->once())->method('getSubject')->will($this->returnValue('Email Subject')); - $template->expects($this->once())->method('getProcessedTemplate')->will($this->returnValue($bodyText)); $template->expects($this->once())->method('setData')->with($this->equalTo($data))->will($this->returnSelf()); + $template->expects($this->once()) + ->method('getProcessedTemplate') + ->with($vars) + ->will($this->returnValue($bodyText)); + $template->expects($this->once()) + ->method('setTemplateFilter') + ->with($filter); $this->templateFactoryMock->expects( $this->once() diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/Template/FilterTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/Template/FilterTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c099b048f07ad7c42d6c31e8fc7b50c4db65c864 --- /dev/null +++ b/app/code/Magento/Newsletter/Test/Unit/Model/Template/FilterTest.php @@ -0,0 +1,128 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Newsletter\Test\Unit\Model\Template; + +class FilterTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Newsletter\Model\Template\Filter + */ + protected $filter; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + /** + * @var \Magento\Framework\App\State|\PHPUnit_Framework_MockObject_MockObject + */ + protected $appState; + + public function setUp() + { + $scopeConfig = $this->getMockForAbstractClass( + '\Magento\Framework\App\Config\ScopeConfigInterface', + [], + '', + false + ); + $this->storeManager = $this->getMockForAbstractClass( + '\Magento\Store\Model\StoreManagerInterface', + [], + '', + false + ); + $logger = $this->getMockForAbstractClass('\Psr\Log\LoggerInterface', [], '', false); + $layout = $this->getMockForAbstractClass('\Magento\Framework\View\LayoutInterface', [], '', false); + $urlModel = $this->getMockForAbstractClass('\Magento\Framework\UrlInterface', [], '', false); + $string = $this->getMock('\Magento\Framework\Stdlib\StringUtils', [], [], '', false); + $escaper = $this->getMock('\Magento\Framework\Escaper', [], [], '', false); + $assetRepo = $this->getMock('\Magento\Framework\View\Asset\Repository', [], [], '', false); + $coreVariableFactory = $this->getMock('\Magento\Variable\Model\VariableFactory', ['create'], [], '', false); + $layoutFactory = $this->getMock('\Magento\Framework\View\LayoutFactory', ['create'], [], '', false); + $this->appState = $this->getMock('\Magento\Framework\App\State', [], [], '', false); + $emogrifier = $this->getMock('\Pelago\Emogrifier', [], [], '', false); + $configVariables = $this->getMock('\Magento\Email\Model\Source\Variables', [], [], '', false); + $widgetResource = $this->getMock('\Magento\Widget\Model\ResourceModel\Widget', [], [], '', false); + $widget = $this->getMock('\Magento\Widget\Model\Widget', [], [], '', false); + + $this->filter = new \Magento\Newsletter\Model\Template\Filter( + $string, + $logger, + $escaper, + $assetRepo, + $scopeConfig, + $coreVariableFactory, + $this->storeManager, + $layout, + $layoutFactory, + $this->appState, + $urlModel, + $emogrifier, + $configVariables, + $widgetResource, + $widget + ); + + } + + public function testWidgetDirective() + { + $subscriber = $this->getMock('\Magento\Newsletter\Model\Subscriber', [], [], '', false); + $this->filter->setVariables(['subscriber' => $subscriber]); + + $construction = '{{widget type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"}}'; + + $store = $this->getMockForAbstractClass('Magento\Store\Api\Data\StoreInterface', [], '', false); + $store->expects($this->once()) + ->method('getId') + ->willReturn(1); + $this->storeManager->expects($this->once()) + ->method('getStore') + ->willReturn($store); + $this->appState->expects($this->once()) + ->method('emulateAreaCode') + ->with( + 'frontend', + [$this->filter, 'generateWidget'], + [ + [ + 1 => $construction, + 2 => 'type="\Magento\Cms\Block\Widget\Page\Link" page_id="1" store_id ="1"' + ] + ] + ) + ->willReturn( + '<div class="widget block block-cms-link-inline"> + <a href="http://magento.test/"> + <span>Home page</span> + </a> + </div>' + ); + + $this->filter->widgetDirective([ + 1 => $construction, + 2 => 'type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"' + ]); + } + + public function testWidgetDirectiveWithoutRequiredVariable() + { + $construction = '{{widget type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"}}'; + + $this->storeManager->expects($this->never()) + ->method('getStore'); + $result = $this->filter->widgetDirective( + [ + 0 => $construction, + 1 => 'type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"' + ] + ); + + $this->assertEquals($construction, $result); + } +} diff --git a/app/code/Magento/Newsletter/i18n/de_DE.csv b/app/code/Magento/Newsletter/i18n/de_DE.csv index 2fc3bee3bc65b5b1a9af57970fa18a590568df88..98a16ae2e77028ea0434282a11dfae6a54a5aad1 100644 --- a/app/code/Magento/Newsletter/i18n/de_DE.csv +++ b/app/code/Magento/Newsletter/i18n/de_DE.csv @@ -138,3 +138,4 @@ Unsubscribe,"Abonnement kündigen" Subscribed,Abonniert Unsubscribed,"Abonnements gekündigt" Unconfirmed,Unbestätigt +"Newsletter Template","Newsletter Vorlage" diff --git a/app/code/Magento/Newsletter/i18n/en_US.csv b/app/code/Magento/Newsletter/i18n/en_US.csv index ac79fef143eec52fc0462266718693aebafa8954..a30b48f0c939a8833cc606209a2ce70d8db62129 100644 --- a/app/code/Magento/Newsletter/i18n/en_US.csv +++ b/app/code/Magento/Newsletter/i18n/en_US.csv @@ -138,3 +138,4 @@ Unsubscribe,Unsubscribe Subscribed,Subscribed Unsubscribed,Unsubscribed Unconfirmed,Unconfirmed +"Newsletter Template","Newsletter Template" diff --git a/app/code/Magento/Newsletter/i18n/es_ES.csv b/app/code/Magento/Newsletter/i18n/es_ES.csv index 3be9617100dd0566047b3a0b03eb643331444af3..43c2e724ea7692433db5052fdd27e0346d036403 100644 --- a/app/code/Magento/Newsletter/i18n/es_ES.csv +++ b/app/code/Magento/Newsletter/i18n/es_ES.csv @@ -138,3 +138,4 @@ Unsubscribe,"Cancelar suscripción" Subscribed,Suscrito Unsubscribed,"Suscripción cancelada" Unconfirmed,"Sin confirmar" +"Newsletter Template","Newsletter Template" diff --git a/app/code/Magento/Newsletter/i18n/fr_FR.csv b/app/code/Magento/Newsletter/i18n/fr_FR.csv index cec853133f4625ae16b9523880b7c0d9971a16bd..65134aa5e433b3ca3ba6c370d401f4fcaecc399b 100644 --- a/app/code/Magento/Newsletter/i18n/fr_FR.csv +++ b/app/code/Magento/Newsletter/i18n/fr_FR.csv @@ -138,3 +138,4 @@ Unsubscribe,"Se désinscrire" Subscribed,Inscrit Unsubscribed,Désinscrit Unconfirmed,"Non confirmé" +"Newsletter Template","Newsletter Template" diff --git a/app/code/Magento/Newsletter/i18n/nl_NL.csv b/app/code/Magento/Newsletter/i18n/nl_NL.csv index 9280f66bdc00cebce78415489a1305e68b193884..7999b25e129757daf61e6ba0f1836818c07ea877 100644 --- a/app/code/Magento/Newsletter/i18n/nl_NL.csv +++ b/app/code/Magento/Newsletter/i18n/nl_NL.csv @@ -138,3 +138,4 @@ Unsubscribe,Uitschrijven Subscribed,Uitschrijven Unsubscribed,Uitgeschreven Unconfirmed,Onbevestigd +"Newsletter Template","Newsletter Template" diff --git a/app/code/Magento/Newsletter/i18n/pt_BR.csv b/app/code/Magento/Newsletter/i18n/pt_BR.csv index 4ec9dd0d67d0d4d9048bb3a2861df954ebc5b3e3..cb2fecc6a5900a91aba2d04614f26824d814fc1c 100644 --- a/app/code/Magento/Newsletter/i18n/pt_BR.csv +++ b/app/code/Magento/Newsletter/i18n/pt_BR.csv @@ -138,3 +138,4 @@ Unsubscribe,Desinscrever Subscribed,Assinado Unsubscribed,Desinscrito Unconfirmed,"Não Confirmado" +"Newsletter Template","Newsletter Template" diff --git a/app/code/Magento/Newsletter/i18n/zh_Hans_CN.csv b/app/code/Magento/Newsletter/i18n/zh_Hans_CN.csv index 96d65bc535252d743c200ca195c3b1268de5e9ae..71be218444fbc4ddbb97887efc076549cdb887ad 100644 --- a/app/code/Magento/Newsletter/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Newsletter/i18n/zh_Hans_CN.csv @@ -138,3 +138,4 @@ Unsubscribe,退订 Subscribed,已订阅 Unsubscribed,已退订 Unconfirmed,未确认 +"Newsletter Template","Newsletter Template" diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html index e20e15111e5b6b393efba087fa2c3c2cd7e72975..64385884483dd132f627f833166de6ef6f69b9a1 100644 --- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html +++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html @@ -25,12 +25,12 @@ <dl class="items check payable"> <!-- ko if: getPayableTo() --> <dt class="title"><!-- ko i18n: 'Make Check payable to:' --><!-- /ko --></dt> - <dd class="content"><!-- ko i18n: getPayableTo() --><!-- /ko --></dd> + <dd class="content"><!-- ko text: getPayableTo() --><!-- /ko --></dd> <!-- /ko --> <!-- ko if: getMailingAddress() --> <dt class="title"><!-- ko i18n: 'Send Check to:' --><!-- /ko --></dt> <dd class="content"> - <address class="checkmo mailing address" data-bind="html: $t(getMailingAddress())"></address> + <address class="checkmo mailing address" data-bind="html: getMailingAddress()"></address> </dd> <!-- /ko --> </dl> diff --git a/app/code/Magento/OfflineShipping/Controller/Adminhtml/System/Config/ExportTablerates.php b/app/code/Magento/OfflineShipping/Controller/Adminhtml/System/Config/ExportTablerates.php index 8f273e49c6191e9a43b2bb9f00bf624f8c416133..af20ac56ba4e060fc1d3ff16c05487effb674dec 100644 --- a/app/code/Magento/OfflineShipping/Controller/Adminhtml/System/Config/ExportTablerates.php +++ b/app/code/Magento/OfflineShipping/Controller/Adminhtml/System/Config/ExportTablerates.php @@ -46,7 +46,7 @@ class ExportTablerates extends \Magento\Config\Controller\Adminhtml\System\Abstr * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'tablerates.csv'; /** @var $gridBlock \Magento\OfflineShipping\Block\Adminhtml\Carrier\Tablerate\Grid */ diff --git a/app/code/Magento/OfflineShipping/Model/Config/Backend/Tablerate.php b/app/code/Magento/OfflineShipping/Model/Config/Backend/Tablerate.php index e6920ede9b8c4e04285538c9aed52acadc86be6f..08d23d9245564215089f6a4fb98f0703b901a681 100644 --- a/app/code/Magento/OfflineShipping/Model/Config/Backend/Tablerate.php +++ b/app/code/Magento/OfflineShipping/Model/Config/Backend/Tablerate.php @@ -23,6 +23,7 @@ class Tablerate extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\OfflineShipping\Model\ResourceModel\Carrier\TablerateFactory $tablerateFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -32,22 +33,24 @@ class Tablerate extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\OfflineShipping\Model\ResourceModel\Carrier\TablerateFactory $tablerateFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_tablerateFactory = $tablerateFactory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** - * @return \Magento\Framework\Model\AbstractModel|void + * @return $this */ public function afterSave() { /** @var \Magento\OfflineShipping\Model\ResourceModel\Carrier\Tablerate $tableRate */ $tableRate = $this->_tablerateFactory->create(); $tableRate->uploadAndImport($this); + return parent::afterSave(); } } diff --git a/app/code/Magento/PageCache/Controller/Adminhtml/PageCache/ExportVarnishConfig.php b/app/code/Magento/PageCache/Controller/Adminhtml/PageCache/ExportVarnishConfig.php index 6ff33668ae9c68a22c21795f37e11bc4dddd8825..36925596918c16e81f226720cc20e27d134fc3f5 100644 --- a/app/code/Magento/PageCache/Controller/Adminhtml/PageCache/ExportVarnishConfig.php +++ b/app/code/Magento/PageCache/Controller/Adminhtml/PageCache/ExportVarnishConfig.php @@ -40,7 +40,7 @@ class ExportVarnishConfig extends \Magento\Backend\App\Action * * @return \Magento\Framework\App\ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'varnish.vcl'; $varnishVersion = $this->getRequest()->getParam('varnish'); diff --git a/app/code/Magento/PageCache/Controller/Block/Esi.php b/app/code/Magento/PageCache/Controller/Block/Esi.php index e21aabd7cfde48c6262dbdabe1941142fa4efd1e..026c0ec4c150b34c1f7319ccd02f6280416574f7 100644 --- a/app/code/Magento/PageCache/Controller/Block/Esi.php +++ b/app/code/Magento/PageCache/Controller/Block/Esi.php @@ -13,7 +13,7 @@ class Esi extends \Magento\PageCache\Controller\Block * * @return void */ - public function execute() + public function executeInternal() { $response = $this->getResponse(); $blocks = $this->_getBlocks(); diff --git a/app/code/Magento/PageCache/Controller/Block/Render.php b/app/code/Magento/PageCache/Controller/Block/Render.php index 499973ae1e1bda643e096e41e22b2f5d54410a7b..b6a9591977526a3e4d0b798db0374b69a0191bcb 100644 --- a/app/code/Magento/PageCache/Controller/Block/Render.php +++ b/app/code/Magento/PageCache/Controller/Block/Render.php @@ -13,7 +13,7 @@ class Render extends \Magento\PageCache\Controller\Block * * @return void */ - public function execute() + public function executeInternal() { if (!$this->getRequest()->isAjax()) { $this->_forward('noroute'); diff --git a/app/code/Magento/PageCache/Model/App/PageCachePlugin.php b/app/code/Magento/PageCache/Model/App/PageCachePlugin.php new file mode 100644 index 0000000000000000000000000000000000000000..afb43a516f4eb474417172fa583d0b9ba1971829 --- /dev/null +++ b/app/code/Magento/PageCache/Model/App/PageCachePlugin.php @@ -0,0 +1,33 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\PageCache\Model\App; + +class PageCachePlugin +{ + /** + * Attach FPC tag to all saved entries to enable cache type management + * + * @param \Magento\Framework\App\PageCache\Cache $subject + * @param string $data + * @param string $identifier + * @param string[] $tags + * @param int|null $lifeTime + * @return array + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function beforeSave( + \Magento\Framework\App\PageCache\Cache $subject, + $data, + $identifier, + $tags = [], + $lifeTime = null + ) { + $tags[] = \Magento\PageCache\Model\Cache\Type::CACHE_TAG; + return [$data, $identifier, $tags, $lifeTime]; + } +} diff --git a/app/code/Magento/PageCache/Model/Cache/Server.php b/app/code/Magento/PageCache/Model/Cache/Server.php index fc52e41e3b23428142c147c8a13556005ca72e12..2e2f3a87fb8c07a7eb33c9b61f4ef421992e6c49 100644 --- a/app/code/Magento/PageCache/Model/Cache/Server.php +++ b/app/code/Magento/PageCache/Model/Cache/Server.php @@ -60,7 +60,7 @@ class Server $httpHost = $this->request->getHttpHost(); $servers[] = $httpHost ? UriFactory::factory('')->setHost($httpHost)->setPort(self::DEFAULT_PORT)->setScheme('http') : - UriFactory::factory($this->urlBuilder->getUrl('*')) + UriFactory::factory($this->urlBuilder->getUrl('*', ['_nosid' => true])) // Don't use SID in building URL ->setScheme('http') ->setPath(null) ->setQuery(null); diff --git a/app/code/Magento/PageCache/Model/System/Config/Source/Application.php b/app/code/Magento/PageCache/Model/System/Config/Source/Application.php index 45233bb59c70b2d61504d4a983ec00ad7624a4e7..eb428f7c0300a3d58c8cf74cbbe38a5bef0fa853 100644 --- a/app/code/Magento/PageCache/Model/System/Config/Source/Application.php +++ b/app/code/Magento/PageCache/Model/System/Config/Source/Application.php @@ -23,8 +23,14 @@ class Application implements \Magento\Framework\Option\ArrayInterface public function toOptionArray() { return [ - ['value' => \Magento\PageCache\Model\Config::BUILT_IN, 'label' => __('Built-in Application')], - ['value' => \Magento\PageCache\Model\Config::VARNISH, 'label' => __('Varnish Caching')] + [ + 'value' => \Magento\PageCache\Model\Config::BUILT_IN, + 'label' => __('Built-in Application (Not Recommended for Production Use)') + ], + [ + 'value' => \Magento\PageCache\Model\Config::VARNISH, + 'label' => __('Varnish Caching') + ] ]; } @@ -36,7 +42,8 @@ class Application implements \Magento\Framework\Option\ArrayInterface public function toArray() { return [ - \Magento\PageCache\Model\Config::BUILT_IN => __('Built-in Application'), + \Magento\PageCache\Model\Config::BUILT_IN => + __('Built-in Application (Not Recommended for Production Use)'), \Magento\PageCache\Model\Config::VARNISH => __('Varnish Caching') ]; } diff --git a/app/code/Magento/PageCache/Test/Unit/Controller/Adminhtml/PageCache/ExportVarnishConfigTest.php b/app/code/Magento/PageCache/Test/Unit/Controller/Adminhtml/PageCache/ExportVarnishConfigTest.php index d99f597c3e7cb6d51e7397b2018039fc3250e336..4bee20c5f4ce590617e29cdd9858b0e1bb13d473 100644 --- a/app/code/Magento/PageCache/Test/Unit/Controller/Adminhtml/PageCache/ExportVarnishConfigTest.php +++ b/app/code/Magento/PageCache/Test/Unit/Controller/Adminhtml/PageCache/ExportVarnishConfigTest.php @@ -102,7 +102,7 @@ class ExportVarnishConfigTest extends \PHPUnit_Framework_TestCase $this->returnValue($responseMock) ); - $result = $this->action->execute(); + $result = $this->action->executeInternal(); $this->assertInstanceOf('Magento\Framework\App\ResponseInterface', $result); } } diff --git a/app/code/Magento/PageCache/Test/Unit/Controller/Block/EsiTest.php b/app/code/Magento/PageCache/Test/Unit/Controller/Block/EsiTest.php index bc23f569d17f6fc421309a634246ffa4cf675532..9bddcbeb778d303a16c94e6c719477a26f03f44e 100644 --- a/app/code/Magento/PageCache/Test/Unit/Controller/Block/EsiTest.php +++ b/app/code/Magento/PageCache/Test/Unit/Controller/Block/EsiTest.php @@ -123,7 +123,7 @@ class EsiTest extends \PHPUnit_Framework_TestCase ->method('appendBody') ->with($this->equalTo($html)); - $this->action->execute(); + $this->action->executeInternal(); } public function executeDataProvider() @@ -145,6 +145,6 @@ class EsiTest extends \PHPUnit_Framework_TestCase $this->requestMock->expects($this->any())->method('getParam')->will($this->returnValueMap($mapData)); $this->viewMock->expects($this->never())->method('getLayout')->will($this->returnValue($this->layoutMock)); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/PageCache/Test/Unit/Controller/Block/RenderTest.php b/app/code/Magento/PageCache/Test/Unit/Controller/Block/RenderTest.php index a9493a7a4c3abb2b6ff6472ccfce3007d0089ea2..c419a150fc6406d7bc76121f921e6d87508099a7 100644 --- a/app/code/Magento/PageCache/Test/Unit/Controller/Block/RenderTest.php +++ b/app/code/Magento/PageCache/Test/Unit/Controller/Block/RenderTest.php @@ -79,7 +79,7 @@ class RenderTest extends \PHPUnit_Framework_TestCase $this->requestMock->expects($this->once())->method('isAjax')->will($this->returnValue(false)); $this->requestMock->expects($this->once())->method('setActionName')->will($this->returnValue('noroute')); $this->requestMock->expects($this->once())->method('setDispatched')->will($this->returnValue(false)); - $this->action->execute(); + $this->action->executeInternal(); } /** @@ -96,7 +96,7 @@ class RenderTest extends \PHPUnit_Framework_TestCase ->method('getParam') ->with($this->equalTo('handles'), $this->equalTo('')) ->will($this->returnValue('')); - $this->action->execute(); + $this->action->executeInternal(); } public function testExecute() @@ -171,6 +171,6 @@ class RenderTest extends \PHPUnit_Framework_TestCase ->method('appendBody') ->with($this->equalTo(json_encode($expectedData))); - $this->action->execute(); + $this->action->executeInternal(); } } diff --git a/app/code/Magento/PageCache/Test/Unit/Model/App/PageCachePluginTest.php b/app/code/Magento/PageCache/Test/Unit/Model/App/PageCachePluginTest.php new file mode 100644 index 0000000000000000000000000000000000000000..5f10bbc747954295ff916f3908ab9d22342dedc0 --- /dev/null +++ b/app/code/Magento/PageCache/Test/Unit/Model/App/PageCachePluginTest.php @@ -0,0 +1,30 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\PageCache\Test\Unit\Model\App; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\PageCache\Model\Cache\Type; + +class PageCachePluginTest extends \PHPUnit_Framework_TestCase +{ + public function testBeforeSave() + { + /** @var \Magento\PageCache\Model\App\PageCachePlugin $plugin */ + $plugin = (new ObjectManager($this))->getObject('\Magento\PageCache\Model\App\PageCachePlugin'); + $subjectMock = $this->getMockBuilder('\Magento\Framework\App\PageCache\Cache') + ->disableOriginalConstructor() + ->getMock(); + $initTags = ['tag', 'otherTag']; + $result = $plugin->beforeSave($subjectMock, 'data', 'identifier', $initTags); + $tags = isset($result[2]) ? $result[2] : null; + $expectedTags = array_merge($initTags, [Type::CACHE_TAG]); + $this->assertNotNull($tags); + foreach ($expectedTags as $expected) { + $this->assertContains($expected, $tags); + } + } +} diff --git a/app/code/Magento/PageCache/Test/Unit/Model/Cache/ServerTest.php b/app/code/Magento/PageCache/Test/Unit/Model/Cache/ServerTest.php index 38cc49be2ff4839736af9bd27d18752a585e8aee..f18c5e04468da59169ae6b3b5642d428b7113667 100644 --- a/app/code/Magento/PageCache/Test/Unit/Model/Cache/ServerTest.php +++ b/app/code/Magento/PageCache/Test/Unit/Model/Cache/ServerTest.php @@ -64,7 +64,7 @@ class ServerTest extends \PHPUnit_Framework_TestCase ->willReturn($httpHost); $this->urlBuilderMock->expects($this->exactly($getUrlCallCtr)) ->method('getUrl') - ->with('*') + ->with('*', ['_nosid' => true]) ->willReturn($url); $uris = []; diff --git a/app/code/Magento/PageCache/etc/di.xml b/app/code/Magento/PageCache/etc/di.xml index b5a248f714ab99470403549ccf33b28391f9dbd1..1543abaa27781263d365c12e4c89ec6eac078c5f 100644 --- a/app/code/Magento/PageCache/etc/di.xml +++ b/app/code/Magento/PageCache/etc/di.xml @@ -10,4 +10,7 @@ <plugin name="core-app-area-design-exception-plugin" type="Magento\PageCache\Model\App\CacheIdentifierPlugin" sortOrder="10"/> </type> + <type name="Magento\Framework\App\PageCache\Cache"> + <plugin name="fpc-tag-addition-plugin" type="Magento\PageCache\Model\App\PageCachePlugin"/> + </type> </config> diff --git a/app/code/Magento/PageCache/i18n/de_DE.csv b/app/code/Magento/PageCache/i18n/de_DE.csv index 0d57f18488d74de68e153b35e305fa7629c104f0..701e12300596b25fedafc3bdd766ee5f064c98af 100644 --- a/app/code/Magento/PageCache/i18n/de_DE.csv +++ b/app/code/Magento/PageCache/i18n/de_DE.csv @@ -1,6 +1,6 @@ "Export VCL","Export VCL" "Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero.","Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero." -"Built-in Application","Built-in Application" +"Built-in Application (Not Recommended for Production Use)","Built-in Application (Not Recommended for Production Use)" "Varnish Caching","Varnish Caching" "Full Page Cache","Full Page Cache" "Caching Application","Caching Application" diff --git a/app/code/Magento/PageCache/i18n/en_US.csv b/app/code/Magento/PageCache/i18n/en_US.csv index 0d57f18488d74de68e153b35e305fa7629c104f0..701e12300596b25fedafc3bdd766ee5f064c98af 100644 --- a/app/code/Magento/PageCache/i18n/en_US.csv +++ b/app/code/Magento/PageCache/i18n/en_US.csv @@ -1,6 +1,6 @@ "Export VCL","Export VCL" "Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero.","Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero." -"Built-in Application","Built-in Application" +"Built-in Application (Not Recommended for Production Use)","Built-in Application (Not Recommended for Production Use)" "Varnish Caching","Varnish Caching" "Full Page Cache","Full Page Cache" "Caching Application","Caching Application" diff --git a/app/code/Magento/PageCache/i18n/es_ES.csv b/app/code/Magento/PageCache/i18n/es_ES.csv index 0d57f18488d74de68e153b35e305fa7629c104f0..701e12300596b25fedafc3bdd766ee5f064c98af 100644 --- a/app/code/Magento/PageCache/i18n/es_ES.csv +++ b/app/code/Magento/PageCache/i18n/es_ES.csv @@ -1,6 +1,6 @@ "Export VCL","Export VCL" "Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero.","Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero." -"Built-in Application","Built-in Application" +"Built-in Application (Not Recommended for Production Use)","Built-in Application (Not Recommended for Production Use)" "Varnish Caching","Varnish Caching" "Full Page Cache","Full Page Cache" "Caching Application","Caching Application" diff --git a/app/code/Magento/PageCache/i18n/fr_FR.csv b/app/code/Magento/PageCache/i18n/fr_FR.csv index 0d57f18488d74de68e153b35e305fa7629c104f0..701e12300596b25fedafc3bdd766ee5f064c98af 100644 --- a/app/code/Magento/PageCache/i18n/fr_FR.csv +++ b/app/code/Magento/PageCache/i18n/fr_FR.csv @@ -1,6 +1,6 @@ "Export VCL","Export VCL" "Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero.","Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero." -"Built-in Application","Built-in Application" +"Built-in Application (Not Recommended for Production Use)","Built-in Application (Not Recommended for Production Use)" "Varnish Caching","Varnish Caching" "Full Page Cache","Full Page Cache" "Caching Application","Caching Application" diff --git a/app/code/Magento/PageCache/i18n/nl_NL.csv b/app/code/Magento/PageCache/i18n/nl_NL.csv index 0d57f18488d74de68e153b35e305fa7629c104f0..701e12300596b25fedafc3bdd766ee5f064c98af 100644 --- a/app/code/Magento/PageCache/i18n/nl_NL.csv +++ b/app/code/Magento/PageCache/i18n/nl_NL.csv @@ -1,6 +1,6 @@ "Export VCL","Export VCL" "Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero.","Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero." -"Built-in Application","Built-in Application" +"Built-in Application (Not Recommended for Production Use)","Built-in Application (Not Recommended for Production Use)" "Varnish Caching","Varnish Caching" "Full Page Cache","Full Page Cache" "Caching Application","Caching Application" diff --git a/app/code/Magento/PageCache/i18n/pt_BR.csv b/app/code/Magento/PageCache/i18n/pt_BR.csv index 0d57f18488d74de68e153b35e305fa7629c104f0..701e12300596b25fedafc3bdd766ee5f064c98af 100644 --- a/app/code/Magento/PageCache/i18n/pt_BR.csv +++ b/app/code/Magento/PageCache/i18n/pt_BR.csv @@ -1,6 +1,6 @@ "Export VCL","Export VCL" "Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero.","Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero." -"Built-in Application","Built-in Application" +"Built-in Application (Not Recommended for Production Use)","Built-in Application (Not Recommended for Production Use)" "Varnish Caching","Varnish Caching" "Full Page Cache","Full Page Cache" "Caching Application","Caching Application" diff --git a/app/code/Magento/PageCache/i18n/zh_Hans_CN.csv b/app/code/Magento/PageCache/i18n/zh_Hans_CN.csv index 0d57f18488d74de68e153b35e305fa7629c104f0..701e12300596b25fedafc3bdd766ee5f064c98af 100644 --- a/app/code/Magento/PageCache/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/PageCache/i18n/zh_Hans_CN.csv @@ -1,6 +1,6 @@ "Export VCL","Export VCL" "Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero.","Ttl value ""%1"" is not valid. Please use only numbers equal or greater than zero." -"Built-in Application","Built-in Application" +"Built-in Application (Not Recommended for Production Use)","Built-in Application (Not Recommended for Production Use)" "Varnish Caching","Varnish Caching" "Full Page Cache","Full Page Cache" "Caching Application","Caching Application" diff --git a/app/code/Magento/Payment/view/adminhtml/templates/form/cc.phtml b/app/code/Magento/Payment/view/adminhtml/templates/form/cc.phtml index ab38d3752a679f68d8a0371d087c126268707a99..f1109afb7974ef65ee42d01d18162dc121c428ab 100644 --- a/app/code/Magento/Payment/view/adminhtml/templates/form/cc.phtml +++ b/app/code/Magento/Payment/view/adminhtml/templates/form/cc.phtml @@ -8,7 +8,7 @@ /** * @var \Magento\Payment\Block\Adminhtml\Transparent\Form $block */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); $ccType = $block->getInfoData('cc_type'); $ccExpMonth = $block->getInfoData('cc_exp_month'); $ccExpYear = $block->getInfoData('cc_exp_year'); diff --git a/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml b/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml index 1bb248e6fd5662bced43e2f7ee9d4c5a942a1f69..0d28d33caea9cadcfce22c7fb68e2da557c7935b 100644 --- a/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml +++ b/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml @@ -7,7 +7,7 @@ // @codingStandardsIgnoreFile /** @var \Magento\Payment\Block\Transparent\Form $block */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); $ccType = $block->getInfoData('cc_type'); $ccExpYear = $block->getInfoData('cc_exp_year'); $ccExpMonth = $block->getInfoData('cc_exp_month'); @@ -29,7 +29,7 @@ $ccExpMonth = $block->getInfoData('cc_exp_month'); "controller":"<?php echo $block->escapeHtml($block->getRequest()->getControllerName()); ?>", "gateway":"<?php /* @noEscape */ echo $code; ?>", "dateDelim":"<?php echo $block->escapeHtml($block->getDateDelim()); ?>", - "cardFieldsMap":<?php /* @noEscape */ echo $block->getCardFieldsMap(); ?>, + "cardFieldsMap":<?php echo $block->escapeHtml($block->getCardFieldsMap()); ?>, "orderSaveUrl":"<?php echo $block->escapeUrl($block->getOrderUrl()); ?>", "cgiUrl":"<?php echo $block->escapeUrl($block->getCgiUrl()); ?>", "expireYearLength":"<?php echo $block->escapeHtml($block->getMethodConfigData('cc_year_length')); ?>", @@ -102,7 +102,7 @@ $ccExpMonth = $block->getInfoData('cc_exp_month'); data-container="<?php /* @noEscape */ echo $code; ?>-cc-year" data-validate='{required:true}'> <?php foreach ($block->getCcYears() as $k => $v): ?> <option - value="<?php /* @noEscape */ echo $k ? $k : '' ?>" + value="<?php /* @noEscape */ echo $k ? $block->escapeHtml($k) : '' ?>" <?php if ($k == $ccExpYear): ?> selected="selected"<?php endif ?>> <?php echo $block->escapeHtml($v); ?> </option> diff --git a/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml b/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml index 8deddb094d1799a1f1459a6be34e7fdbf5a054f0..8b20f64b5a60109508916e2a2ed2b07d36fa586f 100644 --- a/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml +++ b/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml @@ -11,6 +11,6 @@ * @see \Magento\Payment\Block\Transparent\Info */ ?> -<fieldset id="payment_form_<?php /* @noEscape */ echo $block->getMethodCode(); ?>" style="display:none" class="fieldset items redirect"> +<fieldset id="payment_form_<?php echo $block->escapeHtml($block->getMethodCode()); ?>" style="display:none" class="fieldset items redirect"> <div><?php echo $block->escapeHtml(__('We\'ll ask for your payment details before you place an order.')); ?></div> </fieldset> diff --git a/app/code/Magento/Payment/view/frontend/templates/form/cc.phtml b/app/code/Magento/Payment/view/frontend/templates/form/cc.phtml index 05d8d3c02c82cdfc54c16a9d77a6863422e7ecbd..a02de6dbaff84f73d2f9d7fa48dcc23c2b482f1d 100644 --- a/app/code/Magento/Payment/view/frontend/templates/form/cc.phtml +++ b/app/code/Magento/Payment/view/frontend/templates/form/cc.phtml @@ -8,7 +8,7 @@ /** * @var \Magento\Payment\Block\Transparent\Form $block */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); $ccType = $block->getInfoData('cc_type'); $ccExpMonth = $block->getInfoData('cc_exp_month'); $ccExpYear = $block->getInfoData('cc_exp_year'); diff --git a/app/code/Magento/Payment/view/frontend/templates/transparent/form.phtml b/app/code/Magento/Payment/view/frontend/templates/transparent/form.phtml index 64ea503996cd280d8b29dc154b4dc20e9e47f69d..a589900d6233ae186fbef507484d2334a64c1db6 100644 --- a/app/code/Magento/Payment/view/frontend/templates/transparent/form.phtml +++ b/app/code/Magento/Payment/view/frontend/templates/transparent/form.phtml @@ -7,7 +7,7 @@ // @codingStandardsIgnoreFile /** @var \Magento\Payment\Block\Transparent\Form $block */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); $ccExpMonth = $block->getInfoData('cc_exp_month'); $ccExpYear = $block->getInfoData('cc_exp_year'); $ccType = $block->getInfoData('cc_type'); @@ -20,7 +20,7 @@ $content = '<img src=\"' . $block->getViewFileUrl('Magento_Checkout::cvv.png') . <iframe width="0" height="0" id="<?php /* @noescape */ echo $code; ?>-transparent-iframe" data-container="<?php /* @noEscape */ echo $code; ?>-transparent-iframe" allowtransparency="true" frameborder="0" name="iframeTransparent" style="display:none;width:100%;background-color:transparent" - src="<?php /* @noEscape */ echo $block->getViewFileUrl('blank.html') ?>"></iframe> + src="<?php echo $block->escapeUrl($block->getViewFileUrl('blank.html')) ?>"></iframe> <form class="form" id="co-transparent-form" action="#" method="post" data-mage-init='{ "transparent":{ "controller":"<?php echo $block->escapeHtml($block->getRequest()->getControllerName()); ?>", @@ -28,7 +28,7 @@ $content = '<img src=\"' . $block->getViewFileUrl('Magento_Checkout::cvv.png') . "orderSaveUrl":"<?php echo $block->escapeUrl($block->getOrderUrl()); ?>", "cgiUrl":"<?php echo $block->escapeUrl($block->getCgiUrl()); ?>", "dateDelim":"<?php echo $block->escapeHtml($block->getDateDelim()); ?>", - "cardFieldsMap":<?php /* @noEscape */ echo $block->getCardFieldsMap(); ?>, + "cardFieldsMap":<?php echo $block->escapeHtml($block->getCardFieldsMap()); ?>, "nativeAction":"<?php echo $block->escapeUrl($block->getUrl('checkout/onepage/saveOrder', ['_secure' => $block->getRequest()->isSecure()])); ?>" }, "validation":[]}'> <fieldset class="fieldset ccard <?php /* @noEscape */ echo $code; ?>" id="payment_form_<?php /* @noEscape */ echo $code; ?>"> diff --git a/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml b/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml index b191981585af62dde6804c9dbfc44a3b0258e1b5..fc9624bde1016edc28d53a7bc282ca36ca64625f 100644 --- a/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml +++ b/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml @@ -33,7 +33,7 @@ $params = $block->getParams(); 'Magento_Checkout/js/action/place-order' ], function(quote, placeOrderAction) { - placeOrderAction(quote.paymentMethod(), true); + placeOrderAction({"method": quote.paymentMethod().method}, true); } ); <?php endif; ?> diff --git a/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml b/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml index c3ce1e5dbb7029ed65db079fcbf0230839373a3b..84cd69f6e4f698ff8731f76c5367e1b8244e0dae 100644 --- a/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml +++ b/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml @@ -11,7 +11,7 @@ * @see \Magento\Payment\Block\Transparent\Info */ ?> -<fieldset id="payment_form_<?php /* @noEscape */ echo $block->getMethodCode(); ?>" style="display:none" class="fieldset items redirect"> +<fieldset id="payment_form_<?php echo $block->escapeHtml($block->getMethodCode()); ?>" style="display:none" class="fieldset items redirect"> <div> <?php echo $block->escapeHtml(__('We\'ll ask for your payment details before you place an order.')); ?> </div> diff --git a/app/code/Magento/Paypal/Block/Adminhtml/Billing/Agreement/View/Tab/Orders.php b/app/code/Magento/Paypal/Block/Adminhtml/Billing/Agreement/View/Tab/Orders.php index df81fff83bd338742a921f399696ba8a58f9dcd2..f8b577df7c12c971b564084e76211ce3744ba1ca 100644 --- a/app/code/Magento/Paypal/Block/Adminhtml/Billing/Agreement/View/Tab/Orders.php +++ b/app/code/Magento/Paypal/Block/Adminhtml/Billing/Agreement/View/Tab/Orders.php @@ -8,20 +8,54 @@ namespace Magento\Paypal\Block\Adminhtml\Billing\Agreement\View\Tab; +use Magento\Paypal\Model\ResourceModel\Billing\Agreement as BillingAgreementResource; +use Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory; +use Magento\Backend\Block\Widget\Grid\Extended as ExtendedGrid; +use Magento\Backend\Block\Widget\Tab\TabInterface; +use Magento\Backend\Block\Template\Context as TemplateContext; +use Magento\Backend\Helper\Data as BackendHelper; +use Magento\Framework\Registry; + /** * Adminhtml billing agreement related orders tab */ -class Orders extends \Magento\Framework\View\Element\Text\ListText implements \Magento\Backend\Block\Widget\Tab\TabInterface +class Orders extends ExtendedGrid implements TabInterface { /** - * Initialize grid params - * - * @return void + * @var CollectionFactory */ - protected function _construct() - { - parent::_construct(); - $this->setId('billing_agreement_orders'); + protected $collectionFactory; + + /** + * @var Registry + */ + protected $coreRegistry; + + /** + * @var BillingAgreementResource + */ + protected $billingAgreementResource; + + /** + * @param TemplateContext $context + * @param BackendHelper $backendHelper + * @param CollectionFactory $collectionFactory + * @param Registry $coreRegistry + * @param BillingAgreementResource $billingAgreementResource + * @param array $data + */ + public function __construct( + TemplateContext $context, + BackendHelper $backendHelper, + CollectionFactory $collectionFactory, + Registry $coreRegistry, + BillingAgreementResource $billingAgreementResource, + array $data = [] + ) { + $this->coreRegistry = $coreRegistry; + $this->collectionFactory = $collectionFactory; + $this->billingAgreementResource = $billingAgreementResource; + parent::__construct($context, $backendHelper, $data); } /** @@ -55,4 +89,82 @@ class Orders extends \Magento\Framework\View\Element\Text\ListText implements \M { return false; } + + /** + * {@inheritdoc} + */ + protected function _construct() + { + parent::_construct(); + $this->setId('billing_agreement_orders'); + $this->setUseAjax(true); + } + + /** + * Apply various selection filters to prepare the sales order grid collection. + * + * @return $this + */ + protected function _prepareCollection() + { + $billingAgreement = $this->coreRegistry->registry('current_billing_agreement'); + if ($billingAgreement) { + $collection = $this->collectionFactory->getReport('sales_order_grid_data_source')->addFieldToSelect( + 'entity_id' + )->addFieldToSelect( + 'increment_id' + )->addFieldToSelect( + 'customer_id' + )->addFieldToSelect( + 'created_at' + )->addFieldToSelect( + 'grand_total' + )->addFieldToSelect( + 'order_currency_code' + )->addFieldToSelect( + 'store_id' + )->addFieldToSelect( + 'billing_name' + )->addFieldToSelect( + 'shipping_name' + ); + $this->billingAgreementResource->addOrdersFilter($collection, $billingAgreement->getId()); + $this->setCollection($collection); + } + return parent::_prepareCollection(); + } + + /** + * {@inheritdoc} + */ + protected function _prepareColumns() + { + $this->addColumn('increment_id', ['header' => __('Order'), 'width' => '100', 'index' => 'increment_id']); + + $this->addColumn( + 'created_at', + ['header' => __('Purchased'), 'index' => 'created_at', 'type' => 'datetime'] + ); + + $this->addColumn('billing_name', ['header' => __('Bill-to Name'), 'index' => 'billing_name']); + $this->addColumn('shipping_name', ['header' => __('Ship-to Name'), 'index' => 'shipping_name']); + + $this->addColumn( + 'grand_total', + [ + 'header' => __('Order Total'), + 'index' => 'grand_total', + 'type' => 'currency', + 'currency' => 'order_currency_code' + ] + ); + + if (!$this->_storeManager->isSingleStoreMode()) { + $this->addColumn( + 'store_id', + ['header' => __('Purchase Point'), 'index' => 'store_id', 'type' => 'store', 'store_view' => true] + ); + } + return parent::_prepareColumns(); + } } diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Cancel.php b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Cancel.php index 70134fdf2826f83f2c613f1d4362e608a59fc4a1..f26e1c043919e7dd46740cd65f0890602f34db98 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Cancel.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Cancel.php @@ -13,7 +13,7 @@ class Cancel extends \Magento\Paypal\Controller\Adminhtml\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $agreementModel = $this->_initBillingAgreement(); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/CustomerGrid.php b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/CustomerGrid.php index 0c157101b70656897442a3878a2bebd6d26a2b16..8fe43e3611b7dde11accaf0c127e7367dbd78236 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/CustomerGrid.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/CustomerGrid.php @@ -29,7 +29,7 @@ class CustomerGrid extends \Magento\Paypal\Controller\Adminhtml\Billing\Agreemen * * @return void */ - public function execute() + public function executeInternal() { $this->initCurrentCustomer(); $this->_view->loadLayout(false); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Delete.php b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Delete.php index 3bc7143a4a1d0140a56c607a0e89a2bd69a2a32e..3351f7dcf7e2e3dabd8686a6f585a9242181653f 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Delete.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Paypal\Controller\Adminhtml\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $agreementModel = $this->_initBillingAgreement(); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Grid.php b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Grid.php index 2753574d2b4f91c342fd7360bfaa69ccf2ff1723..a84f114d41e2eb5e79cb0990fb76102229b9071a 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Grid.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Paypal\Controller\Adminhtml\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Index.php b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Index.php index f20444f9214c29aee19876dda3133498b5148dc5..51edf6b55bfe816c52dbcb97c22b94ff82d1c0b9 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Index.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Paypal\Controller\Adminhtml\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_Paypal::paypal_billing_agreement'); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/OrdersGrid.php b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/OrdersGrid.php index 62208a96b7103f20f1bc4752fc72ca3114c6c3fa..10b9b003c845434523aee1788bb2288f44c23872 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/OrdersGrid.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/OrdersGrid.php @@ -13,7 +13,7 @@ class OrdersGrid extends \Magento\Paypal\Controller\Adminhtml\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $this->_initBillingAgreement(); $this->_view->loadLayout(false); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/View.php b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/View.php index 3755d973cac117e3a473603d3be8bbc629c2815b..85c81a77788199ccbc0226b233fe5ef2a146b1e1 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/View.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Billing/Agreement/View.php @@ -13,7 +13,7 @@ class View extends \Magento\Paypal\Controller\Adminhtml\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $agreementModel = $this->_initBillingAgreement(); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Details.php b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Details.php index 20633c5c585e4f9c263e1dcaa8dd5ea6ad488146..f48168d33d397fa893f62d1ef2099899f63a73dc 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Details.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Details.php @@ -13,7 +13,7 @@ class Details extends \Magento\Paypal\Controller\Adminhtml\Paypal\Reports * * @return void */ - public function execute() + public function executeInternal() { $rowId = $this->getRequest()->getParam('id'); $row = $this->_rowFactory->create()->load($rowId); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Fetch.php b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Fetch.php index 89ccd4a5f9d6d680c579f970607d89b90f1ad168..67c4824259e2482ba9a1d22e6c2f011777408604 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Fetch.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Fetch.php @@ -18,7 +18,7 @@ class Fetch extends \Magento\Paypal\Controller\Adminhtml\Paypal\Reports * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $reports = $this->_settlementFactory->create(); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Grid.php b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Grid.php index 33551753da591789dfab865a9b6ac0ed89b69bf1..0d3342c2669556f65b15fd1539e078ade1dd2e07 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Grid.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Paypal\Controller\Adminhtml\Paypal\Reports * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Index.php b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Index.php index 2f2ad28ce19589850e54c6992e6431be55fa2401..4bd6de4cdfb9b489a26fbc018a707158cf3e6541 100644 --- a/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Index.php +++ b/app/code/Magento/Paypal/Controller/Adminhtml/Paypal/Reports/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Paypal\Controller\Adminhtml\Paypal\Reports * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction(); $this->_view->renderLayout(); diff --git a/app/code/Magento/Paypal/Controller/Billing/Agreement.php b/app/code/Magento/Paypal/Controller/Billing/Agreement.php index 8d6f0f0b1e63bf9c445df1f3ee365f2d22071835..01f632dba7fc035f4764e249728a3538ea10aeba 100644 --- a/app/code/Magento/Paypal/Controller/Billing/Agreement.php +++ b/app/code/Magento/Paypal/Controller/Billing/Agreement.php @@ -37,15 +37,15 @@ abstract class Agreement extends \Magento\Framework\App\Action\Action * @param RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { if (!$request->isDispatched()) { - return parent::dispatch($request); + return parent::execute($request); } if (!$this->_getSession()->authenticate()) { $this->_actionFlag->set('', 'no-dispatch', true); } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Paypal/Controller/Billing/Agreement/Cancel.php b/app/code/Magento/Paypal/Controller/Billing/Agreement/Cancel.php index ee0daf917271df0d05a9e271dc7a4535f679aa8e..5b8e8f30b753b0c5bab3641938b52030d3444143 100644 --- a/app/code/Magento/Paypal/Controller/Billing/Agreement/Cancel.php +++ b/app/code/Magento/Paypal/Controller/Billing/Agreement/Cancel.php @@ -14,7 +14,7 @@ class Cancel extends \Magento\Paypal\Controller\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $agreement = $this->_initAgreement(); if (!$agreement) { diff --git a/app/code/Magento/Paypal/Controller/Billing/Agreement/CancelWizard.php b/app/code/Magento/Paypal/Controller/Billing/Agreement/CancelWizard.php index f95b687f57631edf39096271425457ffc3fc4f19..22394e572ada4abfe98ec4ad053fc4dcd2a3ed11 100644 --- a/app/code/Magento/Paypal/Controller/Billing/Agreement/CancelWizard.php +++ b/app/code/Magento/Paypal/Controller/Billing/Agreement/CancelWizard.php @@ -13,7 +13,7 @@ class CancelWizard extends \Magento\Paypal\Controller\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $this->_redirect('*/*/index'); } diff --git a/app/code/Magento/Paypal/Controller/Billing/Agreement/Index.php b/app/code/Magento/Paypal/Controller/Billing/Agreement/Index.php index 85c210699962a5db3f8306be4210dcd6d90d47a8..c5ccc5c8afbffd583228be877f675b473552da0e 100644 --- a/app/code/Magento/Paypal/Controller/Billing/Agreement/Index.php +++ b/app/code/Magento/Paypal/Controller/Billing/Agreement/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Paypal\Controller\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Billing Agreements')); diff --git a/app/code/Magento/Paypal/Controller/Billing/Agreement/ReturnWizard.php b/app/code/Magento/Paypal/Controller/Billing/Agreement/ReturnWizard.php index 59040954d0cee5efa5e7488253de7725bb6dea22..f7bd4d4b3a3117c2ccc4f6bef72c5057fbb89501 100644 --- a/app/code/Magento/Paypal/Controller/Billing/Agreement/ReturnWizard.php +++ b/app/code/Magento/Paypal/Controller/Billing/Agreement/ReturnWizard.php @@ -15,7 +15,7 @@ class ReturnWizard extends \Magento\Paypal\Controller\Billing\Agreement * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Paypal\Model\Billing\Agreement $agreement */ $agreement = $this->_objectManager->create('Magento\Paypal\Model\Billing\Agreement'); diff --git a/app/code/Magento/Paypal/Controller/Billing/Agreement/StartWizard.php b/app/code/Magento/Paypal/Controller/Billing/Agreement/StartWizard.php index 407240c756b593ee3cb1ff7fede165751bcb398e..24364b02e0d14d56a021ac041ae11456756ce27f 100644 --- a/app/code/Magento/Paypal/Controller/Billing/Agreement/StartWizard.php +++ b/app/code/Magento/Paypal/Controller/Billing/Agreement/StartWizard.php @@ -13,7 +13,7 @@ class StartWizard extends \Magento\Paypal\Controller\Billing\Agreement * * @return \Magento\Framework\App\Response\Http */ - public function execute() + public function executeInternal() { $agreement = $this->_objectManager->create('Magento\Paypal\Model\Billing\Agreement'); $paymentCode = $this->getRequest()->getParam('payment_method'); diff --git a/app/code/Magento/Paypal/Controller/Billing/Agreement/View.php b/app/code/Magento/Paypal/Controller/Billing/Agreement/View.php index 31b2dfd759c15e75d31c5ad778303620228d2a10..2cbe118f4db85637320302b99cf8cc7cefd61781 100644 --- a/app/code/Magento/Paypal/Controller/Billing/Agreement/View.php +++ b/app/code/Magento/Paypal/Controller/Billing/Agreement/View.php @@ -13,7 +13,7 @@ class View extends \Magento\Paypal\Controller\Billing\Agreement * * @return void */ - public function execute() + public function executeInternal() { if (!($agreement = $this->_initAgreement())) { return; diff --git a/app/code/Magento/Paypal/Controller/Bml/Start.php b/app/code/Magento/Paypal/Controller/Bml/Start.php index d189c91965e7b24cb7b32a21f08eeb28e6c67e2b..1fe8cc717009b1452202e496926fe2cfcd741f67 100644 --- a/app/code/Magento/Paypal/Controller/Bml/Start.php +++ b/app/code/Magento/Paypal/Controller/Bml/Start.php @@ -13,7 +13,7 @@ class Start extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $this->_forward( 'start', diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Cancel.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Cancel.php index 05c5dd2b5d171515f8cac1a4746dc36d3361aded..a6b9079f91302feb0ba2ad2439d70303de8a0da1 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Cancel.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Cancel.php @@ -15,7 +15,7 @@ class Cancel extends \Magento\Paypal\Controller\Express\AbstractExpress * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { try { $this->_initToken(false); diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Edit.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Edit.php index a9e879b51472e0194d6dc2d1c64fcca2851b2765..c7bca308846015de8eae956e837d9746f2ec1c90 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Edit.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Paypal\Controller\Express\AbstractExpress * * @return void */ - public function execute() + public function executeInternal() { try { $this->getResponse()->setRedirect($this->_config->getExpressCheckoutEditUrl($this->_initToken())); diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php index 3a723692287725cb6b79409e34e1a3bae2465d1d..456eb87f65e8d838cd0bc2c989c77b4e6b2a7e61 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php @@ -60,7 +60,7 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress * @return void * @throws \Magento\Framework\Exception\LocalizedException */ - public function execute() + public function executeInternal() { try { if ($this->isValidationRequired() && diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ReturnAction.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ReturnAction.php index 20604c61a1dfa8dc441e17f92d608722c9d58175..a1df008106672ec21d23ce82f807e594dcc13309 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ReturnAction.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ReturnAction.php @@ -15,7 +15,7 @@ class ReturnAction extends \Magento\Paypal\Controller\Express\AbstractExpress * * @return void|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Review.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Review.php index ec848148b647f12decc5683c7a6f6861581c7239..f60c2fd7847e41ee32a3254823755ce106e99087 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Review.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Review.php @@ -15,7 +15,7 @@ class Review extends \Magento\Paypal\Controller\Express\AbstractExpress * * @return void|\Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { try { $this->_initCheckout(); diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/SaveShippingMethod.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/SaveShippingMethod.php index 311900157b1929ffe648a0e986fc72fe31bce223..befc1615314c9373f5db4a6cf773fc00cf3b5662 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/SaveShippingMethod.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/SaveShippingMethod.php @@ -13,7 +13,7 @@ class SaveShippingMethod extends \Magento\Paypal\Controller\Express\AbstractExpr * * @return void */ - public function execute() + public function executeInternal() { try { $isAjax = $this->getRequest()->getParam('isAjax'); diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ShippingOptionsCallback.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ShippingOptionsCallback.php index a66433f346aa8447ab17e1feda209b64bbc8af75..ca53012f5346d1a202c42438b3d085f757a1be8d 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ShippingOptionsCallback.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/ShippingOptionsCallback.php @@ -53,7 +53,7 @@ class ShippingOptionsCallback extends \Magento\Paypal\Controller\Express\Abstrac * * @return void */ - public function execute() + public function executeInternal() { try { $quoteId = $this->getRequest()->getParam('quote_id'); diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php index 1ec1c2d96c8683785250aa06017c0fea92ba9d55..dae43744757fb3199e33976d117b099dd613e231 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php @@ -16,7 +16,7 @@ class Start extends \Magento\Paypal\Controller\Express\AbstractExpress * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { try { $this->_initCheckout(); diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/UpdateShippingMethods.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/UpdateShippingMethods.php index 1d0cbdf54813759824ac61c9bec4ad146ced0234..dc4f01b3f3cd7db4fdfee44d562b359af5a50443 100644 --- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/UpdateShippingMethods.php +++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/UpdateShippingMethods.php @@ -13,7 +13,7 @@ class UpdateShippingMethods extends \Magento\Paypal\Controller\Express\AbstractE * * @return void */ - public function execute() + public function executeInternal() { try { $this->_initCheckout(); diff --git a/app/code/Magento/Paypal/Controller/Hostedpro/Cancel.php b/app/code/Magento/Paypal/Controller/Hostedpro/Cancel.php index fab449dc198232c66e825143fdbf02a26e67caaa..0889ae11aa1e8b4c5feaf1c1867816aac3824637 100644 --- a/app/code/Magento/Paypal/Controller/Hostedpro/Cancel.php +++ b/app/code/Magento/Paypal/Controller/Hostedpro/Cancel.php @@ -48,7 +48,7 @@ class Cancel extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $gotoSection = $this->_cancelPayment(); diff --git a/app/code/Magento/Paypal/Controller/Hostedpro/Redirect.php b/app/code/Magento/Paypal/Controller/Hostedpro/Redirect.php index aa3a234d2d2a69583117eca6a74a20d054696e85..37c874e14fa6abc0a21a773dd7804dd1c68852f8 100644 --- a/app/code/Magento/Paypal/Controller/Hostedpro/Redirect.php +++ b/app/code/Magento/Paypal/Controller/Hostedpro/Redirect.php @@ -13,7 +13,7 @@ class Redirect extends \Magento\Paypal\Controller\Payflow * * @return void */ - public function execute() + public function executeInternal() { $this->getResponse()->setRedirect( $this->getOrder()->getPayment()->getAdditionalInformation('secure_form_url') diff --git a/app/code/Magento/Paypal/Controller/Hostedpro/ReturnAction.php b/app/code/Magento/Paypal/Controller/Hostedpro/ReturnAction.php index 9f0651b3a14571a00a408ce5fe6e380f2e82020c..b3f791e5782140e1da57adbdc14406d0bf988942 100644 --- a/app/code/Magento/Paypal/Controller/Hostedpro/ReturnAction.php +++ b/app/code/Magento/Paypal/Controller/Hostedpro/ReturnAction.php @@ -13,7 +13,7 @@ class ReturnAction extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $session = $this->_objectManager->get('Magento\Checkout\Model\Session'); //TODO: some actions with order diff --git a/app/code/Magento/Paypal/Controller/Ipn/Index.php b/app/code/Magento/Paypal/Controller/Ipn/Index.php index b8078937d320c498347ad1ce6ddbdbc89c7f78a1..b3384cba4dee94c2f892ac2d5e88e470c0c47529 100644 --- a/app/code/Magento/Paypal/Controller/Ipn/Index.php +++ b/app/code/Magento/Paypal/Controller/Ipn/Index.php @@ -45,7 +45,7 @@ class Index extends \Magento\Framework\App\Action\Action * @return void * @SuppressWarnings(PHPMD.ExitExpression) */ - public function execute() + public function executeInternal() { if (!$this->getRequest()->isPost()) { return; diff --git a/app/code/Magento/Paypal/Controller/Payflow/CancelPayment.php b/app/code/Magento/Paypal/Controller/Payflow/CancelPayment.php index fa59c545b86b774333477e9a15d92268cdeda6bd..7bd94850d9d4c1314ba96738be57a88230266e30 100644 --- a/app/code/Magento/Paypal/Controller/Payflow/CancelPayment.php +++ b/app/code/Magento/Paypal/Controller/Payflow/CancelPayment.php @@ -13,7 +13,7 @@ class CancelPayment extends \Magento\Paypal\Controller\Payflow * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $gotoSection = $this->_cancelPayment(); diff --git a/app/code/Magento/Paypal/Controller/Payflow/Form.php b/app/code/Magento/Paypal/Controller/Payflow/Form.php index 47834722d2b21e1902ee8f8d8d605a3b6ac3ea4c..32ca42096595453a1dd2cd287240dd62bfb17cb5 100644 --- a/app/code/Magento/Paypal/Controller/Payflow/Form.php +++ b/app/code/Magento/Paypal/Controller/Payflow/Form.php @@ -17,7 +17,7 @@ class Form extends Payflow * * @return void */ - public function execute() + public function executeInternal() { $this->getResponse()->setHeader('P3P', 'CP="CAO PSA OUR"'); $this->_view->loadLayout(false)->renderLayout(); diff --git a/app/code/Magento/Paypal/Controller/Payflow/ReturnUrl.php b/app/code/Magento/Paypal/Controller/Payflow/ReturnUrl.php index 1907a07045f39b85f576328a09c875a8fca0a06e..1c095d439eee5ae801a5377263df20f4fa01f85c 100644 --- a/app/code/Magento/Paypal/Controller/Payflow/ReturnUrl.php +++ b/app/code/Magento/Paypal/Controller/Payflow/ReturnUrl.php @@ -24,7 +24,7 @@ class ReturnUrl extends Payflow * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); /** @var \Magento\Checkout\Block\Onepage\Success $redirectBlock */ diff --git a/app/code/Magento/Paypal/Controller/Payflow/SilentPost.php b/app/code/Magento/Paypal/Controller/Payflow/SilentPost.php index 8b737177ada22301574b7e6d0bfd20941100a102..9f1aae5624f692cc100139f5d401d95cd714729a 100644 --- a/app/code/Magento/Paypal/Controller/Payflow/SilentPost.php +++ b/app/code/Magento/Paypal/Controller/Payflow/SilentPost.php @@ -13,7 +13,7 @@ class SilentPost extends \Magento\Paypal\Controller\Payflow * * @return void */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); if (isset($data['INVNUM'])) { diff --git a/app/code/Magento/Paypal/Controller/Payflowbml/Start.php b/app/code/Magento/Paypal/Controller/Payflowbml/Start.php index 4cd82e1146492a04524e29386a9d28ecf27de89c..8da3b6f2715fbf7c19f64e3d20737522bfa3db67 100644 --- a/app/code/Magento/Paypal/Controller/Payflowbml/Start.php +++ b/app/code/Magento/Paypal/Controller/Payflowbml/Start.php @@ -13,7 +13,7 @@ class Start extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $this->_forward( 'start', diff --git a/app/code/Magento/Paypal/Controller/Transparent/RequestSecureToken.php b/app/code/Magento/Paypal/Controller/Transparent/RequestSecureToken.php index 2fba2402a5f6b686f38d2a65e84d68fe782951a5..923988d12a1d85422b5eb192b45004c9311111a7 100644 --- a/app/code/Magento/Paypal/Controller/Transparent/RequestSecureToken.php +++ b/app/code/Magento/Paypal/Controller/Transparent/RequestSecureToken.php @@ -77,7 +77,7 @@ class RequestSecureToken extends \Magento\Framework\App\Action\Action * * @return ResultInterface */ - public function execute() + public function executeInternal() { /** @var Quote $quote */ $quote = $this->sessionManager->getQuote(); diff --git a/app/code/Magento/Paypal/Controller/Transparent/Response.php b/app/code/Magento/Paypal/Controller/Transparent/Response.php index c6c8105cba90e31ca1ae5daff3048157e6bd2e9a..30792f3857825fd9148efe9c2f4df10f8254a25d 100644 --- a/app/code/Magento/Paypal/Controller/Transparent/Response.php +++ b/app/code/Magento/Paypal/Controller/Transparent/Response.php @@ -62,7 +62,7 @@ class Response extends \Magento\Framework\App\Action\Action /** * @return ResultInterface */ - public function execute() + public function executeInternal() { $parameters = []; try { diff --git a/app/code/Magento/Paypal/Model/Config.php b/app/code/Magento/Paypal/Model/Config.php index dd5a0696e3e295878b3b6ec3a6053866d340f674..1e4b95886fc04932b94c0104fd5a3311caa4ec23 100644 --- a/app/code/Magento/Paypal/Model/Config.php +++ b/app/code/Magento/Paypal/Model/Config.php @@ -208,12 +208,13 @@ class Config extends AbstractConfig 'NZD', 'PLN', 'GBP', + 'RUB', 'SGD', 'SEK', 'CHF', - 'USD', 'TWD', 'THB', + 'USD', ]; /** diff --git a/app/code/Magento/Paypal/Model/Config/Rules/Converter.php b/app/code/Magento/Paypal/Model/Config/Rules/Converter.php index a636188baf1cf571ea572625e6de6dec367b640e..5528f79b385758a89b1c4c1fad3d2fa90e92b08e 100644 --- a/app/code/Magento/Paypal/Model/Config/Rules/Converter.php +++ b/app/code/Magento/Paypal/Model/Config/Rules/Converter.php @@ -58,8 +58,8 @@ class Converter implements ConverterInterface protected function createEvents(\DOMElement $node) { $result = []; - /** @var \DOMElement $child */ foreach ($node->childNodes as $child) { + /** @var \DOMElement $child */ if ($this->hasNodeElement($child)) { $result[$child->getAttribute('name')] = [ 'value' => $child->getAttribute('value'), @@ -80,8 +80,8 @@ class Converter implements ConverterInterface protected function createPredicate(\DOMElement $node) { $result = []; - /** @var \DOMElement $child */ foreach ($node->childNodes as $child) { + /** @var \DOMElement $child */ if ($this->hasNodeElement($child)) { $result = [ 'name' => $child->getAttribute('name'), @@ -105,33 +105,18 @@ class Converter implements ConverterInterface { $result = []; foreach ($node->childNodes as $child) { + /** @var \DOMElement $child */ if ($this->hasNodeElement($child)) { - $result = array_merge($result, $this->createRule($child)); + $result[$child->getAttribute('type')][] = [ + 'event' => $child->getAttribute('event'), + 'argument' => $this->createArgument($child), + ]; } } return [$node->getAttribute('target') => $result]; } - /** - * Creating rules - * - * @param \DOMElement $node - * @return array - */ - protected function createRule(\DOMElement $node) - { - $result = []; - $type = $node->getAttribute('type'); - /** @var \DOMElement $node */ - $result[$type] = [ - 'event' => $node->getAttribute('event'), - ]; - $result[$type]['argument'] = $this->createArgument($node); - - return $result; - } - /** * Create argument * @@ -141,8 +126,8 @@ class Converter implements ConverterInterface protected function createArgument(\DOMElement $node) { $result = []; - /** @var \DOMElement $child */ foreach ($node->childNodes as $child) { + /** @var \DOMElement $child */ if ($this->hasNodeElement($child)) { $result[$child->getAttribute('name')] = $child->textContent; } diff --git a/app/code/Magento/Paypal/Model/Payflowpro.php b/app/code/Magento/Paypal/Model/Payflowpro.php index 6efc7e7cca4ed1735aeeaaacc8deee09aaf18eb1..894c0792a99e4ab689f5c40aed6b0d29c0d334a5 100644 --- a/app/code/Magento/Paypal/Model/Payflowpro.php +++ b/app/code/Magento/Paypal/Model/Payflowpro.php @@ -500,8 +500,7 @@ class Payflowpro extends \Magento\Payment\Model\Method\Cc implements GatewayInte $this->processErrors($response); if ($response->getResultCode() == self::RESPONSE_CODE_APPROVED) { - $payment->setTransactionId($response->getPnref())->setIsTransactionClosed(1); - $payment->setShouldCloseParentTransaction(!$payment->getCreditmemo()->getInvoice()->canRefund()); + $payment->setTransactionId($response->getPnref())->setIsTransactionClosed(true); } return $this; } diff --git a/app/code/Magento/Paypal/Model/ResourceModel/Billing/Agreement.php b/app/code/Magento/Paypal/Model/ResourceModel/Billing/Agreement.php index 6f714ae437e605c3836c55a0aa430a845b1f23fd..5344091f837bf0664b7a817dcd849c53a66de105 100644 --- a/app/code/Magento/Paypal/Model/ResourceModel/Billing/Agreement.php +++ b/app/code/Magento/Paypal/Model/ResourceModel/Billing/Agreement.php @@ -39,11 +39,11 @@ class Agreement extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb /** * Add billing agreement filter on orders collection * - * @param \Magento\Sales\Model\ResourceModel\Order\Collection $orderCollection + * @param \Magento\Framework\Data\Collection\AbstractDb $orderCollection * @param string|int|array $agreementIds * @return $this */ - public function addOrdersFilter(\Magento\Sales\Model\ResourceModel\Order\Collection $orderCollection, $agreementIds) + public function addOrdersFilter(\Magento\Framework\Data\Collection\AbstractDb $orderCollection, $agreementIds) { $agreementIds = is_array($agreementIds) ? $agreementIds : [$agreementIds]; $orderCollection->getSelect()->joinInner( diff --git a/app/code/Magento/Paypal/Model/System/Config/Backend/Cert.php b/app/code/Magento/Paypal/Model/System/Config/Backend/Cert.php index 14607a6c87d9cb01be32d4193dc0b9e55e1b555e..a3a1a5df48cd937a11d2b6ab47b0227c83f755a7 100644 --- a/app/code/Magento/Paypal/Model/System/Config/Backend/Cert.php +++ b/app/code/Magento/Paypal/Model/System/Config/Backend/Cert.php @@ -10,6 +10,8 @@ use Magento\Framework\Filesystem\DirectoryList; /** * Backend model for saving certificate file in case of using certificate based authentication + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ class Cert extends \Magento\Framework\App\Config\Value { @@ -32,6 +34,7 @@ class Cert extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Paypal\Model\CertFactory $certFactory * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor * @param \Magento\Framework\Filesystem $filesystem @@ -43,6 +46,7 @@ class Cert extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Paypal\Model\CertFactory $certFactory, \Magento\Framework\Encryption\EncryptorInterface $encryptor, \Magento\Framework\Filesystem $filesystem, @@ -53,7 +57,7 @@ class Cert extends \Magento\Framework\App\Config\Value $this->_certFactory = $certFactory; $this->_encryptor = $encryptor; $this->_tmpDirectory = $filesystem->getDirectoryRead(DirectoryList::SYS_TMP); - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Paypal/Model/System/Config/Backend/Cron.php b/app/code/Magento/Paypal/Model/System/Config/Backend/Cron.php index 8afc08f14711c884e8cae9e940c7c9af13c33f81..7f09498fe186453189a36ac974026d7d680df2b4 100644 --- a/app/code/Magento/Paypal/Model/System/Config/Backend/Cron.php +++ b/app/code/Magento/Paypal/Model/System/Config/Backend/Cron.php @@ -20,6 +20,7 @@ class Cron extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\App\Config\ValueFactory $configValueFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -29,13 +30,14 @@ class Cron extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\App\Config\ValueFactory $configValueFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_configValueFactory = $configValueFactory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Paypal/Model/System/Config/Backend/MerchantCountry.php b/app/code/Magento/Paypal/Model/System/Config/Backend/MerchantCountry.php index caa265b4e07a3ccdadf35d62d7fda84a64d9629d..de7b66382d195738bcc9ca7076728b32225bcef4 100644 --- a/app/code/Magento/Paypal/Model/System/Config/Backend/MerchantCountry.php +++ b/app/code/Magento/Paypal/Model/System/Config/Backend/MerchantCountry.php @@ -26,6 +26,7 @@ class MerchantCountry extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Directory\Helper\Data $directoryHelper * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -36,6 +37,7 @@ class MerchantCountry extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Directory\Helper\Data $directoryHelper, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -43,7 +45,7 @@ class MerchantCountry extends \Magento\Framework\App\Config\Value array $data = [] ) { $this->directoryHelper = $directoryHelper; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); $this->_storeManager = $storeManager; } diff --git a/app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php b/app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php index 8bd494207b6b70faa97e1f92b775d13ade60c15f..2cc2425387b134c7c67ce9a3098a8be9ad5056c7 100644 --- a/app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php +++ b/app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php @@ -53,6 +53,7 @@ class AddBillingAgreementToSessionObserver implements ObserverInterface if ($agreement->isValid()) { $message = __('Created billing agreement #%1.', $agreement->getReferenceId()); $order->addRelatedObject($agreement); + $agreement->addOrderRelation($order); $this->checkoutSession->setLastBillingAgreementReferenceId($agreement->getReferenceId()); $agreementCreated = true; } else { diff --git a/app/code/Magento/Paypal/Test/Unit/Controller/Billing/Agreement/CancelTest.php b/app/code/Magento/Paypal/Test/Unit/Controller/Billing/Agreement/CancelTest.php index 8d4e0ef4ccfc2a7866aaf11afdb978c2d61f7c07..3a7ae2302c3134ea9a1da44a4d925cacc8bfac80 100644 --- a/app/code/Magento/Paypal/Test/Unit/Controller/Billing/Agreement/CancelTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Controller/Billing/Agreement/CancelTest.php @@ -122,7 +122,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase $this->identicalTo($this->_agreement) ); - $this->_controller->execute(); + $this->_controller->executeInternal(); } public function testExecuteAgreementDoesNotBelongToCustomer() @@ -136,7 +136,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase $this->_registry->expects($this->never())->method('register'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } public function testExecuteAgreementStatusDoesNotAllowToCancel() @@ -157,6 +157,6 @@ class CancelTest extends \PHPUnit_Framework_TestCase $this->identicalTo($this->_agreement) ); - $this->_controller->execute(); + $this->_controller->executeInternal(); } } diff --git a/app/code/Magento/Paypal/Test/Unit/Controller/Ipn/IndexTest.php b/app/code/Magento/Paypal/Test/Unit/Controller/Ipn/IndexTest.php index e3c5c9445e4ddf04b045701bfd4b11c8645e21f8..e34159f711ae8369dc662fe1191bd2c03ded8554 100644 --- a/app/code/Magento/Paypal/Test/Unit/Controller/Ipn/IndexTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Controller/Ipn/IndexTest.php @@ -8,7 +8,7 @@ namespace Magento\Paypal\Test\Unit\Controller\Ipn; class IndexTest extends \PHPUnit_Framework_TestCase { - /** @var Index */ + /** @var \Magento\Paypal\Controller\Ipn\Index */ protected $model; /** @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject */ @@ -44,6 +44,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->request->expects($this->once())->method('getPostValue')->will($this->throwException($exception)); $this->logger->expects($this->once())->method('critical')->with($this->identicalTo($exception)); $this->response->expects($this->once())->method('setHttpResponseCode')->with(500); - $this->model->execute(); + $this->model->executeInternal(); } } diff --git a/app/code/Magento/Paypal/Test/Unit/Controller/Payflow/ReturnUrlTest.php b/app/code/Magento/Paypal/Test/Unit/Controller/Payflow/ReturnUrlTest.php index 96a45ab4cfb23b9d5e8ec462810462d73338a874..b4ae7940e76a67121c7455f56b5e274a01ca0028 100644 --- a/app/code/Magento/Paypal/Test/Unit/Controller/Payflow/ReturnUrlTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Controller/Payflow/ReturnUrlTest.php @@ -202,7 +202,7 @@ class ReturnUrlTest extends \PHPUnit_Framework_TestCase ->with('goto_success_page', true) ->will($this->returnSelf()); - $this->returnUrl->execute(); + $this->returnUrl->executeInternal(); } /** @@ -272,6 +272,6 @@ class ReturnUrlTest extends \PHPUnit_Framework_TestCase ->with('error_msg', __('Your payment has been declined. Please try again.')) ->will($this->returnSelf()); - $this->returnUrl->execute(); + $this->returnUrl->executeInternal(); } } diff --git a/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/RequestSecureTokenTest.php b/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/RequestSecureTokenTest.php index 7285064bcb799660efe6bbabb99bb02b2fb69073..4429f6a9e5df484a16333a03fe0918baa60e6232 100644 --- a/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/RequestSecureTokenTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/RequestSecureTokenTest.php @@ -153,7 +153,7 @@ class RequestSecureTokenTest extends \PHPUnit_Framework_TestCase ->with($resultExpectation) ->willReturnSelf(); - $this->assertEquals($jsonMock, $this->controller->execute()); + $this->assertEquals($jsonMock, $this->controller->executeInternal()); } public function testExecuteTokenRequestException() @@ -193,7 +193,7 @@ class RequestSecureTokenTest extends \PHPUnit_Framework_TestCase ->with($resultExpectation) ->willReturnSelf(); - $this->assertEquals($jsonMock, $this->controller->execute()); + $this->assertEquals($jsonMock, $this->controller->executeInternal()); } public function testExecuteEmptyQuoteError() @@ -220,6 +220,6 @@ class RequestSecureTokenTest extends \PHPUnit_Framework_TestCase ->with($resultExpectation) ->willReturnSelf(); - $this->assertEquals($jsonMock, $this->controller->execute()); + $this->assertEquals($jsonMock, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/ResponseTest.php b/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/ResponseTest.php index 7cddae94159b472654bf6d3ca4ce6bc3d81f569a..b772f2d79bfa999699f2e91b63baf4beadff0212 100644 --- a/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/ResponseTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Controller/Transparent/ResponseTest.php @@ -119,7 +119,7 @@ class ResponseTest extends \PHPUnit_Framework_TestCase ->method('getLayout') ->willReturn($this->getLayoutMock()); - $this->assertInstanceOf('\Magento\Framework\Controller\ResultInterface', $this->object->execute()); + $this->assertInstanceOf('\Magento\Framework\Controller\ResultInterface', $this->object->executeInternal()); } public function testExecuteWithException() @@ -144,7 +144,7 @@ class ResponseTest extends \PHPUnit_Framework_TestCase ->method('getLayout') ->willReturn($this->getLayoutMock()); - $this->assertInstanceOf('\Magento\Framework\Controller\ResultInterface', $this->object->execute()); + $this->assertInstanceOf('\Magento\Framework\Controller\ResultInterface', $this->object->executeInternal()); } /** diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConverterTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConverterTest.php index eb62d570481bde11725647a1ab54858c4ca96dcf..ffd2f141e0a0d7da9bc3f642e581e754d3324d6e 100644 --- a/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConverterTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConverterTest.php @@ -78,22 +78,27 @@ class ConverterTest extends \PHPUnit_Framework_TestCase 'relations' => [ 'payment_test_1' => [ 'test' => [ - 'event' => 'event0', - 'argument' => [], + [ + 'event' => 'event0', + 'argument' => [], + ] ], ], 'payment_test_2' => [ 'test' => [ - 'event' => 'event1', - 'argument' => [ - ], + [ + 'event' => 'event1', + 'argument' => [], + ] ], 'test-two' => [ - 'event' => 'event1', - 'argument' => [ - 'argument1' => 'argument1', - 'argument2' => 'argument2', - ], + [ + 'event' => 'event1', + 'argument' => [ + 'argument1' => 'argument1', + 'argument2' => 'argument2', + ], + ] ], ], ], @@ -122,21 +127,34 @@ class ConverterTest extends \PHPUnit_Framework_TestCase 'relations' => [ 'payment_test_1' => [ 'test' => [ - 'event' => 'event0', - 'argument' => [], + [ + 'event' => 'event0', + 'argument' => [], + ] ], ], 'payment_test_2' => [ 'test' => [ - 'event' => 'event1', - 'argument' => [], + [ + 'event' => 'event1', + 'argument' => [], + ] ], 'test-two' => [ - 'event' => 'event1', - 'argument' => [ - 'argument1' => 'argument1', - 'argument2' => 'argument2', + [ + 'event' => 'event1', + 'argument' => [ + 'argument1' => 'argument1', + 'argument2' => 'argument2', + ], ], + [ + 'event' => 'event2', + 'argument' => [ + 'argument1' => 'argument1', + 'argument2' => 'argument2', + ], + ] ], ], ], diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConvertibleContent/rules.xml b/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConvertibleContent/rules.xml index 297d3c8e620a06480da9c009f1cfc59ae81d746f..4b4c6833d92c92399d29fae6e687472d24cbedfb 100644 --- a/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConvertibleContent/rules.xml +++ b/app/code/Magento/Paypal/Test/Unit/Model/Config/Rules/ConvertibleContent/rules.xml @@ -52,6 +52,10 @@ <argument name="argument1">argument1</argument> <argument name="argument2">argument2</argument> </rule> + <rule type="test-two" event="event2"> + <argument name="argument1">argument1</argument> + <argument name="argument2">argument2</argument> + </rule> </relation> </payment> </rules> diff --git a/app/code/Magento/Paypal/Test/Unit/Model/PayflowproTest.php b/app/code/Magento/Paypal/Test/Unit/Model/PayflowproTest.php index 215680852225b7b3ed5b4507a223fda725b821b5..c6250a24903ee0e71b30669e762a44c00a3eb06c 100644 --- a/app/code/Magento/Paypal/Test/Unit/Model/PayflowproTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Model/PayflowproTest.php @@ -175,7 +175,6 @@ class PayflowproTest extends \PHPUnit_Framework_TestCase $this->payflowpro->fetchTransactionInfo($payment, 'AD49G8N825'); } - /** * @param $response * @dataProvider setTransStatusDataProvider @@ -323,6 +322,22 @@ class PayflowproTest extends \PHPUnit_Framework_TestCase ]; } + /** + * @covers \Magento\Paypal\Model\Payflowpro::refund() + */ + public function testRefund() + { + /** @var \Magento\Sales\Model\Order\Payment $paymentMock */ + $paymentMock = $this->getPaymentMock(); + + $response = $this->execGatewayRequest(); + + $amount = 213.04; + $this->payflowpro->refund($paymentMock, $amount); + static::assertEquals($response['pnref'], $paymentMock->getTransactionId()); + static::assertTrue($paymentMock->getIsTransactionClosed()); + } + /** * Create mock object for store model * @return void @@ -399,16 +414,16 @@ class PayflowproTest extends \PHPUnit_Framework_TestCase 'year' => 18, 'cvv' => 123 ]; - $paymentMock->expects(static::once()) + $paymentMock->expects(static::any()) ->method('getCcNumber') ->willReturn($cardData['number']); - $paymentMock->expects(static::once()) + $paymentMock->expects(static::any()) ->method('getCcExpMonth') ->willReturn($cardData['month']); - $paymentMock->expects(static::once()) + $paymentMock->expects(static::any()) ->method('getCcExpYear') ->willReturn($cardData['year']); - $paymentMock->expects(static::once()) + $paymentMock->expects(static::any()) ->method('getCcCid') ->willReturn($cardData['cvv']); return $paymentMock; diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php index 7feea45b45d589f6485793750e1fe933a6999152..df0fc80c177e45d516f09cee03777bb887b8b3d5 100644 --- a/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php @@ -122,6 +122,7 @@ class AddBillingAgreementToSessionObserverTest extends \PHPUnit_Framework_TestCa )->will( $this->returnValue('agreement reference id') ); + $agreement->expects($this->once())->method('addOrderRelation')->with($order); $order->expects(new MethodInvokedAtIndex(0))->method('addRelatedObject')->with($agreement); $this->_checkoutSession->expects( $this->once() diff --git a/app/code/Magento/Paypal/etc/adminhtml/rules/payment_us.xml b/app/code/Magento/Paypal/etc/adminhtml/rules/payment_us.xml index c187130b357b85e975b93c17f457b30c78bd5f0f..4b5acbe6e073e8259ff3a3b4364c7c5c7ef70fac 100644 --- a/app/code/Magento/Paypal/etc/adminhtml/rules/payment_us.xml +++ b/app/code/Magento/Paypal/etc/adminhtml/rules/payment_us.xml @@ -329,7 +329,10 @@ <argument name="wpp_usuk">wpp_usuk</argument> <argument name="paypal_payflowpro_with_express_checkout">paypal_payflowpro_with_express_checkout</argument> </rule> + <rule type="payflow/bml/disable-conditional-express" event="deactivate-express"/> + <rule type="payflow/bml/disable-conditional-express" event=":load"/> + <rule type="payflow/bml/enable" event="activate-express"/> <rule type="payflow/express/lock-conditional" event=":load"/> <rule type="payflow/bml/lock-conditional" event=":load"/> diff --git a/app/code/Magento/Paypal/view/adminhtml/templates/billing/agreement/form.phtml b/app/code/Magento/Paypal/view/adminhtml/templates/billing/agreement/form.phtml index 0d933a861b54182146e34358253ac033072f4c28..e1f6c1ac9655bcaa39a0e78efcf0023c1564b6ae 100644 --- a/app/code/Magento/Paypal/view/adminhtml/templates/billing/agreement/form.phtml +++ b/app/code/Magento/Paypal/view/adminhtml/templates/billing/agreement/form.phtml @@ -7,7 +7,7 @@ // @codingStandardsIgnoreFile /** @var \Magento\Paypal\Block\Adminhtml\Billing\Agreement\View\Form $block */ ?> -<?php $code = $block->getMethodCode() ?> +<?php $code = $block->escapeHtml($block->getMethodCode()) ?> <fieldset class="form-list" id="payment_form_<?php /* @noEscape */ echo $code; ?>" style="display:none;"> <div class="admin__field _required"> <label for="<?php /* @noEscape */ echo $code; ?>_ba_agreement_id" class="admin__field-label"> diff --git a/app/code/Magento/Paypal/view/adminhtml/templates/payment/form/billing/agreement.phtml b/app/code/Magento/Paypal/view/adminhtml/templates/payment/form/billing/agreement.phtml index d3a6bab129806819191d864a6dde2c60c952703f..66c2184c31012317eaa1cd704b3a3ba3ec0f5385 100644 --- a/app/code/Magento/Paypal/view/adminhtml/templates/payment/form/billing/agreement.phtml +++ b/app/code/Magento/Paypal/view/adminhtml/templates/payment/form/billing/agreement.phtml @@ -7,7 +7,7 @@ // @codingStandardsIgnoreFile /* @var $block \Magento\Paypal\Block\Payment\Form\Billing\Agreement */ ?> -<?php $code = $block->getMethodCode() ?> +<?php $code = $block->escapeHtml($block->getMethodCode()) ?> <fieldset class="admin__fieldset payment-method form-list" id="payment_form_<?php /* @noEscape */ echo $code; ?>" style="display:none;"> <div class="admin__field _required"> diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/predicate/confirm.js b/app/code/Magento/Paypal/view/adminhtml/web/js/predicate/confirm.js index ea426368243185bc14ed8fded1b77387366dddb3..278b101c9c696aabe05c1c62a28d426ce399acaf 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/predicate/confirm.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/predicate/confirm.js @@ -2,25 +2,28 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -define([], function () { - "use strict"; +define(['underscore'], function (_) { + 'use strict'; + return function (solution, message, argument) { var isConfirm = false; _.every(argument, function (name) { - if (solution.solutionsElements[name] - && solution.solutionsElements[name].find(solution.enableButton).val() == 1 + if (solution.solutionsElements[name] && + solution.solutionsElements[name].find(solution.enableButton).val() == 1 ) { isConfirm = true; + return !isConfirm; } + return !isConfirm; }, this); if (isConfirm) { return confirm(message); - } else { - return true; } + + return true; }; }); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rule.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rule.js index b565aa2d66d6b46c2165650567b06fe440291b4e..c1c12344cc54c15ededbd2bb0b80184b09be19fd 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rule.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rule.js @@ -3,18 +3,24 @@ * See COPYING.txt for license details. */ define([ - "uiClass", - "underscore" -], function (Class, _) { - "use strict"; + 'uiClass' +], function (Class) { + 'use strict'; + return Class.extend({ + /** * Constructor + * + * @param {Object} config + * @returns {exports.initialize} */ initialize: function (config) { this.initConfig(config); + return this; }, + /** * To apply the rule */ diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/conflict.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/conflict.js index 4d94f6a2a9ff63cdb9195b4bbdaf012f98ec4cf7..54b263be6421dcdd7534f811c7ef80a02be12e99 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/conflict.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/conflict.js @@ -2,32 +2,42 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -(function() { +(function () { + 'use strict'; + var executed = false; + define([ - 'Magento_Ui/js/modal/alert' - ], function (alert) { - "use strict"; + 'Magento_Ui/js/modal/alert', + 'underscore' + ], function (alert, _) { + return function ($target, $owner, data) { - if ($owner.find(data.enableButton).val() == 1) { - var isDisabled = true; + var isDisabled = true, + newLine = String.fromCharCode(10, 13); + + if ($owner.find(data.enableButton).val() === '1') { _.every(data.argument, function (name) { - if (data.solutionsElements[name] - && data.solutionsElements[name].find(data.enableButton).val() == 1 + if (data.solutionsElements[name] && + data.solutionsElements[name].find(data.enableButton).val() === '1' ) { isDisabled = false; + return isDisabled; } + return isDisabled; }, this); if (!isDisabled && !executed) { executed = true; alert({ - content: "The following error(s) occured:\n\r" - +"Some PayPal solutions conflict.\n\r" - +"Please re-enable the previously enabled payment solutions." + content: 'The following error(s) occurred:' + + newLine + + 'Some PayPal solutions conflict.' + + newLine + + 'Please re-enable the previously enabled payment solutions.' }); } } diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/disable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/disable.js index a5cc52ed96bc2b145d06a638cef1be7135ce920b..54e355580394b5437fb79b6d2ecc6e20be54e184 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/disable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/disable.js @@ -5,7 +5,8 @@ define([ 'Magento_Paypal/js/rules/simple/disable' ], function (disable) { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { disable($target, $owner, data); $target.find(data.enableButton).change(); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional-express.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional-express.js index 8fccdd054558b3e289fd79ec88c52fbb32dac7ce..e3d95340b8bfe534f1da36452b36dcc63bc2e4db 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional-express.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional-express.js @@ -5,9 +5,10 @@ define([ 'Magento_Paypal/js/rules/payflow/bml/disable' ], function (disable) { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { - if ($target.find(data.enableExpress).val() == "0") { + if ($target.find(data.enableExpress).val() === '0') { disable($target, $owner, data); } }; diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional.js index 2c5ae4265342b266e9fe76d9b60994482e371a0e..20182ef0205f4135e853b77b3c937d17f59c66bc 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable-conditional.js @@ -5,9 +5,10 @@ define([ 'Magento_Paypal/js/rules/payflow/bml/disable' ], function (disable) { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { - if ($target.find(data.enableButton).val() == "0") { + if ($target.find(data.enableButton).val() === '0') { disable($target, $owner, data); } }; diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable.js index 873eea979583c30b3fdc10906b968b1c7a1fba00..01d241a0e36197981029a2cfa63eaf1399193967 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/disable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find('label[for="' + $target.find(data.enableBml).attr('id') + '"]').removeClass('enabled'); $target.find(data.enableBml + ' option[value="0"]').prop('selected', true); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable-conditional.js index f5d796397c705af56a476831d3710ff0c66f504b..9770d463f45fc676eeda339a9d7849368822f93f 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable-conditional.js @@ -2,18 +2,21 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -define([], function () { - "use strict"; +define(['underscore'], function (_) { + 'use strict'; + return function ($target, $owner, data) { var isDisabled = true; _.every(data.argument, function (name) { - if (data.solutionsElements[name] - && data.solutionsElements[name].find(data.enableButton).val() == 1 + if (data.solutionsElements[name] && + data.solutionsElements[name].find(data.enableButton).val() === '1' ) { isDisabled = false; + return isDisabled; } + return isDisabled; }, this); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable.js index e7710d80cf07fc84a6ee9769ee8bb4388c155921..3ddfc3b0f60446334670836e98fffcf2cdac2dd4 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/enable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find(data.enableBml).prop('disabled', false); $target.find(data.enableBml + ' option[value="1"]').prop('selected', true); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/lock-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/lock-conditional.js index 09007924b0b4bb53f90f968717766af6e5ba9d74..607c56984e7dc6f4047a20a55b8a262442bd69ba 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/lock-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/bml/lock-conditional.js @@ -3,9 +3,10 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { - if ($target.find(data.enableButton).val() == "0") { + if ($target.find(data.enableButton).val() === '0') { $target.find(data.enableBml).prop('disabled', true); } }; diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable-conditional.js index f37306731b8857896fcade130783a5de86ccbe20..94b178c071642e09b80771094946ba7522541815 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable-conditional.js @@ -5,9 +5,10 @@ define([ 'Magento_Paypal/js/rules/payflow/express/disable' ], function (disableExpress) { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { - if ($target.find(data.enableButton).val() == "0") { + if ($target.find(data.enableButton).val() === '0') { disableExpress($target, $owner, data); $target.find(data.enableExpress).change(); } diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable.js index 4d8b6fa3ca39918293381d36e23d1314304f1439..77649695f3c11394c98f95d7e50bd57d4857971a 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/disable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find('label[for="' + $target.find(data.enableExpress).attr('id') + '"]').removeClass('enabled'); $target.find(data.enableExpress + ' option[value="0"]').prop('selected', true); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable-conditional.js index cc76875080a4ee00e98e93c56b182982bd06e233..ea9fc5f2d0ccbe6741615fed4bb9cd5cb0c85b74 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable-conditional.js @@ -2,18 +2,21 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -define([], function () { - "use strict"; +define(['underscore'], function (_) { + 'use strict'; + return function ($target, $owner, data) { var isDisabled = true; _.every(data.argument, function (name) { - if (data.solutionsElements[name] - && data.solutionsElements[name].find(data.enableButton).val() == 1 + if (data.solutionsElements[name] && + data.solutionsElements[name].find(data.enableButton).val() === '1' ) { isDisabled = false; + return isDisabled; } + return isDisabled; }, this); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable.js index 456b4a6ac78ddd8bc591653a45aaf247303f1d2a..6dc1a0a49cfba72168b9e0d69b067b9dab2fa380 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/enable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find(data.enableExpress).prop('disabled', false); $target.find(data.enableExpress + ' option[value="1"]').prop('selected', true); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/lock-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/lock-conditional.js index 476af3b58366a86ffef757addeb4230a4f0436de..c07a0b5cf713e2b7c65bda537e331e47980f6e37 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/lock-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/payflow/express/lock-conditional.js @@ -3,9 +3,10 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { - if ($target.find(data.enableButton).val() == "0") { + if ($target.find(data.enableButton).val() === '0') { $target.find(data.enableExpress).prop('disabled', true); } }; diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable-conditional.js index ed327a4678fbc1db79bc1250cee0557aa06f9e5f..d4b8d4100e56d5e9e5e2ffc134ae79e6a5445859 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable-conditional.js @@ -5,9 +5,10 @@ define([ 'Magento_Paypal/js/rules/paypal/bml/disable' ], function (disable) { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { - if ($target.find(data.enableButton).val() == "0") { + if ($target.find(data.enableButton).val() === '0') { disable($target, $owner, data); } }; diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable.js index 124c325c445dce34969c7e02a4ad89455daedbcf..c6ef93d332fb64b102a4ec2ba30370e5cc61d384 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/disable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find('label[for="' + $target.find(data.enableBmlPayPal).attr('id') + '"]').removeClass('enabled'); $target.find(data.enableBmlPayPal + ' option[value="0"]').prop('selected', true); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/enable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/enable.js index 1beb826bf39a003926868e7b420537a03686da50..90f7561734f14f34d21e126ba7df9d2d9926dadc 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/enable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/bml/enable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find(data.enableBmlPayPal).prop('disabled', false); $target.find(data.enableBmlPayPal + ' option[value="1"]').prop('selected', true); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/disable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/disable.js index 8421803de67a2e84fc1030fcb60ab6909547b814..25e7b611a24692ed05b544bb8bcf8e80b05862b3 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/disable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/disable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find(data.enableButton + ' option[value="0"]').prop('selected', true); $target.find('label.enabled').removeClass('enabled'); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration-conditional.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration-conditional.js index bd2c2f62a29f5b20a08910fdf3e2504c584bfdff..55a82e3cc19322136dec33e5b6c14e41ec0525f8 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration-conditional.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration-conditional.js @@ -3,19 +3,23 @@ * See COPYING.txt for license details. */ define([ - 'Magento_Paypal/js/rules/paypal/express/lock-configuration' -], function (lockConfiguration) { - "use strict"; + 'Magento_Paypal/js/rules/paypal/express/lock-configuration', + 'underscore' +], function (lockConfiguration, _) { + 'use strict'; + return function ($target, $owner, data) { var isDisabled = true; _.every(data.argument, function (name) { - if (data.solutionsElements[name] - && data.solutionsElements[name].find(data.enableButton).val() == 1 + if (data.solutionsElements[name] && + data.solutionsElements[name].find(data.enableButton).val() === '1' ) { isDisabled = false; + return isDisabled; } + return isDisabled; }, this); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration.js index e549bda0adf3db7d2a8e8f0f626a72097f96530c..351f799b57b28a3739d23f37cb46bc0afaedafe8 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/lock-configuration.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find(data.buttonConfiguration).addClass('disabled') .attr('disabled', 'disabled'); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/mark-disable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/mark-disable.js index 6bcf9a559b39a05e5d9a76ef35afb8e2b029d81a..7943c843b13cde484d9d0baf1149110ac4885754 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/mark-disable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/mark-disable.js @@ -3,19 +3,23 @@ * See COPYING.txt for license details. */ define([ - 'Magento_Paypal/js/rules/simple/disable' -], function (disable) { - "use strict"; + 'Magento_Paypal/js/rules/simple/disable', + 'underscore' +], function (disable, _) { + 'use strict'; + return function ($target, $owner, data) { var isDisabled = true; _.every(data.argument, function (name) { - if (data.solutionsElements[name] - && data.solutionsElements[name].find(data.enableButton).val() == 1 + if (data.solutionsElements[name] && + data.solutionsElements[name].find(data.enableButton).val() === '1' ) { isDisabled = false; + return isDisabled; } + return isDisabled; }, this); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/unlock-configuration.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/unlock-configuration.js index 413a8bf08b1d013bfc0c1b0d7f4d49beb25b2997..fda160c6d94f4babe5257180db769a37aa667537 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/unlock-configuration.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/paypal/express/unlock-configuration.js @@ -2,18 +2,21 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -define([], function () { - "use strict"; +define(['underscore'], function (_) { + 'use strict'; + return function ($target, $owner, data) { var isUnlock = true; _.every(data.argument, function (name) { - if (data.solutionsElements[name] - && data.solutionsElements[name].find(data.enableButton).val() == 1 + if (data.solutionsElements[name] && + data.solutionsElements[name].find(data.enableButton).val() === '1' ) { isUnlock = false; + return isUnlock; } + return isUnlock; }, this); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/disable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/disable.js index 4b7c4234dd3ede12113f544c9f3c76a3cd72ed41..7531d4fae1aaab06dc14f3ffd611b7bc63508e53 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/disable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/disable.js @@ -3,7 +3,8 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; + 'use strict'; + return function ($target, $owner, data) { $target.find(data.enableButton + ' option[value="0"]').prop('selected', true); $target.find('label.enabled').removeClass('enabled'); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/mark-enable.js b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/mark-enable.js index b686f1be7c949c484de9f9dc416611c4459fcb2b..1dec21bb5b4931c2109fe2c3ab4adec651c06c3d 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/mark-enable.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/rules/simple/mark-enable.js @@ -3,8 +3,9 @@ * See COPYING.txt for license details. */ define([], function () { - "use strict"; - return function ($target, $owner, data) { + 'use strict'; + + return function ($target) { $target.find('.section-config').addClass('enabled'); }; }); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/solution.js b/app/code/Magento/Paypal/view/adminhtml/web/js/solution.js index 787d9e066cdbe0234bb434f57d39919d00639181..4f8de68474d7a53dc3af22f5c73c12e4ce28ef98 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/solution.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/solution.js @@ -3,39 +3,47 @@ * See COPYING.txt for license details. */ define([ - "jquery", - "uiClass", - "Magento_Paypal/js/rule", - "mageUtils", - "underscore" + 'jquery', + 'uiClass', + 'Magento_Paypal/js/rule', + 'mageUtils', + 'underscore' ], function ($, Class, Rule, utils, _) { - "use strict"; + 'use strict'; + return Class.extend({ defaults: { + /** * The event corresponding to the state change */ systemEvent: 'change', + /** * The rules applied after the page is loaded */ afterLoadRules: [], + /** * An attribute of the element responsible for the activation of the payment method (data attribute) */ enableButton: '[data-enable="payment"]', + /** * An attribute of the element responsible for the activation of the Payflow Express (data attribute) */ enableExpress: '[data-enable="express"]', + /** * An attribute of the element responsible for the activation of the Payflow Bml (data attribute) */ enableBml: '[data-enable="bml"]', + /** * An attribute of the element responsible for the activation of the PayPal Bml (data attribute) */ enableBmlPayPal: '[data-enable="bml-api"]', + /** * Templates element selectors */ @@ -43,100 +51,149 @@ define([ elementSelector: 'div.section-config tr[id$="${ $.identifier }"]:first' } }, + /** * Constructor + * + * @param {Object} config + * @param {String} identifier + * @returns {exports.initialize} */ initialize: function (config, identifier) { this.initConfig(config); this.$self = this.createElement(identifier); + return this; }, + /** * Initialization events + * + * @returns {exports.initEvents} */ initEvents: function () { _.each(this.config.events, function (elementEvents, selector) { + var solution = this, selectorButton = solution.$self.find(selector), $self = solution.$self, events = elementEvents; - selectorButton.on(solution.systemEvent, function (event) { + + selectorButton.on(solution.systemEvent, function () { _.each(events, function (elementEvent, name) { + var predicate = elementEvent.predicate, - result = true; + result = true, + + /** + * @param {Function} functionPredicate + */ + predicateCallback = function (functionPredicate) { + result = functionPredicate(solution, predicate.message, predicate.argument); + + if (result) { + $self.trigger(name); + } else { + $self.trigger(predicate.event); + } + }; + if (solution.getValue($(this)) === elementEvent.value) { if (predicate.name) { require([ 'Magento_Paypal/js/predicate/' + predicate.name - ], function (functionPredicate) { - result = functionPredicate(solution, predicate.message, predicate.argument); - if (result) { - $self.trigger(name); - } else { - $self.trigger(predicate.event); - } - }); + ], predicateCallback); } else { $self.trigger(name); } - } + } }, this); - }); + }); }, this); + return this; }, + /** + * @param {Object} $element + * @returns {*} + */ getValue: function ($element) { if ($element.is(':checkbox')) { return $element.prop('checked') ? '1' : '0'; } + return $element.val(); }, + /** * Adding event listeners + * + * @returns {exports.addListeners} */ addListeners: function () { + _.each(this.config.relations, function (rules, targetName) { + var $target = this.createElement(targetName); - _.each(rules, function (rule, name) { - var handler = new Rule({ - name :name, - $target: $target, - $owner: this.$self, - data: { - buttonConfiguration: this.buttonConfiguration, - enableButton: this.enableButton, - enableExpress: this.enableExpress, - enableBml: this.enableBml, - enableBmlPayPal: this.enableBmlPayPal, - solutionsElements: this.solutionsElements, - argument: rule.argument + + _.each(rules, function (instances, instanceName) { + + _.each(instances, function (instance) { + var handler = new Rule({ + name: instanceName, + $target: $target, + $owner: this.$self, + data: { + buttonConfiguration: this.buttonConfiguration, + enableButton: this.enableButton, + enableExpress: this.enableExpress, + enableBml: this.enableBml, + enableBmlPayPal: this.enableBmlPayPal, + solutionsElements: this.solutionsElements, + argument: instance.argument + } + }); + + if (instance.event === ':load') { + this.afterLoadRules.push(handler); + + return; } - }); - if (rule.event === ':load') { - this.afterLoadRules.push(handler); - return; - } - this.$self.on(rule.event, _.bind(handler.apply, handler)); + + this.$self.on(instance.event, _.bind(handler.apply, handler)); + }, this); }, this); }, this); + return this; }, + /** * Create a jQuery element according to selector + * + * @param {String} identifier + * @returns {*} */ createElement: function (identifier) { - if (':self' === identifier) { + if (identifier === ':self') { return this.$self; } - var selector = utils.template(this.templates.elementSelector, {identifier: identifier}); - return $(selector); + + return $(utils.template(this.templates.elementSelector, { + 'identifier': identifier + })); }, + /** * Assign solutions elements + * + * @param {Object} elements + * @returns {exports.setSolutionsElements} */ setSolutionsElements: function (elements) { this.solutionsElements = elements; + return this; } }); diff --git a/app/code/Magento/Paypal/view/adminhtml/web/js/solutions.js b/app/code/Magento/Paypal/view/adminhtml/web/js/solutions.js index b1e124aca387a556069a776721a90d0c529db62a..f92a531e91414da86c78fcc564d8accf96a32191 100644 --- a/app/code/Magento/Paypal/view/adminhtml/web/js/solutions.js +++ b/app/code/Magento/Paypal/view/adminhtml/web/js/solutions.js @@ -3,47 +3,64 @@ * See COPYING.txt for license details. */ define([ - "jquery", - "uiClass", - "Magento_Paypal/js/solution", - "underscore" + 'jquery', + 'uiClass', + 'Magento_Paypal/js/solution', + 'underscore' ], function ($, Class, Solution, _) { - "use strict"; + 'use strict'; + return Class.extend({ defaults: { + /** * Initialized solutions */ solutions: {}, + /** * The elements of created solutions */ solutionsElements: {}, + /** * The selector element responsible for configuration of payment method (CSS class) */ buttonConfiguration: '.button.action-configure' }, + /** * Constructor + * + * @param {Object} config + * @returns {exports.initialize} */ initialize: function (config) { this.initConfig(config) .initSolutions(); + return this; }, + /** * Initialization and configuration solutions + * + * @returns {exports.initSolutions} */ initSolutions: function () { _.each(this.config.solutions, this.addSolution, this); this.initializeSolutions() .wipeButtonsConfiguration(); _.each(this.solutions, this.applicationRules); + return this; }, + /** * The creation and addition of the solution according to the configuration + * + * @param {Object} solution + * @param {String} identifier */ addSolution: function (solution, identifier) { this.solutions[identifier] = new Solution({ @@ -52,6 +69,7 @@ define([ }, identifier); this.solutionsElements[identifier] = this.solutions[identifier].$self; }, + /** * Wiping buttons configuration of the payment method */ @@ -59,16 +77,22 @@ define([ $(this.buttonConfiguration).removeClass('disabled') .removeAttr('disabled'); }, + /** * Application of the rules + * + * @param {Object} solution */ applicationRules: function (solution) { _.each(solution.afterLoadRules, function (rule) { rule.apply(); }); }, + /** * Initialize solutions + * + * @returns {exports.initializeSolutions} */ initializeSolutions: function () { _.each(this.solutions, function (solution) { @@ -76,6 +100,7 @@ define([ .initEvents() .addListeners(); }, this); + return this; } }); diff --git a/app/code/Magento/Paypal/view/frontend/templates/billing/agreement/view.phtml b/app/code/Magento/Paypal/view/frontend/templates/billing/agreement/view.phtml index c026c3fca5e1f8fe7fbcb4a266d1267fe89d9f0b..835f442c0daadfb6a9127ddba69865d20a9ff235 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/billing/agreement/view.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/billing/agreement/view.phtml @@ -105,7 +105,7 @@ $relatedOrders = $block->getRelatedOrders(); )); ?> </td> <td data-th="<?php echo $block->escapeHtml(__('Order Total')); ?>" class="col total"> - <?php echo $block->escapeHtml($block->getOrderItemValue($order, 'order_total')); ?> + <?php /* @noEscape */ echo $block->getOrderItemValue($order, 'order_total'); ?> </td> <td data-th="<?php echo $block->escapeHtml(__('Order Status')); ?>" class="col status"> <?php echo $block->escapeHtml($block->getOrderItemValue( diff --git a/app/code/Magento/Paypal/view/frontend/templates/express/review.phtml b/app/code/Magento/Paypal/view/frontend/templates/express/review.phtml index 892e8771da7dce8e89e43717a2cf0fbfd5f626da..970607145f06b74c26336fbb743501da84e7e83d 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/express/review.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/express/review.phtml @@ -84,7 +84,10 @@ </strong> <div class="box-content"> <address> - <?php /* @noEscape */ echo $block->renderAddress($block->getShippingAddress()); ?> + <?php echo $block->escapeHtml( + $block->renderAddress($block->getShippingAddress()), + ['br'] + ); ?> </address> </div> <?php if ($block->getCanEditShippingAddress()): ?> diff --git a/app/code/Magento/Paypal/view/frontend/templates/express/shortcut.phtml b/app/code/Magento/Paypal/view/frontend/templates/express/shortcut.phtml index fa9afa80e5fa8abd356ed6ccfe3d54e80e3638a4..5858917ed8964d3c56b696e78d787f33f411819b 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/express/shortcut.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/express/shortcut.phtml @@ -43,9 +43,7 @@ if ($block->getConfirmationUrl() || $block->getIsInCatalogProduct()) { { ".paypal-logo.<?php /* @noEscape */ echo $shortcutHtmlId; ?>": { "paypalCheckout": { - "confirmMessage": "<?php /* @noEscape */ echo $block->escapeJsQuote( - $block->getConfirmationMessage() - ); ?>", + "confirmMessage": "<?php /* @noEscape */ echo $block->escapeJsQuote($block->getConfirmationMessage()); ?>", "confirmUrl": "<?php /* @noEscape */ echo !empty($confirmationUrl) ? $confirmationUrl : false; ?>", "isCatalogProduct": "<?php /* @noEscape */ echo !empty($isInCatalogProduct) ? (bool)$isInCatalogProduct : false; diff --git a/app/code/Magento/Paypal/view/frontend/templates/hss/info.phtml b/app/code/Magento/Paypal/view/frontend/templates/hss/info.phtml index 69bf40f9314e3efe35056fa5b0b1bc1915f61c33..c29f82418f83748e61f17632a13f6c891276bf38 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/hss/info.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/hss/info.phtml @@ -11,7 +11,8 @@ * @see \Magento\Paypal\Block\Payflow\Link\Info */ ?> -<div id="payment_form_<?php /* @noEscape */ echo $block->getMethodCode(); ?>" style="display:none" class="hss items"> +<div id="payment_form_<?php echo $block->escapeHtml($block->getMethodCode()); ?>" + style="display:none" class="hss items"> <?php echo $block->escapeHtml(__( 'You will be required to enter your payment details after you place an order.' )); ?> diff --git a/app/code/Magento/Paypal/view/frontend/templates/payflowadvanced/info.phtml b/app/code/Magento/Paypal/view/frontend/templates/payflowadvanced/info.phtml index a11a3786c2c2d9f40e13dddb8b5546c6d546016c..252622af0f40880c76412aa4a06e29d066275e05 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/payflowadvanced/info.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/payflowadvanced/info.phtml @@ -9,7 +9,7 @@ * @var \Magento\Paypal\Block\Payflow\Advanced\Form $block */ ?> -<fieldset id="payment_form_<?php /* @noEscape */ echo $block->getMethodCode(); ?>" style="display:none" +<fieldset id="payment_form_<?php echo $block->escapeHtml($block->getMethodCode()); ?>" style="display:none" class="fieldset payflowadvanced items redirect"> <div> <?php echo $block->escapeHtml(__('You will be required to enter your payment details after you place an order.')); ?> diff --git a/app/code/Magento/Paypal/view/frontend/templates/payflowlink/info.phtml b/app/code/Magento/Paypal/view/frontend/templates/payflowlink/info.phtml index 629141539e2aacd9865c42e85ec04396fc77a999..7296aaabccf4ea15d86f1be1ef07fcf62950b08d 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/payflowlink/info.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/payflowlink/info.phtml @@ -8,7 +8,7 @@ * @var \Magento\Paypal\Block\Payflow\Link\Form $block */ ?> -<div class="payflowlink items" id="payment_form_<?php /* @noEscape */ echo $block->getMethodCode(); ?>" +<div class="payflowlink items" id="payment_form_<?php echo $block->escapeHtml($block->getMethodCode()); ?>" style="display:none"> <?php echo $block->escapeHtml(__('You will be required to enter your payment details after you place an order.'));?> </div> diff --git a/app/code/Magento/Paypal/view/frontend/templates/payment/form/billing/agreement.phtml b/app/code/Magento/Paypal/view/frontend/templates/payment/form/billing/agreement.phtml index 834a623d65b3f0b59a37ae59e2cab5e67e3e0695..7eb9423ce3be47a5d0528d786e59d898e0eb5aa3 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/payment/form/billing/agreement.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/payment/form/billing/agreement.phtml @@ -8,7 +8,7 @@ /** * @var \Magento\Paypal\Block\Payment\Form\Billing\Agreement $block */ -$code = $block->getMethodCode(); +$code = $block->escapeHtml($block->getMethodCode()); ?> <div class="field items required" id="payment_form_<?php /* @noEscape */ echo $code; ?>" style="display:none;"> <label for="<?php /* @noEscape */ echo $code; ?>_ba_agreement_id" class="label"> diff --git a/app/code/Magento/Paypal/view/frontend/templates/payment/redirect.phtml b/app/code/Magento/Paypal/view/frontend/templates/payment/redirect.phtml index 5397d9aba46151905be8f46ee6da030f2567c5eb..b10e2f975964f649791f9c5788d57b76819beb17 100644 --- a/app/code/Magento/Paypal/view/frontend/templates/payment/redirect.phtml +++ b/app/code/Magento/Paypal/view/frontend/templates/payment/redirect.phtml @@ -12,7 +12,7 @@ $code = $block->escapeHtml($block->getBillingAgreementCode()); ?> <fieldset class="fieldset paypal items redirect" style="display:none;" - id="payment_form_<?php /* @noEscape */ echo $block->getMethodCode(); ?>"> + id="payment_form_<?php echo $block->escapeHtml($block->getMethodCode()); ?>"> <div><?php echo $block->escapeHtml($block->getRedirectMessage()); ?></div> <?php ?> <?php if ($code): ?> diff --git a/app/code/Magento/Persistent/Controller/Index/ExpressCheckout.php b/app/code/Magento/Persistent/Controller/Index/ExpressCheckout.php index fbe7be4e45268898ad71225ccd30f755591f437e..2defce5a7187b0c213a0fce4c944a7c940f85651 100644 --- a/app/code/Magento/Persistent/Controller/Index/ExpressCheckout.php +++ b/app/code/Magento/Persistent/Controller/Index/ExpressCheckout.php @@ -18,7 +18,7 @@ class ExpressCheckout extends Index * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $this->messageManager->addNotice(__('Your shopping cart has been updated with new prices.')); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Persistent/Controller/Index/SaveMethod.php b/app/code/Magento/Persistent/Controller/Index/SaveMethod.php index 64e32cb94724642e429b84d55d61c742e6f0e619..e83d6085b0706a0575b8f2224005dd4020879878 100644 --- a/app/code/Magento/Persistent/Controller/Index/SaveMethod.php +++ b/app/code/Magento/Persistent/Controller/Index/SaveMethod.php @@ -15,7 +15,7 @@ class SaveMethod extends Index * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { if ($this->sessionHelper->isPersistent()) { $this->sessionHelper->getSession()->removePersistentCookie(); diff --git a/app/code/Magento/Persistent/Controller/Index/UnsetCookie.php b/app/code/Magento/Persistent/Controller/Index/UnsetCookie.php index 369c63f7de88093d062f2625bab0558d86f4ad15..eb45cfbb1761f1844e9009c3aae8be7481e71356 100644 --- a/app/code/Magento/Persistent/Controller/Index/UnsetCookie.php +++ b/app/code/Magento/Persistent/Controller/Index/UnsetCookie.php @@ -15,7 +15,7 @@ class UnsetCookie extends Index * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { if ($this->sessionHelper->isPersistent()) { $this->cleanup(); diff --git a/app/code/Magento/ProductAlert/Controller/Add.php b/app/code/Magento/ProductAlert/Controller/Add.php index 78ceff1e6299dd504df3ef39255657404d4acda5..299dedbdbf6442ea25a89d43497857556a38fb2e 100644 --- a/app/code/Magento/ProductAlert/Controller/Add.php +++ b/app/code/Magento/ProductAlert/Controller/Add.php @@ -35,7 +35,7 @@ abstract class Add extends Action * @param \Magento\Framework\App\RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { if (!$this->customerSession->authenticate()) { $this->_actionFlag->set('', 'no-dispatch', true); @@ -43,6 +43,6 @@ abstract class Add extends Action $this->customerSession->setBeforeUrl($this->_redirect->getRefererUrl()); } } - return parent::dispatch($request); + return parent::execute($request); } } diff --git a/app/code/Magento/ProductAlert/Controller/Add/Price.php b/app/code/Magento/ProductAlert/Controller/Add/Price.php index 7ee60ebf79966894a1d6f86911ddeadfc00afa1b..b6a79a78f46e82573eadba610778cf10802956a5 100644 --- a/app/code/Magento/ProductAlert/Controller/Add/Price.php +++ b/app/code/Magento/ProductAlert/Controller/Add/Price.php @@ -63,7 +63,7 @@ class Price extends AddController /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $backUrl = $this->getRequest()->getParam(Action::PARAM_NAME_URL_ENCODED); $productId = (int)$this->getRequest()->getParam('product_id'); diff --git a/app/code/Magento/ProductAlert/Controller/Add/Stock.php b/app/code/Magento/ProductAlert/Controller/Add/Stock.php index ea0cb55cc15848258372be9acc726a42c0ab5101..0756c5168bd8426b550256bd4e9fa133761b3bbc 100644 --- a/app/code/Magento/ProductAlert/Controller/Add/Stock.php +++ b/app/code/Magento/ProductAlert/Controller/Add/Stock.php @@ -37,7 +37,7 @@ class Stock extends AddController /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $backUrl = $this->getRequest()->getParam(Action::PARAM_NAME_URL_ENCODED); $productId = (int)$this->getRequest()->getParam('product_id'); diff --git a/app/code/Magento/ProductAlert/Controller/Add/TestObserver.php b/app/code/Magento/ProductAlert/Controller/Add/TestObserver.php index 96a357be0e8ab3c11263a468ac73eac581650c7a..87a3ba10cf989b547f62cb8580499250b890558d 100644 --- a/app/code/Magento/ProductAlert/Controller/Add/TestObserver.php +++ b/app/code/Magento/ProductAlert/Controller/Add/TestObserver.php @@ -13,7 +13,7 @@ class TestObserver extends AddController /** * @return void */ - public function execute() + public function executeInternal() { $object = new DataObject(); /** @var \Magento\ProductAlert\Model\Observer $observer */ diff --git a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php index 46ba80f4b3a55cf98baf0fecfaad40f92b2432b1..c0050834b692f82dd97bc8fe3561f7fb5ce95a5b 100644 --- a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php +++ b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php @@ -36,7 +36,7 @@ class Price extends UnsubscribeController /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $productId = (int)$this->getRequest()->getParam('product'); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/ProductAlert/Controller/Unsubscribe/PriceAll.php b/app/code/Magento/ProductAlert/Controller/Unsubscribe/PriceAll.php index 1dafba13dd766c8503e5b270dd64ee8a0bf86bba..0055633db681add71072901d43d3daa63c53129b 100644 --- a/app/code/Magento/ProductAlert/Controller/Unsubscribe/PriceAll.php +++ b/app/code/Magento/ProductAlert/Controller/Unsubscribe/PriceAll.php @@ -13,7 +13,7 @@ class PriceAll extends UnsubscribeController /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { try { $this->_objectManager->create('Magento\ProductAlert\Model\Price') diff --git a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php index 3052fcfe0abefb78c1138f0da0c5ea86d2607db1..50284d3b04d8a8f6fb559aac2ea82151c5d4c302 100644 --- a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php +++ b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php @@ -36,7 +36,7 @@ class Stock extends UnsubscribeController /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $productId = (int)$this->getRequest()->getParam('product'); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/ProductAlert/Controller/Unsubscribe/StockAll.php b/app/code/Magento/ProductAlert/Controller/Unsubscribe/StockAll.php index 63872d2cdd937528bd98bf16c4738364a018ff14..7b4eddfc7c0d72d2a9fc243bbf4ffe5297f65fca 100644 --- a/app/code/Magento/ProductAlert/Controller/Unsubscribe/StockAll.php +++ b/app/code/Magento/ProductAlert/Controller/Unsubscribe/StockAll.php @@ -13,7 +13,7 @@ class StockAll extends UnsubscribeController /** * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { try { $this->_objectManager->create('Magento\ProductAlert\Model\Stock') diff --git a/app/code/Magento/ProductVideo/Block/Adminhtml/Product/Edit/NewVideo.php b/app/code/Magento/ProductVideo/Block/Adminhtml/Product/Edit/NewVideo.php index fbc2132db4999b1ee5993bb86656f4f43142f606..473e44373b7ed4f27d152d1e9c0482afc638d5bf 100644 --- a/app/code/Magento/ProductVideo/Block/Adminhtml/Product/Edit/NewVideo.php +++ b/app/code/Magento/ProductVideo/Block/Adminhtml/Product/Edit/NewVideo.php @@ -12,11 +12,21 @@ use Magento\Framework\Data\Form\Element\Fieldset; */ class NewVideo extends \Magento\Backend\Block\Widget\Form\Generic { + /** + * Anchor is product video + */ + const PATH_ANCHOR_PRODUCT_VIDEO = 'catalog_product_video-link'; + /** * @var \Magento\ProductVideo\Helper\Media */ protected $mediaHelper; + /** + * @var \Magento\Framework\UrlInterface + */ + protected $urlBuilder; + /** * @var \Magento\Framework\Json\EncoderInterface */ @@ -24,22 +34,23 @@ class NewVideo extends \Magento\Backend\Block\Widget\Form\Generic /** * @param \Magento\Backend\Block\Template\Context $context - * @param \Magento\ProductVideo\Helper\Media $mediaHelper - * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory + * @param \Magento\ProductVideo\Helper\Media $mediaHelper + * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder * @param array $data */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\Data\FormFactory $formFactory, - \Magento\Framework\Json\EncoderInterface $jsonEncoder, \Magento\ProductVideo\Helper\Media $mediaHelper, + \Magento\Framework\Json\EncoderInterface $jsonEncoder, array $data = [] ) { parent::__construct($context, $registry, $formFactory, $data); $this->mediaHelper = $mediaHelper; + $this->urlBuilder = $context->getUrlBuilder(); $this->jsonEncoder = $jsonEncoder; $this->setUseContainer(true); } @@ -104,7 +115,8 @@ class NewVideo extends \Magento\Backend\Block\Widget\Form\Generic 'title' => __('Url'), 'required' => true, 'name' => 'video_url', - 'note' => 'Youtube or Vimeo supported', + 'note' => $this->getNoteVideoUrl(), + ] ); @@ -158,7 +170,7 @@ class NewVideo extends \Magento\Backend\Block\Widget\Form\Generic 'label' => '', 'title' => __('Get Video Information'), 'name' => 'new_video_get', - 'value' => 'Get Video Information', + 'value' => __('Get Video Information'), 'class' => 'action-default' ] ); @@ -248,4 +260,38 @@ class NewVideo extends \Magento\Backend\Block\Widget\Form\Generic } return $this; } + + /** + * Get note for video url + * + * @return \Magento\Framework\Phrase + */ + protected function getNoteVideoUrl() + { + $result = __('YouTube and Vimeo supported.'); + if ($this->mediaHelper->getYouTubeApiKey() === null) { + $result = __( + 'Vimeo supported.<br />' + . 'To add YouTube video, please <a href="%1">enter YouTube API Key</a> first.', + $this->getConfigApiKeyUrl() + ); + } + return $result; + } + + /** + * Get url for config params + * + * @return string + */ + protected function getConfigApiKeyUrl() + { + return $this->urlBuilder->getUrl( + 'adminhtml/system_config/edit', + [ + 'section' => 'catalog', + '_fragment' => self::PATH_ANCHOR_PRODUCT_VIDEO + ] + ); + } } diff --git a/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php b/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php index b0cd6ca9b166f9b9101fd8324e72176ace9598b5..cf5f42da71cf4efe27499956c17c5360ed767013 100644 --- a/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php +++ b/app/code/Magento/ProductVideo/Controller/Adminhtml/Product/Gallery/RetrieveImage.php @@ -8,6 +8,9 @@ namespace Magento\ProductVideo\Controller\Adminhtml\Product\Gallery; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\File\Uploader; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class RetrieveImage extends \Magento\Backend\App\Action { /** @@ -70,14 +73,15 @@ class RetrieveImage extends \Magento\Backend\App\Action /** * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { + $baseTmpMediaPath = $this->mediaConfig->getBaseTmpMediaPath(); try { $remoteFileUrl = $this->getRequest()->getParam('remote_image'); - $originalFileName = $this->parseOriginalFileName($remoteFileUrl); - $localFileName = $this->localFileName($originalFileName); - $localTmpFileName = $this->generateTmpFileName($localFileName); - $localFileMediaPath = $this->appendFileSystemPath($localTmpFileName); + $originalFileName = basename($remoteFileUrl); + $localFileName = Uploader::getCorrectFileName($originalFileName); + $localTmpFileName = Uploader::getDispretionPath($localFileName) . DIRECTORY_SEPARATOR . $localFileName; + $localFileMediaPath = $baseTmpMediaPath . ($localTmpFileName); $localUniqueFileMediaPath = $this->appendNewFileName($localFileMediaPath); $this->retrieveRemoteImage($remoteFileUrl, $localUniqueFileMediaPath); $localFileFullPath = $this->appendAbsoluteFileSystemPath($localUniqueFileMediaPath); @@ -101,7 +105,7 @@ class RetrieveImage extends \Magento\Backend\App\Action protected function appendResultSaveRemoteImage($fileName) { $fileInfo = pathinfo($fileName); - $tmpFileName = $this->generateTmpFileName($fileInfo['basename']); + $tmpFileName = Uploader::getDispretionPath($fileInfo['basename']) . DIRECTORY_SEPARATOR . $fileInfo['basename']; $result['name'] = $fileInfo['basename']; $result['type'] = $this->imageAdapter->getMimeType(); $result['error'] = 0; @@ -111,26 +115,22 @@ class RetrieveImage extends \Magento\Backend\App\Action return $result; } - /** - * @param string $fileName - * @return string - */ - protected function localFileName($fileName) - { - $fileName = Uploader::getCorrectFileName($fileName); - return $fileName; - } - /** * @param string $fileUrl * @param string $localFilePath - * @return bool|void + * @return void + * @throws \Magento\Framework\Exception\LocalizedException */ protected function retrieveRemoteImage($fileUrl, $localFilePath) { $this->curl->setConfig(['header' => false]); $this->curl->write('GET', $fileUrl); $image = $this->curl->read(); + if (empty($image)) { + throw new \Magento\Framework\Exception\LocalizedException( + __('Could not get video information. Please check your connection and try again.') + ); + } $this->fileUtility->saveFile($localFilePath, $image); } @@ -146,43 +146,6 @@ class RetrieveImage extends \Magento\Backend\App\Action return $fileInfo['dirname'] . DIRECTORY_SEPARATOR . $fileName; } - /** - * @param string $fileUrl - * @return string - */ - protected function parseOriginalFileName($fileUrl) - { - return basename($fileUrl); - } - - /** - * @param string $fileName - * @return string - */ - protected function generateTmpFileName($fileName) - { - return Uploader::getDispretionPath($fileName) . DIRECTORY_SEPARATOR . $fileName; - } - - /** - * @param string $fileName - * @return string - */ - protected function generateFileNameWithPath($fileName) - { - return Uploader::getDispretionPath($fileName) . DIRECTORY_SEPARATOR . $fileName; - } - - /** - * @param string $localTmpFile - * @return string - */ - protected function appendFileSystemPath($localTmpFile) - { - $pathToSave = $this->mediaConfig->getBaseTmpMediaPath(); - return $pathToSave . $localTmpFile; - } - /** * @param string $localTmpFile * @return string diff --git a/app/code/Magento/ProductVideo/Model/Plugin/BaseImage.php b/app/code/Magento/ProductVideo/Model/Plugin/BaseImage.php index 809da5a9c6b3dea4a707c5e37eaac92a9e58092a..f9342074f99d8c161b6b2d6d0213d0b42a1db288 100644 --- a/app/code/Magento/ProductVideo/Model/Plugin/BaseImage.php +++ b/app/code/Magento/ProductVideo/Model/Plugin/BaseImage.php @@ -6,7 +6,7 @@ namespace Magento\ProductVideo\Model\Plugin; -use Magento\Catalog\Block\Adminhtml\Product\Helper\Form\BaseImage as OriginalBloc; +use Magento\Catalog\Block\Adminhtml\Product\Helper\Form\BaseImage as OriginalBlock; use Magento\Framework\View\Element\Template; /** @@ -20,13 +20,13 @@ class BaseImage const ELEMENT_OUTPUT_TEMPLATE = 'Magento_ProductVideo::product/edit/base_image.phtml'; /** - * @param OriginalBloc $baseImage + * @param OriginalBlock $baseImage * @param Template $block * @return Template * * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function afterAssignBlockVariables(OriginalBloc $baseImage, Template $block) + public function afterAssignBlockVariables(OriginalBlock $baseImage, Template $block) { $block->assign([ 'videoPlaceholderText' => __('Click here to add videos.'), @@ -37,13 +37,13 @@ class BaseImage } /** - * @param OriginalBloc $baseImage + * @param OriginalBlock $baseImage * @param Template $block * @return Template * * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function afterCreateElementHtmlOutputBlock(OriginalBloc $baseImage, Template $block) + public function afterCreateElementHtmlOutputBlock(OriginalBlock $baseImage, Template $block) { $block->setTemplate(self::ELEMENT_OUTPUT_TEMPLATE); return $block; diff --git a/app/code/Magento/ProductVideo/Model/Plugin/ExternalVideoEntryProcessor.php b/app/code/Magento/ProductVideo/Model/Plugin/ExternalVideoEntryProcessor.php index 935e84de05c13970687767814346fe321f82e3d7..1ec18643158d26c75beacaa81812c4540ffb1d61 100644 --- a/app/code/Magento/ProductVideo/Model/Plugin/ExternalVideoEntryProcessor.php +++ b/app/code/Magento/ProductVideo/Model/Plugin/ExternalVideoEntryProcessor.php @@ -41,13 +41,21 @@ class ExternalVideoEntryProcessor */ protected $resourceEntryMediaGallery; + /** + * @var \Magento\ProductVideo\Model\ResourceModel\Video + */ + protected $videoResourceModel; + /** * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Media $resourceEntryMediaGallery + * @param \Magento\ProductVideo\Model\ResourceModel\Video $videoResourceModel */ public function __construct( - \Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Media $resourceEntryMediaGallery + \Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Media $resourceEntryMediaGallery, + \Magento\ProductVideo\Model\ResourceModel\Video $videoResourceModel ) { $this->resourceEntryMediaGallery = $resourceEntryMediaGallery; + $this->videoResourceModel = $videoResourceModel; } /** @@ -141,8 +149,7 @@ class ExternalVideoEntryProcessor */ protected function saveVideoValuesItem(array $item) { - $this->resourceEntryMediaGallery->saveDataRow( - InstallSchema::GALLERY_VALUE_VIDEO_TABLE, + $this->videoResourceModel->insertOnDuplicate( $this->prepareVideoRowDataForSave($item) ); } diff --git a/app/code/Magento/ProductVideo/Model/Plugin/ExternalVideoResourceBackend.php b/app/code/Magento/ProductVideo/Model/Plugin/ExternalVideoResourceBackend.php new file mode 100644 index 0000000000000000000000000000000000000000..e29ce8831c954fb1dff68475c2449108c1b3b280 --- /dev/null +++ b/app/code/Magento/ProductVideo/Model/Plugin/ExternalVideoResourceBackend.php @@ -0,0 +1,46 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\ProductVideo\Model\Plugin; + +use Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Media; + +/** + * Attribute Media Resource decorator + */ +class ExternalVideoResourceBackend +{ + /** + * @var \Magento\ProductVideo\Model\ResourceModel\Video + */ + protected $videoResourceModel; + + /** + * @param \Magento\ProductVideo\Model\ResourceModel\Video $videoResourceModel + */ + public function __construct(\Magento\ProductVideo\Model\ResourceModel\Video $videoResourceModel) + { + $this->videoResourceModel = $videoResourceModel; + } + + /** + * @param Media $originalResourceModel + * @param array $valueIdMap + * @return array + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function afterDuplicate(Media $originalResourceModel, array $valueIdMap) + { + $mediaGalleryEntitiesData = $this->videoResourceModel->loadByIds(array_keys($valueIdMap)); + foreach ($mediaGalleryEntitiesData as $row) { + $row['value_id'] = $valueIdMap[$row['value_id']]; + $this->videoResourceModel->insertOnDuplicate($row); + } + + return $valueIdMap; + } +} diff --git a/app/code/Magento/ProductVideo/Model/ResourceModel/Video.php b/app/code/Magento/ProductVideo/Model/ResourceModel/Video.php new file mode 100644 index 0000000000000000000000000000000000000000..3a242f71eb42a7cfb77c7aac7a84ebb9c4d6478f --- /dev/null +++ b/app/code/Magento/ProductVideo/Model/ResourceModel/Video.php @@ -0,0 +1,47 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\ProductVideo\Model\ResourceModel; + +class Video extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb +{ + /** + * Resource initialization + * + * @return void + */ + public function _construct() + { + $this->_init(\Magento\ProductVideo\Setup\InstallSchema::GALLERY_VALUE_VIDEO_TABLE, 'value_id'); + } + + /** + * @param array $data + * @param array $fields + * @return int + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function insertOnDuplicate(array $data, array $fields = []) + { + return $this->getConnection()->insertOnDuplicate($this->getMainTable(), $data, $fields); + } + + /** + * @param array $ids + * @return array + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function loadByIds(array $ids) + { + $select = $this->getConnection()->select()->from( + $this->getMainTable() + )->where( + 'value_id IN(?)', + $ids + ); + + return $this->getConnection()->fetchAll($select); + } +} diff --git a/app/code/Magento/ProductVideo/Model/VideoExtractor.php b/app/code/Magento/ProductVideo/Model/VideoExtractor.php index be97959b6df52c2069428907b8864cfd504ae9db..aa9267e5a324e55b7d32ea84e39533fcace6a443 100644 --- a/app/code/Magento/ProductVideo/Model/VideoExtractor.php +++ b/app/code/Magento/ProductVideo/Model/VideoExtractor.php @@ -12,7 +12,7 @@ class VideoExtractor implements \Magento\Framework\View\Xsd\Media\TypeDataExtrac /** * Media Entry type code */ - const MEDIA_TYPE_CODE = 'image'; + const MEDIA_TYPE_CODE = 'video'; /** * Extract configuration data of videos from the DOM structure diff --git a/app/code/Magento/ProductVideo/Setup/UpgradeData.php b/app/code/Magento/ProductVideo/Setup/UpgradeData.php new file mode 100644 index 0000000000000000000000000000000000000000..b1e418c0f39df683e7d856055b584a22b540ab57 --- /dev/null +++ b/app/code/Magento/ProductVideo/Setup/UpgradeData.php @@ -0,0 +1,73 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\ProductVideo\Setup; + +use Magento\Catalog\Setup\CategorySetupFactory; +use Magento\Framework\Setup\UpgradeDataInterface; +use Magento\Framework\Setup\ModuleContextInterface; +use Magento\Framework\Setup\ModuleDataSetupInterface; + +/** + * Upgrade Data script + * @codeCoverageIgnore + */ +class UpgradeData implements UpgradeDataInterface +{ + /** + * Category setup factory + * + * @var CategorySetupFactory + */ + private $categorySetupFactory; + + /** + * Init + * + * @param CategorySetupFactory $categorySetupFactory + */ + public function __construct(CategorySetupFactory $categorySetupFactory) + { + $this->categorySetupFactory = $categorySetupFactory; + } + + /** + * {@inheritdoc} + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) + { + $setup->startSetup(); + if (version_compare($context->getVersion(), '2.0.0.2') < 0) { + /** @var \Magento\Catalog\Setup\CategorySetup $categorySetup */ + $categorySetup = $this->categorySetupFactory->create(['setup' => $setup]); + + $entityTypeId = $categorySetup->getEntityTypeId(\Magento\Catalog\Model\Product::ENTITY); + $attributeSetId = $categorySetup->getDefaultAttributeSetId($entityTypeId); + + $attributeGroup = $categorySetup->getAttributeGroup( + $entityTypeId, + $attributeSetId, + 'Image Management' + ); + if (isset($attributeGroup['attribute_group_name']) + && $attributeGroup['attribute_group_name'] == 'Image Management' + ) { + // update General Group + $categorySetup->updateAttributeGroup( + $entityTypeId, + $attributeSetId, + $attributeGroup['attribute_group_id'], + 'attribute_group_name', + 'Images and Videos' + ); + } + + } + + $setup->endSetup(); + } +} diff --git a/app/code/Magento/ProductVideo/Test/Unit/Block/Adminhtml/Product/Edit/NewVideoTest.php b/app/code/Magento/ProductVideo/Test/Unit/Block/Adminhtml/Product/Edit/NewVideoTest.php index e07d3144baa89d6cdb5c93e99f18b71e32980042..9da5b71dd4d5f916794ee512bde5d97b95e72b98 100644 --- a/app/code/Magento/ProductVideo/Test/Unit/Block/Adminhtml/Product/Edit/NewVideoTest.php +++ b/app/code/Magento/ProductVideo/Test/Unit/Block/Adminhtml/Product/Edit/NewVideoTest.php @@ -37,6 +37,11 @@ class NewVideoTest extends \PHPUnit_Framework_TestCase */ protected $jsonEncoderMock; + /** + * @var \Magento\ProductVideo\Helper\Media|\PHPUnit_Framework_MockObject_MockObject + */ + protected $mediaHelper; + /** * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager * |\Magento\ProductVideo\Block\Adminhtml\Product\Edit\NewVideo @@ -46,6 +51,7 @@ class NewVideoTest extends \PHPUnit_Framework_TestCase public function setUp() { $this->contextMock = $this->getMock('\Magento\Backend\Block\Template\Context', [], [], '', false); + $this->mediaHelper = $this->getMock('\Magento\ProductVideo\Helper\Media', [], [], '', false); $this->mathRandom = $this->getMock('\Magento\Framework\Math\Random', [], [], '', false); $this->urlBuilder = $this->getMock('\Magento\Framework\UrlInterface', [], [], '', false); $this->contextMock->expects($this->any())->method('getMathRandom')->willReturn($this->mathRandom); @@ -60,9 +66,11 @@ class NewVideoTest extends \PHPUnit_Framework_TestCase '\Magento\ProductVideo\Block\Adminhtml\Product\Edit\NewVideo', [ 'context' => $this->contextMock, + 'mediaHelper' => $this->mediaHelper, + 'urlBuilder' => $this->urlBuilder, + 'jsonEncoder' => $this->jsonEncoderMock, 'registry' => $this->registryMock, 'formFactory' => $this->formFactoryMock, - 'jsonEncoder' => $this->jsonEncoderMock ] ); } diff --git a/app/code/Magento/ProductVideo/Test/Unit/Controller/Adminhtml/Product/Gallery/RetrieveImageTest.php b/app/code/Magento/ProductVideo/Test/Unit/Controller/Adminhtml/Product/Gallery/RetrieveImageTest.php index bd11bb20d4e368a15f28b35cd20394c184a409c4..70af0519f536ae9504e65040abe243e0a025b8d1 100644 --- a/app/code/Magento/ProductVideo/Test/Unit/Controller/Adminhtml/Product/Gallery/RetrieveImageTest.php +++ b/app/code/Magento/ProductVideo/Test/Unit/Controller/Adminhtml/Product/Gallery/RetrieveImageTest.php @@ -128,6 +128,6 @@ class RetrieveImageTest extends \PHPUnit_Framework_TestCase $readInterface->expects($this->any())->method('getAbsolutePath')->willReturn('/var/www/application/sample.jpg'); $this->abstractAdapter->expects($this->any())->method('validateUploadFile')->willReturn('true'); - $this->image->execute(); + $this->image->executeInternal(); } } diff --git a/app/code/Magento/ProductVideo/etc/adminhtml/system.xml b/app/code/Magento/ProductVideo/etc/adminhtml/system.xml index f475ab5b70d54cb2a671e5cf41c0b1b1116f7d4b..d00f9a78e6b65bd1c2570367ef5b48666f65e1f8 100644 --- a/app/code/Magento/ProductVideo/etc/adminhtml/system.xml +++ b/app/code/Magento/ProductVideo/etc/adminhtml/system.xml @@ -8,10 +8,10 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd"> <system> <section id="catalog"> - <group id="product_video" translate="label" type="text" sortOrder="350" showInDefault="1" showInWebsite="1" showInStore="1"> + <group id="product_video" translate="label" type="text" sortOrder="350" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Product Video</label> - <field id="youtube_api_key" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1"> - <label>YouTube API key</label> + <field id="youtube_api_key" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="0"> + <label>YouTube API Key</label> </field> </group> </section> diff --git a/app/code/Magento/ProductVideo/etc/di.xml b/app/code/Magento/ProductVideo/etc/di.xml index 99aeef0a7251e7f2cbbf54abfc4471fdf1ce1b97..7f27e06492a15107e7c7506388c03dd916de6c96 100644 --- a/app/code/Magento/ProductVideo/etc/di.xml +++ b/app/code/Magento/ProductVideo/etc/di.xml @@ -39,6 +39,9 @@ <type name="Magento\Catalog\Model\Product\Attribute\Backend\Media"> <plugin name="external_video_media_entry_processor" type="Magento\ProductVideo\Model\Plugin\ExternalVideoEntryProcessor" /> </type> + <type name="Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Media"> + <plugin name="external_video_media_resource_backend" type="Magento\ProductVideo\Model\Plugin\ExternalVideoResourceBackend" /> + </type> <type name="Magento\Catalog\Block\Adminhtml\Product\Helper\Form\BaseImage"> <plugin name="base_image_element_render" type="Magento\ProductVideo\Model\Plugin\BaseImage" /> </type> diff --git a/app/code/Magento/ProductVideo/etc/module.xml b/app/code/Magento/ProductVideo/etc/module.xml index a6bc6bab40b5a7f40f29fb4cc7d1f677a4b46471..16107ae938e40855f2218e3b0ffeacaec7fbd4c5 100644 --- a/app/code/Magento/ProductVideo/etc/module.xml +++ b/app/code/Magento/ProductVideo/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_ProductVideo" setup_version="2.0.0.1"> + <module name="Magento_ProductVideo" setup_version="2.0.0.2"> <sequence> <module name="Magento_Catalog"/> <module name="Magento_Backend"/> diff --git a/app/code/Magento/ProductVideo/etc/view.xml b/app/code/Magento/ProductVideo/etc/view.xml index 3a09480fc4c57b0092b8e12760ca1514036e99b5..f5ce5d81d6ff71d6e2b62c98008ff2faf511e679 100644 --- a/app/code/Magento/ProductVideo/etc/view.xml +++ b/app/code/Magento/ProductVideo/etc/view.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ProductVideo/etc/view.xsd"> +<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/view.xsd"> <media> <videos module="Magento_ProductVideo"> <video id="play_if_base" type="play_if_base"> diff --git a/app/code/Magento/ProductVideo/view/adminhtml/web/js/get-video-information.js b/app/code/Magento/ProductVideo/view/adminhtml/web/js/get-video-information.js index 52171f1537a254ef6b19645419a8951bd0b39083..e52368166270e11aae7804cf4eb6eeb6eaedf6f2 100644 --- a/app/code/Magento/ProductVideo/view/adminhtml/web/js/get-video-information.js +++ b/app/code/Magento/ProductVideo/view/adminhtml/web/js/get-video-information.js @@ -1,595 +1,588 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*jshint browser:true jquery:true*/ -require([ - 'jquery', - 'Magento_Ui/js/modal/alert', - 'jquery/ui' - ], - function ($, alert) { - 'use strict'; - - var videoRegister = { - _register: {}, - - /** - * Checks, if api is already registered - * - * @param {String} api - * @returns {bool} - */ - isRegistered: function (api) { - return this._register[api] !== undefined; - }, - - /** - * Checks, if api is loaded - * - * @param {String} api - * @returns {bool} - */ - isLoaded: function (api) { - return this._register[api] !== undefined && this._register[api] === true; - }, - - /** - * Register new video api - * @param {String} api - * @param {bool} loaded - */ - register: function (api, loaded) { - loaded = loaded || false; - this._register[api] = loaded; - } - }; - - $.widget('mage.productVideoLoader', { - - /** - * @private - */ - _create: function () { - switch (this.element.data('type')) { - case 'youtube': - this.element.videoYoutube(); - this._player = this.element.data('mageVideoYoutube'); - break; - - case 'vimeo': - this.element.videoVimeo(); - this._player = this.element.data('mageVideoVimeo'); - break; - default: - throw { - name: 'Video Error', - message: 'Unknown video type', - - /** - * Return string - */ - toString: function () { - return this.name + ': ' + this.message; - } - }; - } - }, - - /** - * Initializes variables - * @private - */ - _initialize: function () { - this._params = this.element.data('params') || {}; - this._code = this.element.data('code'); - this._width = this.element.data('width'); - this._height = this.element.data('height'); - this._autoplay = !!this.element.data('autoplay'); - this._playing = this._autoplay || false; - - this._responsive = this.element.data('responsive') !== false; - - if (this._responsive === true) { - this.element.addClass('responsive'); - } - - this._calculateRatio(); - }, - - /** - * Abstract play command - */ - play: function () { - this._player.play(); - }, - - /** - * Abstract pause command - */ - pause: function () { - this._player.pause(); - }, - - /** - * Abstract stop command - */ - stop: function () { - this._player.stop(); - }, - - /** - * Abstract playing command - */ - playing: function () { - return this._player.playing(); - }, - - /** - * Abstract destroying command - */ - destroy: function () { - this._player.destroy(); - }, - - /** - * Calculates ratio for responsive videos - * @private - */ - _calculateRatio: function () { - if (!this._responsive) { - return; - } - this.element.css('paddingBottom', this._height / this._width * 100 + '%'); - } - }); - - $.widget('mage.videoYoutube', $.mage.productVideoLoader, { - - /** - * Initialization of the Youtube widget - * @private - */ - _create: function () { - var self = this; - - this._initialize(); - - this.element.append('<div/>'); - - this._on(window, { - - /** - * Youtube state check - * @private - */ - 'youtubeapiready': function () { - if (self._player !== undefined) { - return; - } - - if (self._autoplay) { - self._params.autoplay = 1; - } - self._params.rel = 0; - - self._player = new window.YT.Player(self.element.children(':first')[0], { - height: self._height, - width: self._width, - videoId: self._code, - playerVars: self._params, - events: { - - /** - * @private - */ - 'onReady': function onPlayerReady() { - self._player.getDuration(); - }, - - /** - * State change flag init - */ - onStateChange: function (data) { - switch (window.parseInt(data.data, 10)) { - case 1: - self._playing = true; - break; - default: - self._playing = false; - break; - } - - self._trigger('statechange', {}, data); - } - } - - }); - } - }); - - this._loadApi(); - }, - - /** - * Loads Youtube API and triggers event, when loaded - * @private - */ - _loadApi: function () { - var element, - scriptTag; - - if (videoRegister.isRegistered('youtube')) { - if (videoRegister.isLoaded('youtube')) { - $(window).trigger('youtubeapiready'); - } - - return; - } - videoRegister.register('youtube'); - - element = document.createElement('script'); - scriptTag = document.getElementsByTagName('script')[0]; - - element.async = true; - element.src = 'https://www.youtube.com/iframe_api'; - scriptTag.parentNode.insertBefore(element, scriptTag); - - /** - * Trigger youtube api ready event - */ - window.onYouTubeIframeAPIReady = function () { - $(window).trigger('youtubeapiready'); - videoRegister.register('youtube', true); - }; - }, - - /** - * Play command for Youtube - */ - play: function () { - this._player.playVideo(); - this._playing = true; - }, - - /** - * Pause command for Youtube - */ - pause: function () { - this._player.pauseVideo(); - this._playing = false; - }, - - /** - * Stop command for Youtube - */ - stop: function () { - this._player.stopVideo(); - this._playing = false; - }, - - /** - * Playing command for Youtube - */ - playing: function () { - return this._playing; - }, - - /** - * stops and unloads player - * @private - */ - destroy: function () { - this.stop(); - this._player.destroy(); - } - }); - - $.widget('mage.videoVimeo', $.mage.productVideoLoader, { - - /** - * Initialize the Vimeo widget - * @private - */ - _create: function () { - var timestamp, - src, - additionalParams; - - this._initialize(); - timestamp = new Date().getTime(); - - if (this._autoplay) { - additionalParams += '&autoplay=1'; - } - - src = 'http://player.vimeo.com/video/' + - this._code + '?api=1&player_id=vimeo' + - this._code + - timestamp + - additionalParams; - this.element.append( - $('<iframe/>') - .attr('frameborder', 0) - .attr('id', 'vimeo' + this._code + timestamp) - .attr('width', this._width) - .attr('height', this._height) - .attr('src', src) - ); - - } - }); - - $.widget('mage.videoData', { - options: { - youtubeKey: '', - noKeyErrorTxt: 'You have not entered youtube API key. ' + - 'No information about youtube video will be retrieved.', - eventSource: '' //where is data going from - focus out or click on button - }, - - _REQUEST_VIDEO_INFORMATION_TRIGGER: 'update_video_information', - - _UPDATE_VIDEO_INFORMATION_TRIGGER: 'updated_video_information', - - _ERROR_UPDATE_INFORMATION_TRIGGER: 'error_updated_information', - - _videoInformation: null, - - /** - * @private - */ - _init: function () { - if (!this.options.youtubeKey && this.options.eventSource === 'click') { - alert({ - content: this.options.noKeyErrorTxt - }); - } - this._onRequestHandler(); - }, - - /** - * @private - */ - _onRequestHandler: function () { - var url = this.element.val(), - self = this, - videoInfo, - type, - id, - googleapisUrl; - - if (!url) { - //this._onRequestError("Video url is undefined"); - return; - } - - videoInfo = this._validateURL(url); - - if (!videoInfo) { - this._onRequestError('Invalid video url'); - - return; - } - - /** - * - * @param {Object} data - * @private - */ - function _onYouTubeLoaded(data) { - var tmp, - uploadedFormatted, - respData, - createErrorMessage; - - /** - * Create errors message - * - * @returns {String} - */ - createErrorMessage = function () { - var error = data.error, - errors = error.errors, - i, - errLength = errors.length, - tmpError, - errReason, - errorsMessage = []; - - for (i = 0; i < errLength; i++) { - tmpError = errors[i]; - errReason = tmpError.reason; - - if (['keyInvalid'].indexOf(errReason) !== -1) { - errorsMessage.push('Youtube API key is an invalid'); - - break; - } - - errorsMessage.push(tmpError.message); - } - - return 'Video can\'t be shown by reason: ' + $.unique(errorsMessage).join(', '); - }; - - if (data.error && data.error.code === 400) { - this._onRequestError(createErrorMessage()); - - return; - } - - if (!data.items || data.items.length < 1) { - this._onRequestError('Video not found'); - - return; - } - - tmp = data.items[0]; - uploadedFormatted = tmp.snippet.publishedAt.replace('T', ' ').replace(/\..+/g, ''); - respData = { - duration: this._formatYoutubeDuration(tmp.contentDetails.duration), - channel: tmp.snippet.channelTitle, - channelId: tmp.snippet.channelId, - uploaded: uploadedFormatted, - title: tmp.snippet.localized.title, - description: tmp.snippet.description, - thumbnail: tmp.snippet.thumbnails.high.url, - videoId: videoInfo.id, - videoProvider: videoInfo.type - }; - this._videoInformation = respData; - this.element.trigger(this._UPDATE_VIDEO_INFORMATION_TRIGGER, respData); - } - - /** - * @private - */ - function _onVimeoLoaded(data) { - var tmp = data[0], - respData; - - if (data.length < 1) { - this._onRequestError('Video not found'); - - return null; - } - tmp = data[0]; - respData = { - duration: this._formatVimeoDuration(tmp.duration), - channel: tmp['user_name'], - channelId: tmp['user_url'], - uploaded: tmp['upload_date'], - title: tmp.title, - description: tmp.description.replace(/( |<([^>]+)>)/ig, ''), - thumbnail: tmp['thumbnail_large'], - videoId: videoInfo.id, - videoProvider: videoInfo.type - }; - this._videoInformation = respData; - this.element.trigger(this._UPDATE_VIDEO_INFORMATION_TRIGGER, respData); - } - - type = videoInfo.type; - id = videoInfo.id; - - if (type === 'youtube') { - googleapisUrl = 'https://www.googleapis.com/youtube/v3/videos?id=' + - id + - '&part=snippet,contentDetails,statistics,status&key=' + - this.options.youtubeKey + '&alt=json&callback=?'; - $.getJSON(googleapisUrl, - { - format: 'json' - }, - $.proxy(_onYouTubeLoaded, self) - ).fail( - function () { - self._onRequestError('Video not found'); - } - ); - } else if (type === 'vimeo') { - $.getJSON('http://www.vimeo.com/api/v2/video/' + id + '.json?callback=?', - { - format: 'json' - }, - $.proxy(_onVimeoLoaded, self) - ).fail( - function () { - self._onRequestError('Video not found'); - } - ); - } - }, - - /** - * @private - */ - _onRequestError: function (error) { - this._videoInformation = null; - this.element.trigger(this._ERROR_UPDATE_INFORMATION_TRIGGER, error); - this.element.val(''); - alert({ - content: 'Error: "' + error + '"' - }); - }, - - /** - * @private - */ - _formatYoutubeDuration: function (duration) { - var match = duration.match(/PT(\d+H)?(\d+M)?(\d+S)?/), - hours = parseInt(match[1], 10) || 0, - minutes = parseInt(match[2], 10) || 0, - seconds = parseInt(match[3], 10) || 0; - - return this._formatVimeoDuration(hours * 3600 + minutes * 60 + seconds); - }, - - /** - * @private - */ - _formatVimeoDuration: function (seconds) { - return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0]; - }, - - /** - * @private - */ - _parseHref: function (href) { - var a = document.createElement('a'); - - a.href = href; - - return a; - }, - - /** - * @private - */ - _validateURL: function (href, forceVideo) { - var id, - type, - ampersandPosition, - vimeoRegex; - - if (typeof href !== 'string') { - return href; - } - href = this._parseHref(href); - - if (href.host.match(/youtube\.com/) && href.search) { - - id = href.search.split('v=')[1]; - - if (id) { - ampersandPosition = id.indexOf('&'); - type = 'youtube'; - } - - if (id && ampersandPosition !== -1) { - id = id.substring(0, ampersandPosition); - } - - } else if (href.host.match(/youtube\.com|youtu\.be/)) { - id = href.pathname.replace(/^\/(embed\/|v\/)?/, '').replace(/\/.*/, ''); - type = 'youtube'; - } else if (href.host.match(/vimeo\.com/)) { - type = 'vimeo'; - vimeoRegex = new RegExp(['https?:\\/\\/(?:www\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)', - '?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|)(\\d+)(?:$|\\/|\\?)' - ].join('')); - id = href.href.match(vimeoRegex)[3]; - } - - if ((!id || !type) && forceVideo) { - id = href.href; - type = 'custom'; - } - - return id ? { - id: id, type: type, s: href.search.replace(/^\?/, '') - } : false; - } - }); - }); +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*jshint browser:true jquery:true*/ +require([ + 'jquery', + 'Magento_Ui/js/modal/alert', + 'jquery/ui' + ], + function ($, alert) { + 'use strict'; + + var videoRegister = { + _register: {}, + + /** + * Checks, if api is already registered + * + * @param {String} api + * @returns {bool} + */ + isRegistered: function (api) { + return this._register[api] !== undefined; + }, + + /** + * Checks, if api is loaded + * + * @param {String} api + * @returns {bool} + */ + isLoaded: function (api) { + return this._register[api] !== undefined && this._register[api] === true; + }, + + /** + * Register new video api + * @param {String} api + * @param {bool} loaded + */ + register: function (api, loaded) { + loaded = loaded || false; + this._register[api] = loaded; + } + }; + + $.widget('mage.productVideoLoader', { + + /** + * @private + */ + _create: function () { + switch (this.element.data('type')) { + case 'youtube': + this.element.videoYoutube(); + this._player = this.element.data('mageVideoYoutube'); + break; + + case 'vimeo': + this.element.videoVimeo(); + this._player = this.element.data('mageVideoVimeo'); + break; + default: + throw { + name: 'Video Error', + message: 'Unknown video type', + + /** + * Return string + */ + toString: function () { + return this.name + ': ' + this.message; + } + }; + } + }, + + /** + * Initializes variables + * @private + */ + _initialize: function () { + this._params = this.element.data('params') || {}; + this._code = this.element.data('code'); + this._width = this.element.data('width'); + this._height = this.element.data('height'); + this._autoplay = !!this.element.data('autoplay'); + this._playing = this._autoplay || false; + + this._responsive = this.element.data('responsive') !== false; + + if (this._responsive === true) { + this.element.addClass('responsive'); + } + + this._calculateRatio(); + }, + + /** + * Abstract play command + */ + play: function () { + this._player.play(); + }, + + /** + * Abstract pause command + */ + pause: function () { + this._player.pause(); + }, + + /** + * Abstract stop command + */ + stop: function () { + this._player.stop(); + }, + + /** + * Abstract playing command + */ + playing: function () { + return this._player.playing(); + }, + + /** + * Abstract destroying command + */ + destroy: function () { + this._player.destroy(); + }, + + /** + * Calculates ratio for responsive videos + * @private + */ + _calculateRatio: function () { + if (!this._responsive) { + return; + } + this.element.css('paddingBottom', this._height / this._width * 100 + '%'); + } + }); + + $.widget('mage.videoYoutube', $.mage.productVideoLoader, { + + /** + * Initialization of the Youtube widget + * @private + */ + _create: function () { + var self = this; + + this._initialize(); + + this.element.append('<div/>'); + + this._on(window, { + + /** + * Youtube state check + * @private + */ + 'youtubeapiready': function () { + if (self._player !== undefined) { + return; + } + + if (self._autoplay) { + self._params.autoplay = 1; + } + self._params.rel = 0; + + self._player = new window.YT.Player(self.element.children(':first')[0], { + height: self._height, + width: self._width, + videoId: self._code, + playerVars: self._params, + events: { + + /** + * @private + */ + 'onReady': function onPlayerReady() { + self._player.getDuration(); + }, + + /** + * State change flag init + */ + onStateChange: function (data) { + switch (window.parseInt(data.data, 10)) { + case 1: + self._playing = true; + break; + default: + self._playing = false; + break; + } + + self._trigger('statechange', {}, data); + } + } + + }); + } + }); + + this._loadApi(); + }, + + /** + * Loads Youtube API and triggers event, when loaded + * @private + */ + _loadApi: function () { + var element, + scriptTag; + + if (videoRegister.isRegistered('youtube')) { + if (videoRegister.isLoaded('youtube')) { + $(window).trigger('youtubeapiready'); + } + + return; + } + videoRegister.register('youtube'); + + element = document.createElement('script'); + scriptTag = document.getElementsByTagName('script')[0]; + + element.async = true; + element.src = 'https://www.youtube.com/iframe_api'; + scriptTag.parentNode.insertBefore(element, scriptTag); + + /** + * Trigger youtube api ready event + */ + window.onYouTubeIframeAPIReady = function () { + $(window).trigger('youtubeapiready'); + videoRegister.register('youtube', true); + }; + }, + + /** + * Play command for Youtube + */ + play: function () { + this._player.playVideo(); + this._playing = true; + }, + + /** + * Pause command for Youtube + */ + pause: function () { + this._player.pauseVideo(); + this._playing = false; + }, + + /** + * Stop command for Youtube + */ + stop: function () { + this._player.stopVideo(); + this._playing = false; + }, + + /** + * Playing command for Youtube + */ + playing: function () { + return this._playing; + }, + + /** + * stops and unloads player + * @private + */ + destroy: function () { + this.stop(); + this._player.destroy(); + } + }); + + $.widget('mage.videoVimeo', $.mage.productVideoLoader, { + + /** + * Initialize the Vimeo widget + * @private + */ + _create: function () { + var timestamp, + src, + additionalParams; + + this._initialize(); + timestamp = new Date().getTime(); + + if (this._autoplay) { + additionalParams += '&autoplay=1'; + } + + src = 'http://player.vimeo.com/video/' + + this._code + '?api=1&player_id=vimeo' + + this._code + + timestamp + + additionalParams; + this.element.append( + $('<iframe/>') + .attr('frameborder', 0) + .attr('id', 'vimeo' + this._code + timestamp) + .attr('width', this._width) + .attr('height', this._height) + .attr('src', src) + ); + + } + }); + + $.widget('mage.videoData', { + options: { + youtubeKey: '', + eventSource: '' //where is data going from - focus out or click on button + }, + + _REQUEST_VIDEO_INFORMATION_TRIGGER: 'update_video_information', + + _UPDATE_VIDEO_INFORMATION_TRIGGER: 'updated_video_information', + + _ERROR_UPDATE_INFORMATION_TRIGGER: 'error_updated_information', + + _videoInformation: null, + + /** + * @private + */ + _init: function () { + this._onRequestHandler(); + }, + + /** + * @private + */ + _onRequestHandler: function () { + var url = this.element.val(), + self = this, + videoInfo, + type, + id, + googleapisUrl; + + if (!url) { + //this._onRequestError("Video url is undefined"); + return; + } + + videoInfo = this._validateURL(url); + + if (!videoInfo) { + this._onRequestError('Invalid video url'); + + return; + } + + /** + * + * @param {Object} data + * @private + */ + function _onYouTubeLoaded(data) { + var tmp, + uploadedFormatted, + respData, + createErrorMessage; + + /** + * Create errors message + * + * @returns {String} + */ + createErrorMessage = function () { + var error = data.error, + errors = error.errors, + i, + errLength = errors.length, + tmpError, + errReason, + errorsMessage = []; + + for (i = 0; i < errLength; i++) { + tmpError = errors[i]; + errReason = tmpError.reason; + + if (['keyInvalid'].indexOf(errReason) !== -1) { + errorsMessage.push('Youtube API key is invalid'); + + break; + } + + errorsMessage.push(tmpError.message); + } + + return 'Video cant be shown due to the following reason: ' + $.unique(errorsMessage).join(', '); + }; + + if (data.error && data.error.code === 400) { + this._onRequestError(createErrorMessage()); + + return; + } + + if (!data.items || data.items.length < 1) { + this._onRequestError('Video not found'); + + return; + } + + tmp = data.items[0]; + uploadedFormatted = tmp.snippet.publishedAt.replace('T', ' ').replace(/\..+/g, ''); + respData = { + duration: this._formatYoutubeDuration(tmp.contentDetails.duration), + channel: tmp.snippet.channelTitle, + channelId: tmp.snippet.channelId, + uploaded: uploadedFormatted, + title: tmp.snippet.localized.title, + description: tmp.snippet.description, + thumbnail: tmp.snippet.thumbnails.high.url, + videoId: videoInfo.id, + videoProvider: videoInfo.type + }; + this._videoInformation = respData; + this.element.trigger(this._UPDATE_VIDEO_INFORMATION_TRIGGER, respData); + } + + /** + * @private + */ + function _onVimeoLoaded(data) { + var tmp = data[0], + respData; + + if (data.length < 1) { + this._onRequestError('Video not found'); + + return null; + } + tmp = data[0]; + respData = { + duration: this._formatVimeoDuration(tmp.duration), + channel: tmp['user_name'], + channelId: tmp['user_url'], + uploaded: tmp['upload_date'], + title: tmp.title, + description: tmp.description.replace(/( |<([^>]+)>)/ig, ''), + thumbnail: tmp['thumbnail_large'], + videoId: videoInfo.id, + videoProvider: videoInfo.type + }; + this._videoInformation = respData; + this.element.trigger(this._UPDATE_VIDEO_INFORMATION_TRIGGER, respData); + } + + type = videoInfo.type; + id = videoInfo.id; + + if (type === 'youtube') { + googleapisUrl = 'https://www.googleapis.com/youtube/v3/videos?id=' + + id + + '&part=snippet,contentDetails,statistics,status&key=' + + this.options.youtubeKey + '&alt=json&callback=?'; + $.getJSON(googleapisUrl, + { + format: 'json' + }, + $.proxy(_onYouTubeLoaded, self) + ).fail( + function () { + self._onRequestError('Video not found'); + } + ); + } else if (type === 'vimeo') { + $.getJSON('http://www.vimeo.com/api/v2/video/' + id + '.json?callback=?', + { + format: 'json' + }, + $.proxy(_onVimeoLoaded, self) + ).fail( + function () { + self._onRequestError('Video not found'); + } + ); + } + }, + + /** + * @private + */ + _onRequestError: function (error) { + this._videoInformation = null; + this.element.trigger(this._ERROR_UPDATE_INFORMATION_TRIGGER, error); + this.element.val(''); + alert({ + content: 'Error: "' + error + '"' + }); + }, + + /** + * @private + */ + _formatYoutubeDuration: function (duration) { + var match = duration.match(/PT(\d+H)?(\d+M)?(\d+S)?/), + hours = parseInt(match[1], 10) || 0, + minutes = parseInt(match[2], 10) || 0, + seconds = parseInt(match[3], 10) || 0; + + return this._formatVimeoDuration(hours * 3600 + minutes * 60 + seconds); + }, + + /** + * @private + */ + _formatVimeoDuration: function (seconds) { + return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0]; + }, + + /** + * @private + */ + _parseHref: function (href) { + var a = document.createElement('a'); + + a.href = href; + + return a; + }, + + /** + * @private + */ + _validateURL: function (href, forceVideo) { + var id, + type, + ampersandPosition, + vimeoRegex; + + if (typeof href !== 'string') { + return href; + } + href = this._parseHref(href); + + if (href.host.match(/youtube\.com/) && href.search) { + + id = href.search.split('v=')[1]; + + if (id) { + ampersandPosition = id.indexOf('&'); + type = 'youtube'; + } + + if (id && ampersandPosition !== -1) { + id = id.substring(0, ampersandPosition); + } + + } else if (href.host.match(/youtube\.com|youtu\.be/)) { + id = href.pathname.replace(/^\/(embed\/|v\/)?/, '').replace(/\/.*/, ''); + type = 'youtube'; + } else if (href.host.match(/vimeo\.com/)) { + type = 'vimeo'; + vimeoRegex = new RegExp(['https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)', + '?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?)' + ].join('')); + id = href.href.match(vimeoRegex)[3]; + } + + if ((!id || !type) && forceVideo) { + id = href.href; + type = 'custom'; + } + + return id ? { + id: id, type: type, s: href.search.replace(/^\?/, '') + } : false; + } + }); + }); diff --git a/app/code/Magento/ProductVideo/view/adminhtml/web/js/new-video-dialog.js b/app/code/Magento/ProductVideo/view/adminhtml/web/js/new-video-dialog.js index e5efb668b51e946a2ae44b0ef3c629b0ed8630e8..fe8e76ded235d96406adc27f23a82f6604954505 100644 --- a/app/code/Magento/ProductVideo/view/adminhtml/web/js/new-video-dialog.js +++ b/app/code/Magento/ProductVideo/view/adminhtml/web/js/new-video-dialog.js @@ -4,14 +4,13 @@ */ define([ 'jquery', - 'Magento_Ui/js/modal/alert', 'jquery/ui', 'Magento_Ui/js/modal/modal', 'mage/translate', 'mage/backend/tree-suggest', 'mage/backend/validation', 'Magento_ProductVideo/js/get-video-information' -], function ($, alert) { +], function ($) { 'use strict'; $.widget('mage.createVideoPlayer', { @@ -62,11 +61,9 @@ define([ if (checkVideoID && checkVideoID !== this.options.videoId) { this._doUpdate(); - } else - if (checkVideoID && checkVideoID === this.options.videoId) { + } else if (checkVideoID && checkVideoID === this.options.videoId) { return false; - } else - if (!checkVideoID) { + } else if (!checkVideoID) { this._doUpdate(); } @@ -97,8 +94,7 @@ define([ this.options.metaData.data.uploader + '</a>' ); - } else - if (this.options.videoProvider === 'vimeo') { + } else if (this.options.videoProvider === 'vimeo') { $(this.options.metaData.DOM.uploader).html( '<a href="' + this.options.metaData.data.uploaderUrl + @@ -425,7 +421,9 @@ define([ */ _replaceImage: function (oldFile, newFile, imageData) { var tmpNewFile = newFile, + tmpOldImage, newImageId, + oldNewFilePosition, fc, suff, searchsuff, @@ -434,6 +432,7 @@ define([ oldFile = this.__prepareFilename(oldFile); newFile = this.__prepareFilename(newFile); + tmpOldImage = this._images[oldFile]; if (newFile === oldFile) { this._images[newFile] = imageData; @@ -445,26 +444,36 @@ define([ this._removeImage(oldFile); this._setImage(newFile, imageData); - if (oldFile && imageData.oldFile) { - newImageId = this.findElementId(tmpNewFile); - fc = $(this._itemIdSelector).val(); + if (!oldFile || !imageData.oldFile) { + return null; + } - suff = 'product[media_gallery][images]' + fc; + newImageId = this.findElementId(tmpNewFile); + fc = $(this._itemIdSelector).val(); - searchsuff = 'input[name="' + suff + '[value_id]"]'; - key = $(searchsuff).val(); + suff = 'product[media_gallery][images]' + fc; - if (!key) { - return null; - } + searchsuff = 'input[name="' + suff + '[value_id]"]'; + key = $(searchsuff).val(); - oldValIdElem = document.createElement('input'); - $('form[data-form="edit-product"]').append(oldValIdElem); - $(oldValIdElem).attr({ - type: 'hidden', - name: 'product[media_gallery][images][' + newImageId + '][save_data_from]' - }).val(key); + if (!key) { + return null; } + + oldValIdElem = document.createElement('input'); + $('form[data-form="edit-product"]').append(oldValIdElem); + $(oldValIdElem).attr({ + type: 'hidden', + name: 'product[media_gallery][images][' + newImageId + '][save_data_from]' + }).val(key); + + oldNewFilePosition = parseInt(tmpOldImage.position, 10); + imageData.position = oldNewFilePosition; + + $(this._imageWidgetSelector).trigger('setPosition', { + imageData: imageData, + position: oldNewFilePosition + }); }, /** @@ -527,10 +536,13 @@ define([ _onImageLoaded: function (result, file, oldFile, callback) { var data = JSON.parse(result); + if ($('#video_url').parent().find('.image-upload-error').length > 0) { + $('.image-upload-error').remove(); + } + if (data.errorcode || data.error) { - alert({ - content: data.error - }); + $('#video_url').parent().append('<div class="image-upload-error">' + + '<div class="image-upload-error-cross"></div><span>' + data.error + '</span></div>'); return; } @@ -647,7 +659,7 @@ define([ roles.prop('disabled', false); file = $('#file_name').val(); widget._onGetVideoInformationEditClick(); - modalTitleElement = $('.modal-title'); + modalTitleElement = $('.mage-new-video-dialog .modal-title'); if (!file) { widget._blockActionButtons(true); @@ -870,9 +882,8 @@ define([ if ( ext.length < 2 || this._imageTypes.indexOf(ext.toLowerCase()) === -1 || - !file.files || + !file.files || !file.files.length - ) { prev.remove(); this._previewImage = null; @@ -968,7 +979,9 @@ define([ try { newVideoForm.validation('clearError'); - } catch (e) {} + } catch (e) { + + } newVideoForm.trigger('reset'); }, diff --git a/app/code/Magento/ProductVideo/view/frontend/requirejs-config.js b/app/code/Magento/ProductVideo/view/frontend/requirejs-config.js index e19b89135b44120160fb5002eb063c5c8bf6f951..7f488a2fa2f80613af8733bb326865c896226139 100644 --- a/app/code/Magento/ProductVideo/view/frontend/requirejs-config.js +++ b/app/code/Magento/ProductVideo/view/frontend/requirejs-config.js @@ -6,7 +6,8 @@ var config = { map: { '*': { - loadPlayer: 'Magento_ProductVideo/js/load-player' + loadPlayer: 'Magento_ProductVideo/js/load-player', + fotoramaVideoEvents: 'Magento_ProductVideo/js/fotorama-add-video-events' } } }; diff --git a/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js b/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js index 3fa62c44903df5eb4163bd8ca9b0aceaccec1ac4..16f3aa9f922aee1b62077c6ce1e1b2097a3e0472 100644 --- a/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js +++ b/app/code/Magento/ProductVideo/view/frontend/web/js/fotorama-add-video-events.js @@ -11,6 +11,11 @@ define([ ], function ($) { 'use strict'; + /** + * @private + */ + var allowBase = true; //global var is needed because fotorama always fully reloads events in case of fullscreen + /** * @private */ @@ -68,8 +73,8 @@ define([ type = 'youtube'; } else if (href.host.match(/vimeo\.com/)) { type = 'vimeo'; - vimeoRegex = new RegExp(['https?:\\/\\/(?:www\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)', - '?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|)(\\d+)(?:$|\\/|\\?)' + vimeoRegex = new RegExp(['https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)', + '?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?)' ].join('')); id = href.href.match(vimeoRegex)[3]; } @@ -96,6 +101,7 @@ define([ VI: 'vimeo', // [CONST] FTVC: 'fotorama__video-close', FTAR: 'fotorama__arr', + isFullscreen: 0, Base: 0, //on check for video is base this setting become true if there is any video with base role MobileMaxWidth: 767, GP: 'gallery-placeholder', //gallery placeholder class is needed to find and erase <script> tag @@ -106,6 +112,7 @@ define([ */ _init: function () { if (this._checkForVideoExist()) { + this._checkFullscreen(); this._checkForVimeo(); this._isVideoBase(); this._initFotoramaVideo(); @@ -113,6 +120,16 @@ define([ } }, + /** + * + * @private + */ + _checkFullscreen: function () { + if ($(this.element).find('.fotorama__fullscreen-icon')) { + this.isFullscreen = true; + } + }, + /** * * @param {Object} inputData @@ -121,23 +138,18 @@ define([ * @private */ _createVideoData: function (inputData, isJSON) { - var videoData = {}, - key, + var videoData = [], dataUrl, tmpVideoData, tmpInputData, - inputDataKeys, i; if (isJSON) { inputData = $.parseJSON(inputData); } - inputDataKeys = Object.keys(inputData); - - for (i = 0; i < inputDataKeys.length; i++) { - key = inputDataKeys[i]; - tmpInputData = inputData[key]; + for (i = 0; i < inputData.length; i++) { + tmpInputData = inputData[i]; dataUrl = ''; tmpVideoData = { mediaType: '', @@ -160,7 +172,11 @@ define([ tmpVideoData.provider = dataUrl.type; } - videoData[key] = tmpVideoData; + if (tmpVideoData.isBase) { + videoData.unshift(tmpVideoData); + } else { + videoData.push(tmpVideoData); + } } return videoData; @@ -297,13 +313,16 @@ define([ if ( videoItem.mediaType === this.VID && videoItem.isBase && - this.options.VideoSettings[0].playIfBase + this.options.VideoSettings[0].playIfBase && allowBase ) { this.Base = true; + allowBase = false; } } - this._createCloseVideo($(this.element).data('fotorama'), this.Base); + if (!this.isFullscreen) { + this._createCloseVideo($(this.element).data('fotorama'), this.Base); + } }, /** @@ -315,7 +334,7 @@ define([ scriptTag = document.getElementsByTagName('script')[0]; element.async = true; - element.src = 'https://f.vimeocdn.com/js/froogaloop2.min.js'; + element.src = 'https://secure-a.vimeocdn.com/js/froogaloop2.min.js'; scriptTag.parentNode.insertBefore(element, scriptTag); }, @@ -367,6 +386,11 @@ define([ $(this.element).on('fotorama:showend', $.proxy(function (e, fotorama) { this._startPrepareForPlayer(e, fotorama); }, this)); + + $(this.element).on('fotorama:fullscreenexit', $.proxy(function (e, fotorama) { + fotorama.activeFrame.$stageFrame.parent().find('.' + this.PV).remove(); + this._startPrepareForPlayer(e, fotorama); + }, this)); }, /** @@ -403,6 +427,7 @@ define([ if ($image && videoData && videoData.mediaType === this.VID) { $(fotorama.activeFrame.$stageFrame).removeAttr('href'); this._prepareForVideoContainer($image, videoData, fotorama, number); + $('.fotorama-video-container').addClass('video-unplayed'); } }, @@ -470,7 +495,10 @@ define([ if ($(this).hasClass('video-unplayed') && $(this).find('iframe').length === 0) { $(this).removeClass('video-unplayed'); $(this).find('.' + PV).productVideoLoader(); - self._showCloseVideo(); + + if (!self.isFullscreen) { + self._showCloseVideo(); + } } }); this._handleBaseVideo(fotorama, number); //check for video is it base and handle it if it's base @@ -502,9 +530,11 @@ define([ this.Base = false; } }, this), 50); - } else { //if not a vimeo - play it immediately - $(this.element).data('fotorama').activeFrame.$stageFrame[0].click(); - this.Base = false; + } else { //if not a vimeo - play it immediately with a little lag in case for fotorama fullscreen + setTimeout($.proxy(function () { + $(this.element).data('fotorama').activeFrame.$stageFrame[0].click(); + this.Base = false; + }, this), 50); } } }, diff --git a/app/code/Magento/Reports/Block/Adminhtml/Shopcart/Abandoned/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Shopcart/Abandoned/Grid.php index 648db357ee120790bda999e2c009e6c21bfdd8ba..99d5ea9e11b1c04d7c0554aa6011dc32347b2fa7 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Shopcart/Abandoned/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Shopcart/Abandoned/Grid.php @@ -8,7 +8,7 @@ namespace Magento\Reports\Block\Adminhtml\Shopcart\Abandoned; /** * Adminhtml abandoned shopping carts report grid block * - * @method \Magento\Reports\Model\ResourceModel\Quote\Collection getCollection + * @method \Magento\Reports\Model\ResourceModel\Quote\Collection getCollection() * * @author Magento Core Team <core@magentocommerce.com> * @SuppressWarnings(PHPMD.DepthOfInheritance) diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Accounts.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Accounts.php index b53d9b874610ca9a3499d2b85ec89898ee6198bb..da8eb394ba5868236b9d7ddf28c9e7ac0c8ff8b8 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Accounts.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Accounts.php @@ -13,7 +13,7 @@ class Accounts extends \Magento\Reports\Controller\Adminhtml\Report\Customer * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_customers_accounts' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsCsv.php index 1fa8340b524ebe9e810b0c79f1d7e80867eac8d1..2de1d222650202068253a1884a63b4877c0f4c1f 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsCsv.php @@ -17,7 +17,7 @@ class ExportAccountsCsv extends \Magento\Reports\Controller\Adminhtml\Report\Cus * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'new_accounts.csv'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsExcel.php index 368c8d0691751298962756874bab585559d355c5..b7e565a3f407d6ce56670b1c917693420eefcb9c 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportAccountsExcel.php @@ -17,7 +17,7 @@ class ExportAccountsExcel extends \Magento\Reports\Controller\Adminhtml\Report\C * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'new_accounts.xml'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersCsv.php index d674ff274c25ea08bbdd8ab3c62d4602f5c00ca6..8e12efa03ebaad4e391090180d41bb6a1bd2a17e 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersCsv.php @@ -17,7 +17,7 @@ class ExportOrdersCsv extends \Magento\Reports\Controller\Adminhtml\Report\Custo * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'customers_orders.csv'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersExcel.php index 205107520422d85b81be80a96974bd19d0000cee..c3f2afa18148d957de285ee5ed77d4a1b5081d71 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportOrdersExcel.php @@ -17,7 +17,7 @@ class ExportOrdersExcel extends \Magento\Reports\Controller\Adminhtml\Report\Cus * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'customers_orders.xml'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsCsv.php index 629e25bdf6d2333ba4405b80218b753566aaa6a7..c0b2f87e0feb96dba49fc9e55c15ec2da1a87357 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsCsv.php @@ -17,7 +17,7 @@ class ExportTotalsCsv extends \Magento\Reports\Controller\Adminhtml\Report\Custo * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'customer_totals.csv'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsExcel.php index 8c2800fe6caa48d514fdaa23e5b2095455f897e1..6c33a4a1eefabe29b886af3386cc7a2540894918 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/ExportTotalsExcel.php @@ -17,7 +17,7 @@ class ExportTotalsExcel extends \Magento\Reports\Controller\Adminhtml\Report\Cus * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'customer_totals.xml'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Orders.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Orders.php index 5e556d9fe8919a9711e7f3738ba00f2f9ff2066f..bc7363825f2e14744e7353915608804352012faa 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Orders.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Orders.php @@ -13,7 +13,7 @@ class Orders extends \Magento\Reports\Controller\Adminhtml\Report\Customer * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_customers_orders' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Totals.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Totals.php index f58bfb2bfc8b4995754d2da7751ade45a83ade1f..b7e3d117467d1a400e710a903d5a9088994577cf 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Totals.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer/Totals.php @@ -13,7 +13,7 @@ class Totals extends \Magento\Reports\Controller\Adminhtml\Report\Customer * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_customers_totals' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Downloads.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Downloads.php index 93213f776ec83c6146351acaa6979d9e5492e88e..5776f796be91aae525a1e61e832415c976eec9fc 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Downloads.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Downloads.php @@ -23,7 +23,7 @@ class Downloads extends \Magento\Reports\Controller\Adminhtml\Report\Product * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Downloadable::report_products_downloads' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsCsv.php index 5c6af987aec61c68194f08d6434aefa2313721b5..31086ee266b8441a68195aef7c7331469dad3085 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsCsv.php @@ -25,7 +25,7 @@ class ExportDownloadsCsv extends \Magento\Reports\Controller\Adminhtml\Report\Pr * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'products_downloads.csv'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsExcel.php index a42c7f09851fc774c7e0fc34657d1d2bc54f405a..20c5715b2602f5c4c377d31114544cbf2c5e8552 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportDownloadsExcel.php @@ -25,7 +25,7 @@ class ExportDownloadsExcel extends \Magento\Reports\Controller\Adminhtml\Report\ * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'products_downloads.xml'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockCsv.php index 2b63aa2d4c8ae915a1be3b0184270c7f8c9d9292..bbbce2b95b1e585af397ff0e50df5b9bc82e32bc 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockCsv.php @@ -26,7 +26,7 @@ class ExportLowstockCsv extends \Magento\Reports\Controller\Adminhtml\Report\Pro * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $fileName = 'products_lowstock.csv'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockExcel.php index 0d0ed5e0b8595e55a3383e521e80a5f113a04d05..f8e86a463686609efd5471002761576986c1f953 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportLowstockExcel.php @@ -26,7 +26,7 @@ class ExportLowstockExcel extends \Magento\Reports\Controller\Adminhtml\Report\P * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $fileName = 'products_lowstock.xml'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldCsv.php index f1c02ac7971ab0bc77d013c7e4a2374b7d525058..7eb7c810ffbf2f3644994e2d794b1657fabcf4db 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldCsv.php @@ -27,7 +27,7 @@ class ExportSoldCsv extends \Magento\Reports\Controller\Adminhtml\Report\Product * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'products_ordered.csv'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldExcel.php index 818b7a73c63cd50810ebe43f347e663c5b5328da..8b4e4ed7fa24008a6d31a4d2c1f379878ad28191 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportSoldExcel.php @@ -27,7 +27,7 @@ class ExportSoldExcel extends \Magento\Reports\Controller\Adminhtml\Report\Produ * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $fileName = 'products_ordered.xml'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedCsv.php index a7b42c9399233a992b110d4fa244d1613590d4ac..9c7348d76f22d8774dc0413342b53081c05d3a24 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedCsv.php @@ -26,7 +26,7 @@ class ExportViewedCsv extends \Magento\Reports\Controller\Adminhtml\Report\Produ * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'products_mostviewed.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Product\Viewed\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedExcel.php index b33650eee886c98b241400c216469eaf4b3a2e72..77a5ffff1aa802af83c6f7008fa95b1260bedf2e 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/ExportViewedExcel.php @@ -26,7 +26,7 @@ class ExportViewedExcel extends \Magento\Reports\Controller\Adminhtml\Report\Pro * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'products_mostviewed.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Product\Viewed\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Lowstock.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Lowstock.php index f2734c22fac08f7aae41ab440538ce6d1f9d5603..14eaafe76b887ab0d8188c50e91ea959c92f0294 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Lowstock.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Lowstock.php @@ -23,7 +23,7 @@ class Lowstock extends \Magento\Reports\Controller\Adminhtml\Report\Product * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_products_lowstock' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Sold.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Sold.php index 2b43c124f8389f31296e89a843820a5324c66933..25445c349e1125862e15aaf6a4122985af82686b 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Sold.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Sold.php @@ -23,7 +23,7 @@ class Sold extends \Magento\Reports\Controller\Adminhtml\Report\Product * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_products_sold' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Viewed.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Viewed.php index 4de88db184a83cd3a55777d07235d239a18f1f97..3a370259de9e071372d2eeb67a97db5450772804 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Viewed.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Product/Viewed.php @@ -25,7 +25,7 @@ class Viewed extends \Magento\Reports\Controller\Adminhtml\Report\Product * * @return void */ - public function execute() + public function executeInternal() { try { $this->_showLastExecutionTime(Flag::REPORT_PRODUCT_VIEWED_FLAG_CODE, 'viewed'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Customer.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Customer.php index f956bf14c1d38fe452ea04c4e58f18f5eb621c87..18c0961d483444a14ba71f8f668428305ed7dd5b 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Customer.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Customer.php @@ -13,7 +13,7 @@ class Customer extends \Magento\Reports\Controller\Adminhtml\Report\Review * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Review::report_review_customer' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerCsv.php index 1a7f776d00fe791864e60ed1ef92def8bc096d75..473f42a4ca301a4e9c06fee039b61ae02d87aa66 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerCsv.php @@ -16,7 +16,7 @@ class ExportCustomerCsv extends \Magento\Reports\Controller\Adminhtml\Report\Rev * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $fileName = 'review_customer.csv'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerExcel.php index 9744feb1f5e6928be05cb71522c8df861c9f04ac..7dfe0c646d0bf9daebcb041994e1cd9c177e78b6 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportCustomerExcel.php @@ -16,7 +16,7 @@ class ExportCustomerExcel extends \Magento\Reports\Controller\Adminhtml\Report\R * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $fileName = 'review_customer.xml'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductCsv.php index 2c471b803049ce9d44dfd80ac3084d59385dce7b..15d4d4d6df0adaa8f81d4ae8f013083f28f9212e 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductCsv.php @@ -16,7 +16,7 @@ class ExportProductCsv extends \Magento\Reports\Controller\Adminhtml\Report\Revi * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $fileName = 'review_product.csv'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailCsv.php index 7358396f2aa0f9739a108ede6f489dc7027ac6b3..d27f3fe37c74d4d9b2b3887d036f8acfbbab43f6 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailCsv.php @@ -16,7 +16,7 @@ class ExportProductDetailCsv extends \Magento\Reports\Controller\Adminhtml\Repor * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'review_product_detail.csv'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailExcel.php index 9e80e2309c13bd8ff5c11fd5eea3caff7e57fafe..32abda47b6dcd3fa30e5de4cd9cdd42d9c7b3b10 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductDetailExcel.php @@ -16,7 +16,7 @@ class ExportProductDetailExcel extends \Magento\Reports\Controller\Adminhtml\Rep * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'review_product_detail.xml'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductExcel.php index c5b6b33457fb4ebae588161c22cb18c6b1c7473f..dc04c672a10db6b0deba672ef577a7b99d628564 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ExportProductExcel.php @@ -16,7 +16,7 @@ class ExportProductExcel extends \Magento\Reports\Controller\Adminhtml\Report\Re * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $fileName = 'review_product.xml'; diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Product.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Product.php index fe7364181ea67a7f722f75b9f0045ee3397527ea..e5f5aecb69b5195b740c5c6f0ef48246b1adbda7 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Product.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/Product.php @@ -13,7 +13,7 @@ class Product extends \Magento\Reports\Controller\Adminhtml\Report\Review * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Review::report_review_product' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ProductDetail.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ProductDetail.php index 4ee32cade01de648c4ad348b6186936a488c5511..d4bea33168c2c273c398500f5d4ca9a368974757 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ProductDetail.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review/ProductDetail.php @@ -13,7 +13,7 @@ class ProductDetail extends \Magento\Reports\Controller\Adminhtml\Report\Review * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Review::report_review' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Bestsellers.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Bestsellers.php index 5c8247bda642559b06289c1352c5cde48fba85b4..97be72a935ddec22e8f6ebd6d4c987d0d37f9296 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Bestsellers.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Bestsellers.php @@ -15,7 +15,7 @@ class Bestsellers extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_showLastExecutionTime(Flag::REPORT_BESTSELLERS_FLAG_CODE, 'bestsellers'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Coupons.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Coupons.php index 1ccc99988bb4079f809d1f2fbd6bca5134daf0ac..e9ece3ae68256640b3cb4ce888be5a5dd2d09314 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Coupons.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Coupons.php @@ -15,7 +15,7 @@ class Coupons extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_showLastExecutionTime(Flag::REPORT_COUPONS_FLAG_CODE, 'coupons'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersCsv.php index e831fc8347189e732570bfba67e5d89f0e2d86cd..0a531d06068a42bf260257333f1aab393035bb1b 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersCsv.php @@ -16,7 +16,7 @@ class ExportBestsellersCsv extends \Magento\Reports\Controller\Adminhtml\Report\ * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'bestsellers.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Bestsellers\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersExcel.php index bba9bbacf88611f7216cbf7fbe8f34884667ef3d..2d1afc0fac191d37515e316df9fae7fbe0154fe6 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportBestsellersExcel.php @@ -16,7 +16,7 @@ class ExportBestsellersExcel extends \Magento\Reports\Controller\Adminhtml\Repor * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'bestsellers.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Bestsellers\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsCsv.php index 4b5ed51a45f4ec9f95024b3b1c10e0524cd4ac74..ccd04b83482e593bd914040c6375ea7fddd2f4e9 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsCsv.php @@ -16,7 +16,7 @@ class ExportCouponsCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sale * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'coupons.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Coupons\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsExcel.php index 54641cd44945bfeaddd5b4e8eecc939f672bc6ea..d70457746f8fc83f50f7919da03564e1612f25f3 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportCouponsExcel.php @@ -16,7 +16,7 @@ class ExportCouponsExcel extends \Magento\Reports\Controller\Adminhtml\Report\Sa * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'coupons.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Coupons\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedCsv.php index 46f977f41578600ae9dbb49612f1f38d8923e5a8..e4ad782163c32580899d08b5780e688540508d1d 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedCsv.php @@ -16,7 +16,7 @@ class ExportInvoicedCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sal * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'invoiced.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Invoiced\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedExcel.php index 771078bae984d3983931b3562d7536526c818426..503bc1562cef1af93f89a5e713bc66e27de80be6 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportInvoicedExcel.php @@ -16,7 +16,7 @@ class ExportInvoicedExcel extends \Magento\Reports\Controller\Adminhtml\Report\S * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'invoiced.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Invoiced\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedCsv.php index 375b63e36000d3ea98d03a4c818a8ced86a68272..987b288f934c7bfa35a1f1be4977e19a9ea35075 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedCsv.php @@ -16,7 +16,7 @@ class ExportRefundedCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sal * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'refunded.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Refunded\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedExcel.php index ca4a842af874dceefc0bd17f870419d4b164ab83..311380659a6233d9d05bc7a543cb030baabbd05a 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportRefundedExcel.php @@ -16,7 +16,7 @@ class ExportRefundedExcel extends \Magento\Reports\Controller\Adminhtml\Report\S * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'refunded.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Refunded\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesCsv.php index 345f809725e9c6798008e626dc8236a20c32c215..20e4a577b3fa3f55d288adaf8432b8c0c9099290 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesCsv.php @@ -16,7 +16,7 @@ class ExportSalesCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'sales.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Sales\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesExcel.php index b0bc6001d458aee99e19f3ce3bd39dec033d00d1..0e5b9beacccb4b93bf008093432dd757a3950b85 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportSalesExcel.php @@ -16,7 +16,7 @@ class ExportSalesExcel extends \Magento\Reports\Controller\Adminhtml\Report\Sale * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'sales.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Sales\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingCsv.php index 82fe7afbeadfab0a42cdc2a6a58822ac3d535c4e..c7c699a105f4076c79fa58e1450944138559f304 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingCsv.php @@ -16,7 +16,7 @@ class ExportShippingCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sal * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shipping.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Shipping\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingExcel.php index 39b7a4676c13082b7656df219215a6ccef58549d..13ae0fe237c00687ff38a7e53079d3925b1e61bd 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportShippingExcel.php @@ -16,7 +16,7 @@ class ExportShippingExcel extends \Magento\Reports\Controller\Adminhtml\Report\S * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shipping.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Shipping\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxCsv.php index ae7ce954bb3b2596be096b5296df8aaac24b7c90..d9496b9f5ee6e14537d009cf7509081511cd5a51 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxCsv.php @@ -16,7 +16,7 @@ class ExportTaxCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'tax.csv'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Tax\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxExcel.php index b7648a55d5ba5fedd60f442d7f8a1e7dc5941b92..f7737132e9d1648346d1a03c1f03d90b4b4683a2 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/ExportTaxExcel.php @@ -16,7 +16,7 @@ class ExportTaxExcel extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'tax.xml'; $grid = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Sales\Tax\Grid'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Invoiced.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Invoiced.php index 3a7cd19fef7a6bc5cb0e9042bed4209cfea83c92..242d9c41d273f481880f1f0c966f3a34d5cdd670 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Invoiced.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Invoiced.php @@ -15,7 +15,7 @@ class Invoiced extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_showLastExecutionTime(Flag::REPORT_INVOICE_FLAG_CODE, 'invoiced'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshLifetime.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshLifetime.php index d093fd273b7ad82742a6d65d7f911ad98ebca9f2..19e3007db7a018afd44fe241deaee35822090eba 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshLifetime.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshLifetime.php @@ -13,7 +13,7 @@ class RefreshLifetime extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('refreshLifetime', 'report_statistics'); } diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshRecent.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshRecent.php index 2d4665fe4f4041e39fbf2abdcaa8632bd2f66e3b..0b7ccef07bdc1cf266239454bf4a6015176f6314 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshRecent.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshRecent.php @@ -13,7 +13,7 @@ class RefreshRecent extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('refreshRecent', 'report_statistics'); } diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshStatistics.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshStatistics.php index 77c6bfab4db5923f0dc2382eb9e10df15850fd6b..64ac14d427ff9865a9bb1c711708d431d74eca25 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshStatistics.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/RefreshStatistics.php @@ -13,7 +13,7 @@ class RefreshStatistics extends \Magento\Reports\Controller\Adminhtml\Report\Sal * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('index', 'report_statistics'); } diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Refunded.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Refunded.php index 5d03937d815d00e09fb1adfcd4de904d88f033d2..3120ff01236a6764499bc4f3fd67c3ad25fab46f 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Refunded.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Refunded.php @@ -15,7 +15,7 @@ class Refunded extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_showLastExecutionTime(Flag::REPORT_REFUNDED_FLAG_CODE, 'refunded'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Sales.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Sales.php index c54cafb6c0ca2bc98d15a7b02d2bb5491f0db9c5..3dd5c10bf9f19a58dc100df9d986e4cb11a7c6bf 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Sales.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Sales.php @@ -15,7 +15,7 @@ class Sales extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_showLastExecutionTime(Flag::REPORT_ORDER_FLAG_CODE, 'sales'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Shipping.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Shipping.php index 46aa42db9b19dc0060d0f3087d2491365b708867..1068596451067c6c1d49c950fc8e18a2604926ef 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Shipping.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Shipping.php @@ -15,7 +15,7 @@ class Shipping extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_showLastExecutionTime(Flag::REPORT_SHIPPING_FLAG_CODE, 'shipping'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Tax.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Tax.php index 6fd6555ef09e983d2f11e0eddbc1b4fb2439d3be..143140f42b0f9e6b0e1303bb62e4c20b52af33a5 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Tax.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Sales/Tax.php @@ -15,7 +15,7 @@ class Tax extends \Magento\Reports\Controller\Adminhtml\Report\Sales * * @return void */ - public function execute() + public function executeInternal() { $this->_showLastExecutionTime(Flag::REPORT_TAX_FLAG_CODE, 'tax'); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Abandoned.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Abandoned.php index 5db3858d0043c85840c6155e93c5238239ca0f02..6c88e443ca5171d6beec7b2ea95a902f704c7e70 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Abandoned.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Abandoned.php @@ -13,7 +13,7 @@ class Abandoned extends \Magento\Reports\Controller\Adminhtml\Report\Shopcart * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_shopcart_abandoned' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Customer.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Customer.php index 376d220a795b27532a5e3a9bbb619c2acf77c9ac..b8045d003aafd415fb49d543bdf5451b92f0d9e3 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Customer.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Customer.php @@ -13,7 +13,7 @@ class Customer extends \Magento\Reports\Controller\Adminhtml\Report\Shopcart * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_shopcart_customer' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedCsv.php index 6023236b82c46af10b6b5c3cd78c7e8909e05e70..aff71b76b37494c523cefcaa4a8651189ad2af1c 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedCsv.php @@ -16,7 +16,7 @@ class ExportAbandonedCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sh * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shopcart_abandoned.csv'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedExcel.php index 6118c9fb20a479df4032fbfcb845d70486548ecf..71aae22568e422068c7e44fafd4566dbb9dc33a0 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportAbandonedExcel.php @@ -16,7 +16,7 @@ class ExportAbandonedExcel extends \Magento\Reports\Controller\Adminhtml\Report\ * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shopcart_abandoned.xml'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerCsv.php index 30218563edddbcca3e73c7261c07324ea499db4a..4405cfc9614f969d706259930ff7bfcb1737d750 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerCsv.php @@ -15,7 +15,7 @@ class ExportCustomerCsv extends \Magento\Reports\Controller\Adminhtml\Report\Sho * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shopcart_customer.csv'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerExcel.php index 2c017142a18c10f978f7188addcb8ce21f089c58..f20fcb9c20f8b297b27b54ac7ef361aa07ab072b 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportCustomerExcel.php @@ -15,7 +15,7 @@ class ExportCustomerExcel extends \Magento\Reports\Controller\Adminhtml\Report\S * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shopcart_customer.xml'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductCsv.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductCsv.php index c244aee257429c473e4db6761a4c0a989efc20ee..9ad9dd030d3be27272d66021166311c977aa55ea 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductCsv.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductCsv.php @@ -16,7 +16,7 @@ class ExportProductCsv extends \Magento\Reports\Controller\Adminhtml\Report\Shop * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shopcart_product.csv'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductExcel.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductExcel.php index 1b8442918643f89f4e6cbfd8c5cd540d03f17346..43ed6690d3bb277d0272984a22e55447daa49317 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductExcel.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/ExportProductExcel.php @@ -16,7 +16,7 @@ class ExportProductExcel extends \Magento\Reports\Controller\Adminhtml\Report\Sh * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $fileName = 'shopcart_product.xml'; $content = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Product.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Product.php index c257a751084029f699d96bcf21d61d6ced53bb80..d8035545af1eb60ab590177abef4cf82e2ed41f6 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Product.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Shopcart/Product.php @@ -13,7 +13,7 @@ class Product extends \Magento\Reports\Controller\Adminhtml\Report\Shopcart * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_shopcart_product' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/Index.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/Index.php index e4cf01207adf871955ead7e34e3b25901d0ee1cf..36e87ff3d7bbb146a35e471b550e9b215cd6fdf1 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/Index.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Reports\Controller\Adminhtml\Report\Statistics * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_setActiveMenu( 'Magento_Reports::report_statistics_refresh' diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php index 35222afc53af688cd31d3c83078ad074bdc5d8ea..016c026abafc79ab1a276c073fbd021c37e1e9e2 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php @@ -14,7 +14,7 @@ class RefreshLifetime extends \Magento\Reports\Controller\Adminhtml\Report\Stati * * @return void */ - public function execute() + public function executeInternal() { try { $collectionsNames = $this->_getCollectionNames(); diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshRecent.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshRecent.php index e4e5c4e651095eb8a147b5d1ccc88522bd6038ef..8864c3401ece5c817c4b26c57a7e77727eb0ad49 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshRecent.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshRecent.php @@ -14,7 +14,7 @@ class RefreshRecent extends \Magento\Reports\Controller\Adminhtml\Report\Statist * * @return void */ - public function execute() + public function executeInternal() { try { $collectionsNames = $this->_getCollectionNames(); diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/AccountsTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/AccountsTest.php index baad059fb482561e8f29b775052cfd835b91e985..96a1921b295d769ed7cda8a730a379540d4cd2f7 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/AccountsTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/AccountsTest.php @@ -70,6 +70,6 @@ class AccountsTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Repor ->expects($this->at(2)) ->method('addLink') ->with(new Phrase('New Accounts'), new Phrase('New Accounts')); - $this->accounts->execute(); + $this->accounts->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsCsvTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsCsvTest.php index c5e9ccccf6d933966c1802fe34a2c0fdf2c6c885..273574130f18a3569e6980056ad14c35edf9da27 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsCsvTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsCsvTest.php @@ -45,6 +45,6 @@ class ExportAccountsCsvTest extends \Magento\Reports\Test\Unit\Controller\Adminh ->expects($this->once()) ->method('create') ->with('new_accounts.csv', ['export'], \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportAccountsCsv->execute(); + $this->exportAccountsCsv->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsExcelTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsExcelTest.php index 98134d20ccd9edc52fa27958a60c437657c1756c..8205201a150ed319afdcb576400552e488f2b2fc 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsExcelTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportAccountsExcelTest.php @@ -45,6 +45,6 @@ class ExportAccountsExcelTest extends \Magento\Reports\Test\Unit\Controller\Admi ->expects($this->once()) ->method('create') ->with('new_accounts.xml', ['export'], \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportAccountsExcel->execute(); + $this->exportAccountsExcel->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersCsvTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersCsvTest.php index 573720a1859cd759ca99ba03f9ec0b93252904f4..50bde9a3f420318606b99b1f1fc5c9cdb3057220 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersCsvTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersCsvTest.php @@ -45,6 +45,6 @@ class ExportOrdersCsvTest extends \Magento\Reports\Test\Unit\Controller\Adminhtm ->expects($this->once()) ->method('create') ->with('customers_orders.csv', ['export'], \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportOrdersCsv->execute(); + $this->exportOrdersCsv->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersExcelTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersExcelTest.php index b8273becb2d66d0a3636e6514a37f77c599e87d9..8cc84ac980e64a0f671af417c3fdf97cf09270d2 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersExcelTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportOrdersExcelTest.php @@ -45,6 +45,6 @@ class ExportOrdersExcelTest extends \Magento\Reports\Test\Unit\Controller\Adminh ->expects($this->once()) ->method('create') ->with('customers_orders.xml', ['export'], \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportOrdersExcel->execute(); + $this->exportOrdersExcel->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsCsvTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsCsvTest.php index b4a7a0c68e2d2872f7e04a4a655eb614c5d72893..989d05bc651e6e9be857a46913b3c3cab925eca6 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsCsvTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsCsvTest.php @@ -45,6 +45,6 @@ class ExportTotalsCsvTest extends \Magento\Reports\Test\Unit\Controller\Adminhtm ->expects($this->once()) ->method('create') ->with('customer_totals.csv', ['export'], \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportTotalsCsv->execute(); + $this->exportTotalsCsv->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsExcelTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsExcelTest.php index 33177c27a183fbd6aa03e6e8f208190dc43a433d..3c2cb5976476c0c2d3b5cc5f971743de6d3b3570 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsExcelTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/ExportTotalsExcelTest.php @@ -45,6 +45,6 @@ class ExportTotalsExcelTest extends \Magento\Reports\Test\Unit\Controller\Adminh ->expects($this->once()) ->method('create') ->with('customer_totals.xml', ['export'], \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportTotalsExcel->execute(); + $this->exportTotalsExcel->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/OrdersTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/OrdersTest.php index 1d960cc8175d3e38fbde59cde3816c7c02341a72..c15797a18d9c1944ba020ae047c01d5182e6322c 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/OrdersTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/OrdersTest.php @@ -70,6 +70,6 @@ class OrdersTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Report\ ->expects($this->at(2)) ->method('addLink') ->with(new Phrase('Customers by Number of Orders'), new Phrase('Customers by Number of Orders')); - $this->orders->execute(); + $this->orders->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/TotalsTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/TotalsTest.php index a479fb53c3a55cbbdb769d94cc0e81d6065b9138..44d554a10c75dc447742b865cda03b0a5e5daddd 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/TotalsTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Customer/TotalsTest.php @@ -70,6 +70,6 @@ class TotalsTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Report\ ->expects($this->at(2)) ->method('addLink') ->with(new Phrase('Customers by Orders Total'), new Phrase('Customers by Orders Total')); - $this->totals->execute(); + $this->totals->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/DownloadsTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/DownloadsTest.php index 6bae34a56872cc5ddce13082bd1bfbe50a6f5699..b3e5f9c472563eb99e87b8a9b9b9f1c077fafbc8 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/DownloadsTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/DownloadsTest.php @@ -86,6 +86,6 @@ class DownloadsTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Repo ->with('Magento\Reports\Block\Adminhtml\Product\Downloads') ->willReturn($this->abstractBlockMock); - $this->downloads->execute(); + $this->downloads->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsCsvTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsCsvTest.php index 9c80ef0700bc53047a1afd2c8e48372a69a71e4d..3b54b2e96fcf392f0cb7252edac2f776048b7ef1 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsCsvTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsCsvTest.php @@ -70,6 +70,6 @@ class ExportDownloadsCsvTest extends \Magento\Reports\Test\Unit\Controller\Admin ->method('create') ->with('products_downloads.csv', $content); - $this->exportDownloadsCsv->execute(); + $this->exportDownloadsCsv->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsExcelTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsExcelTest.php index 010e14168b4fd7b1cb2c04ef5ba570d594f00c9d..864abadb92d6b2b4ad4d45ddcb8babc1bf95e3cc 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsExcelTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportDownloadsExcelTest.php @@ -72,6 +72,6 @@ class ExportDownloadsExcelTest extends \Magento\Reports\Test\Unit\Controller\Adm ->method('create') ->with($fileName, $content); - $this->exportDownloadsExcel->execute(); + $this->exportDownloadsExcel->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockCsvTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockCsvTest.php index 074c8e88d572fee4740ba0e8e7efd690b2b499b6..d1897fe6ac3708175e83e2610ff2c9a6a5adf4c2 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockCsvTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockCsvTest.php @@ -65,6 +65,6 @@ class ExportLowstockCsvTest extends \Magento\Reports\Test\Unit\Controller\Adminh ->method('create') ->with('products_lowstock.csv', $content, \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportLowstockCsv->execute(); + $this->exportLowstockCsv->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockExcelTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockExcelTest.php index 509fc27b170d4bc58ede9bebc1a31470906c1bf1..0b5b2240fabc8897713df92cb1b19d5971f32236 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockExcelTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportLowstockExcelTest.php @@ -65,6 +65,6 @@ class ExportLowstockExcelTest extends \Magento\Reports\Test\Unit\Controller\Admi ->method('create') ->with('products_lowstock.xml', $content, \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportLowstockExcel->execute(); + $this->exportLowstockExcel->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldCsvTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldCsvTest.php index b0f76d58049625139f83fc4f0da04b8b5870598b..2c01c8d3eab78646fe1cd21d5978c2f18db6b3b2 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldCsvTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldCsvTest.php @@ -65,6 +65,6 @@ class ExportSoldCsvTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\ ->method('create') ->with('products_ordered.csv', $content, \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportSoldCsv->execute(); + $this->exportSoldCsv->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldExcelTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldExcelTest.php index 21ce5635d33dbd5ea0be4bbdf2933b143e917744..202252d7f258888178cf043b76c739ea2d62c1da 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldExcelTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportSoldExcelTest.php @@ -67,6 +67,6 @@ class ExportSoldExcelTest extends \Magento\Reports\Test\Unit\Controller\Adminhtm ->method('create') ->with($fileName, $content, \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportSoldExcel->execute(); + $this->exportSoldExcel->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedCsvTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedCsvTest.php index e31655f1183781cdf338c23036a73b4008f468db..f1f060d09f2da78a6fdd6d65e06194d26905131e 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedCsvTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedCsvTest.php @@ -90,6 +90,6 @@ class ExportViewedCsvTest extends \Magento\Reports\Test\Unit\Controller\Adminhtm ->method('create') ->with($fileName, $content, \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportViewedCsv->execute(); + $this->exportViewedCsv->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedExcelTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedExcelTest.php index 43e615c7a9acdff42f21262313b3aa996c1d6c05..4a92d6c8f2f2bb5d3ad9b22fbd655ecbfd4ca6b8 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedExcelTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ExportViewedExcelTest.php @@ -91,6 +91,6 @@ class ExportViewedExcelTest extends \Magento\Reports\Test\Unit\Controller\Adminh ->method('create') ->with($fileName, $content, \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR); - $this->exportViewedExcel->execute(); + $this->exportViewedExcel->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/LowstockTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/LowstockTest.php index 10eaa830d799921380c69003fedbbf9999894922..0ec6a082b926e29c05cbd33c8885d4be6b32d3e7 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/LowstockTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/LowstockTest.php @@ -83,6 +83,6 @@ class LowstockTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Repor [new Phrase('Low Stock'), new Phrase('Low Stock')] ); - $this->lowstock->execute(); + $this->lowstock->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/SoldTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/SoldTest.php index 34c9e12df2c48c376f04a64815307af91f82a174..82981d6f142e2094093d3abd8de74f07cab69c4b 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/SoldTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/SoldTest.php @@ -83,6 +83,6 @@ class SoldTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Report\Ab [new Phrase('Products Ordered'), new Phrase('Products Ordered')] ); - $this->sold->execute(); + $this->sold->executeInternal(); } } diff --git a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ViewedTest.php b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ViewedTest.php index 686aed163ece4db148a10a09cf4df057090d7c08..01cfe44f65256054da9f5c05091e615493666ad3 100644 --- a/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ViewedTest.php +++ b/app/code/Magento/Reports/Test/Unit/Controller/Adminhtml/Report/Product/ViewedTest.php @@ -151,7 +151,7 @@ class ViewedTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Report\ ->expects($this->once()) ->method('renderLayout'); - $this->viewed->execute(); + $this->viewed->executeInternal(); } /** @@ -202,7 +202,7 @@ class ViewedTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Report\ ->method('setActive') ->willThrowException(new \Exception()); - $this->viewed->execute(); + $this->viewed->executeInternal(); } /** @@ -222,6 +222,6 @@ class ViewedTest extends \Magento\Reports\Test\Unit\Controller\Adminhtml\Report\ ->method('setActive') ->willThrowException(new \Magento\Framework\Exception\LocalizedException($errorText)); - $this->viewed->execute(); + $this->viewed->executeInternal(); } } diff --git a/app/code/Magento/Reports/etc/acl.xml b/app/code/Magento/Reports/etc/acl.xml index 834fcdc528545f48bf118741349507b57b99a3a2..6d6972fd734122ad48d6c2a52637e1aec0c15a01 100644 --- a/app/code/Magento/Reports/etc/acl.xml +++ b/app/code/Magento/Reports/etc/acl.xml @@ -42,7 +42,7 @@ <resource id="Magento_Reports::downloads" title="Downloads" sortOrder="50" /> </resource> <resource id="Magento_Reports::statistics" title="Statistics" sortOrder="80"> - <resource id="Magento_Reports::statistics_refresh" title="Refresh statistics" sortOrder="10"/> + <resource id="Magento_Reports::statistics_refresh" title="Refresh Statistics" sortOrder="10"/> </resource> </resource> <resource id="Magento_Backend::stores"> diff --git a/app/code/Magento/Reports/i18n/de_DE.csv b/app/code/Magento/Reports/i18n/de_DE.csv index b2bd8ea9e794c94b53e26c11e1327a4b606c2230..c751048ec4fd224e38561e220861b868186431de 100644 --- a/app/code/Magento/Reports/i18n/de_DE.csv +++ b/app/code/Magento/Reports/i18n/de_DE.csv @@ -218,3 +218,10 @@ Hits,Treffer "Refresh Statistics for the Last Day","Aktualisiere Statistik für den letzten Tag" "Are you sure you want to refresh statistics for last day?","Are you sure you want to refresh statistics for last day?" undefined,undefiniert +"Products in Cart","Artikel in den Warenkörbe" +"By Customers","By Customers" +"By Products","By Products" +Refunds,Refunds +"PayPal Settlement","PayPal Settlement" +"Order Count","Order Count" +Bestseller,Bestseller diff --git a/app/code/Magento/Reports/i18n/en_US.csv b/app/code/Magento/Reports/i18n/en_US.csv index 03173d8b230fd1ecb99988c578b422ccfb2d2e4a..3ab4dda3fe68c2f1a4935bd58e955aa6a0e59ad5 100644 --- a/app/code/Magento/Reports/i18n/en_US.csv +++ b/app/code/Magento/Reports/i18n/en_US.csv @@ -219,3 +219,10 @@ Hits,Hits "Refresh Statistics for the Last Day","Refresh Statistics for the Last Day" "Are you sure you want to refresh statistics for last day?","Are you sure you want to refresh statistics for last day?" undefined,undefined +"Products in Cart","Products in Cart" +"By Customers","By Customers" +"By Products","By Products" +Refunds,Refunds +"PayPal Settlement","PayPal Settlement" +"Order Count","Order Count" +Bestseller,Bestseller diff --git a/app/code/Magento/Reports/i18n/es_ES.csv b/app/code/Magento/Reports/i18n/es_ES.csv index 26595380f01b54e41e4dd5bcaec1462c32883200..b025859c92e5165beeda1d478914a66b1346c056 100644 --- a/app/code/Magento/Reports/i18n/es_ES.csv +++ b/app/code/Magento/Reports/i18n/es_ES.csv @@ -218,3 +218,10 @@ Hits,Visitas. "Refresh Statistics for the Last Day","Actualiza estadÃsticas del último dÃa" "Are you sure you want to refresh statistics for last day?","Are you sure you want to refresh statistics for last day?" undefined,Indefinido +"Products in Cart","Products in Cart" +"By Customers","By Customers" +"By Products","By Products" +Refunds,Refunds +"PayPal Settlement","PayPal Settlement" +"Order Count","Order Count" +Bestseller,Bestseller diff --git a/app/code/Magento/Reports/i18n/fr_FR.csv b/app/code/Magento/Reports/i18n/fr_FR.csv index 488b76e42c438ae720f3bef18496d7172d46f4c2..de79ece2ef85639ec67c6598c2215df41e650ca8 100644 --- a/app/code/Magento/Reports/i18n/fr_FR.csv +++ b/app/code/Magento/Reports/i18n/fr_FR.csv @@ -218,3 +218,10 @@ Hits,Clics "Refresh Statistics for the Last Day","Rafraîchir les statistiques de la veille" "Are you sure you want to refresh statistics for last day?","Are you sure you want to refresh statistics for last day?" undefined,indéfini +"Products in Cart","Products in Cart" +"By Customers","By Customers" +"By Products","By Products" +Refunds,Refunds +"PayPal Settlement","PayPal Settlement" +"Order Count","Order Count" +Bestseller,Bestseller diff --git a/app/code/Magento/Reports/i18n/nl_NL.csv b/app/code/Magento/Reports/i18n/nl_NL.csv index d35cbaf6f8596c5018af24d5c16531646d61847f..f8b5dc7e7c8ec45bf3957f663d135f7d4d9bde9b 100644 --- a/app/code/Magento/Reports/i18n/nl_NL.csv +++ b/app/code/Magento/Reports/i18n/nl_NL.csv @@ -218,3 +218,10 @@ Hits,Bezoeken "Refresh Statistics for the Last Day","Statistiek voor de laatste dag verversen" "Are you sure you want to refresh statistics for last day?","Are you sure you want to refresh statistics for last day?" undefined,ongedefinieerd +"Products in Cart","Products in Cart" +"By Customers","By Customers" +"By Products","By Products" +Refunds,Refunds +"PayPal Settlement","PayPal Settlement" +"Order Count","Order Count" +Bestseller,Bestseller diff --git a/app/code/Magento/Reports/i18n/pt_BR.csv b/app/code/Magento/Reports/i18n/pt_BR.csv index 03072fb8a8dc293f50cfd4b97d9109fa33e2d3ea..8ef822b53a296caf6ef2a9fb615bfe6cc44ddbb5 100644 --- a/app/code/Magento/Reports/i18n/pt_BR.csv +++ b/app/code/Magento/Reports/i18n/pt_BR.csv @@ -218,3 +218,10 @@ Hits,CrÃticas "Refresh Statistics for the Last Day","Atualizar estatÃsticas para o Último dia" "Are you sure you want to refresh statistics for last day?","Are you sure you want to refresh statistics for last day?" undefined,indefinido +"Products in Cart","Products in Cart" +"By Customers","By Customers" +"By Products","By Products" +Refunds,Refunds +"PayPal Settlement","PayPal Settlement" +"Order Count","Order Count" +Bestseller,Bestseller diff --git a/app/code/Magento/Reports/i18n/zh_Hans_CN.csv b/app/code/Magento/Reports/i18n/zh_Hans_CN.csv index 3b36163f6b0e33456feaa2170fe8ebc758509d39..bf85485daa4fd388c8325b68833e802ea5e4ff0a 100644 --- a/app/code/Magento/Reports/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Reports/i18n/zh_Hans_CN.csv @@ -218,3 +218,10 @@ Hits,æç¤º "Refresh Statistics for the Last Day",åˆ·æ–°æ˜¨å¤©çš„çŠ¶æ€ "Are you sure you want to refresh statistics for last day?","Are you sure you want to refresh statistics for last day?" undefined,未定义 +"Products in Cart","Products in Cart" +"By Customers","By Customers" +"By Products","By Products" +Refunds,Refunds +"PayPal Settlement","PayPal Settlement" +"Order Count","Order Count" +Bestseller,Bestseller diff --git a/app/code/Magento/Review/Block/Product/Review.php b/app/code/Magento/Review/Block/Product/Review.php index b553291cfbf8728ae3865831d2fbf5ee10edb176..02764dc5123f1f59535e6865bb9024a361f9d635 100644 --- a/app/code/Magento/Review/Block/Product/Review.php +++ b/app/code/Magento/Review/Block/Product/Review.php @@ -5,13 +5,15 @@ */ namespace Magento\Review\Block\Product; +use Magento\Framework\DataObject\IdentityInterface; +use Magento\Framework\View\Element\Template; /** * Product Review Tab * * @author Magento Core Team <core@magentocommerce.com> */ -class Review extends \Magento\Framework\View\Element\Template +class Review extends Template implements IdentityInterface { /** * Core registry @@ -98,4 +100,14 @@ class Review extends \Magento\Framework\View\Element\Template return $collection->getSize(); } + + /** + * Return unique ID(s) for each object in system + * + * @return array + */ + public function getIdentities() + { + return [\Magento\Review\Model\Review::CACHE_TAG]; + } } diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Delete.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Delete.php index ce84f4e99850aca32200ec392ffb6bbc3801cec9..f6ea8b9f899d2960e0af610e0ae56c0da163f8af 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Delete.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Delete.php @@ -13,7 +13,7 @@ class Delete extends ProductController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Edit.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Edit.php index 10026df39b87aaa1a7e978a5e8a87dcd01d3434c..658b798acbf2e2bb2d404423f0ffc6c6e72617ff 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Edit.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Edit.php @@ -13,7 +13,7 @@ class Edit extends ProductController /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Index.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Index.php index da31a87aa9f530ccff8daca2336a5a47e2dfdb77..e999732f5ef1499160d8122844124c32f8ee6e8d 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Index.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Index.php @@ -13,7 +13,7 @@ class Index extends ProductController /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('ajax')) { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php b/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php index 2f449cfd4caf68ab893f763ca652dcb6f859b13b..acd2b40a78ff9223acccc40db23e53b835ae7eb6 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php @@ -42,7 +42,7 @@ class JsonProductInfo extends ProductController /** * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $response = new DataObject(); $id = $this->getRequest()->getParam('id'); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php b/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php index 6a64c6cf54982c84dfc5aff6be22f7f185db6a75..73dfe572ba718e8b4a3156117ff34c27467cd954 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php @@ -14,7 +14,7 @@ class MassDelete extends ProductController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $reviewsIds = $this->getRequest()->getParam('reviews'); if (!is_array($reviewsIds)) { diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php b/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php index 285503a236500d506b746217ec92bdfc685457c1..9866a2be76a899f7000998ef65666d031efe8574 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php @@ -14,7 +14,7 @@ class MassUpdateStatus extends ProductController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $reviewsIds = $this->getRequest()->getParam('reviews'); if (!is_array($reviewsIds)) { diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php b/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php index 4e65891133acef664ab66b80293888f2a9246a9d..f9d646d68e6d5272ab1ef4635da9e3ec7d7be870 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php @@ -14,7 +14,7 @@ class MassVisibleIn extends ProductController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $reviewsIds = $this->getRequest()->getParam('reviews'); if (!is_array($reviewsIds)) { diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/NewAction.php b/app/code/Magento/Review/Controller/Adminhtml/Product/NewAction.php index e5d2a0e1b3159663e281e1afff6c03081392d387..4cbd60d0342aaf21a2831363d9b259eea5917e94 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/NewAction.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends ProductController /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Pending.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Pending.php index 46b341492ab8bdc1aa4a1541ac5fcc622db0a763..ddae839c33cddd3a84201e7c2464890ac48bee5d 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Pending.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Pending.php @@ -13,7 +13,7 @@ class Pending extends ProductController /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getParam('ajax')) { $this->coreRegistry->register('usePendingFilter', true); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php index f6b7f24bffdbfb9bad62511a7a0a4df1c2d95f9d..20cc725e3d1f8cc56855571d1c08fe92559c1ed2 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php @@ -15,7 +15,7 @@ class Post extends ProductController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $productId = $this->getRequest()->getParam('product_id', false); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/ProductGrid.php b/app/code/Magento/Review/Controller/Adminhtml/Product/ProductGrid.php index afdd87aac5d5ac43fd31553eb9c9ccd69e7fdfac..43aaf18b4731665a75f43f6cdf39e6179c28eb38 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/ProductGrid.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/ProductGrid.php @@ -41,7 +41,7 @@ class ProductGrid extends ProductController /** * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $layout = $this->layoutFactory->create(); /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/RatingItems.php b/app/code/Magento/Review/Controller/Adminhtml/Product/RatingItems.php index f79da2549bf26dfc937e4d2e593045daa14ff0fc..46a2a19088f9097752f96fa462719d60cb5be318 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/RatingItems.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/RatingItems.php @@ -41,7 +41,7 @@ class RatingItems extends ProductController /** * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $layout = $this->layoutFactory->create(); /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/ReviewGrid.php b/app/code/Magento/Review/Controller/Adminhtml/Product/ReviewGrid.php index 293b958b6ec98633cbd15d903e33ce0fed1d1fdc..7715f73dbff7cab52457158dd262c0ab5e0967de 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/ReviewGrid.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/ReviewGrid.php @@ -41,7 +41,7 @@ class ReviewGrid extends ProductController /** * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $layout = $this->layoutFactory->create(); /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Reviews/Grid.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Reviews/Grid.php index 84606cfe8b33f061b98fefe7a31e18d30472b3f8..a88025a2755e193b224c117cc24881c9dfc7a249 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Reviews/Grid.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Reviews/Grid.php @@ -34,7 +34,7 @@ class Grid extends Action * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $product = $this->productBuilder->build($this->getRequest()); /** @var \Magento\Framework\View\Result\Layout $resultLayout */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php index f1121eec6b2f56e5c2664f71c5a3b1ef88d254d7..8494e1b55904b929fbbceed3210a3e7be1bfdb6b 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php @@ -15,7 +15,7 @@ class Save extends ProductController * @return \Magento\Backend\Model\View\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Rating/Delete.php b/app/code/Magento/Review/Controller/Adminhtml/Rating/Delete.php index 55fc796fc26c371f3c6946d440c8a40830de3380..818f8bf9351a58a26ac7538a6727a3e436c289d6 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Rating/Delete.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Rating/Delete.php @@ -13,7 +13,7 @@ class Delete extends RatingController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Rating/Edit.php b/app/code/Magento/Review/Controller/Adminhtml/Rating/Edit.php index 54bd62f83a1242a1540676a2af790873fccd09f9..e4a4e8808bc3c73dd04635f77b32955b974755e3 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Rating/Edit.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Rating/Edit.php @@ -13,7 +13,7 @@ class Edit extends RatingController /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->initEnityId(); /** @var \Magento\Review\Model\Rating $ratingModel */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Rating/Index.php b/app/code/Magento/Review/Controller/Adminhtml/Rating/Index.php index be9bebf78c7e91ae90ff8046fc508af8d5069dfc..1723d2800921dd7affea363797e8842491c3b9ad 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Rating/Index.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Rating/Index.php @@ -13,7 +13,7 @@ class Index extends RatingController /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->initEnityId(); /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Rating/NewAction.php b/app/code/Magento/Review/Controller/Adminhtml/Rating/NewAction.php index 162f85eac65911bf80cb9e08773f5d5408f51e6b..ec6190f27deefd4411f61b918a29abc5010c18be 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Rating/NewAction.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Rating/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends RatingController /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultFactory->create(ResultFactory::TYPE_FORWARD); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Rating/Save.php b/app/code/Magento/Review/Controller/Adminhtml/Rating/Save.php index 6cfaeabfa331e9a3b87cf5a18bcfc2d005e6faf1..2802b50031d154140889cba276303339f32440bd 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Rating/Save.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Rating/Save.php @@ -15,7 +15,7 @@ class Save extends RatingController * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $this->initEnityId(); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Review/Controller/Customer.php b/app/code/Magento/Review/Controller/Customer.php index 0e96a652b7247b06d326ceb3fe73fe42dc1dfeea..a1a39d544c27191c2c13e13ddff88388d513a0d1 100644 --- a/app/code/Magento/Review/Controller/Customer.php +++ b/app/code/Magento/Review/Controller/Customer.php @@ -40,11 +40,11 @@ abstract class Customer extends Action * @param \Magento\Framework\App\RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { if (!$this->customerSession->authenticate()) { $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); } - return parent::dispatch($request); + return parent::execute($request); } } diff --git a/app/code/Magento/Review/Controller/Customer/Index.php b/app/code/Magento/Review/Controller/Customer/Index.php index 6123c009cdda1d194e4ec2c4004699dc59d7e66b..e51ca5c54766109282a00d2e8807445cbcc8d458 100644 --- a/app/code/Magento/Review/Controller/Customer/Index.php +++ b/app/code/Magento/Review/Controller/Customer/Index.php @@ -15,7 +15,7 @@ class Index extends CustomerController * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); diff --git a/app/code/Magento/Review/Controller/Customer/View.php b/app/code/Magento/Review/Controller/Customer/View.php index 92972dce3aebc6e0f55b5c5aed0d5ee44797007e..222f8a0bcb0657f28c53ab3d215cead5c917d1ad 100644 --- a/app/code/Magento/Review/Controller/Customer/View.php +++ b/app/code/Magento/Review/Controller/Customer/View.php @@ -36,7 +36,7 @@ class View extends CustomerController * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $review = $this->reviewFactory->create()->load($this->getRequest()->getParam('id')); if ($review->getCustomerId() != $this->customerSession->getCustomerId()) { diff --git a/app/code/Magento/Review/Controller/Product.php b/app/code/Magento/Review/Controller/Product.php index a0137ef07b98c3f0a62862ad700c083d911168ab..8db2e062706beef0f7c5ca5f109e60ff51e23f0a 100644 --- a/app/code/Magento/Review/Controller/Product.php +++ b/app/code/Magento/Review/Controller/Product.php @@ -144,11 +144,11 @@ abstract class Product extends \Magento\Framework\App\Action\Action * @param RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $allowGuest = $this->_objectManager->get('Magento\Review\Helper\Data')->getIsGuestAllowToWrite(); if (!$request->isDispatched()) { - return parent::dispatch($request); + return parent::execute($request); } if (!$allowGuest && $request->getActionName() == 'post' && $request->isPost()) { @@ -166,7 +166,7 @@ abstract class Product extends \Magento\Framework\App\Action\Action } } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/Review/Controller/Product/ListAction.php b/app/code/Magento/Review/Controller/Product/ListAction.php index 3c28379ec4af6465399e0c1d4705d1ef7b60696c..910b9232da9ed46dedb84f988566df0f4b4a4996 100644 --- a/app/code/Magento/Review/Controller/Product/ListAction.php +++ b/app/code/Magento/Review/Controller/Product/ListAction.php @@ -38,7 +38,7 @@ class ListAction extends ProductController * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $product = $this->initProduct(); if ($product) { diff --git a/app/code/Magento/Review/Controller/Product/ListAjax.php b/app/code/Magento/Review/Controller/Product/ListAjax.php index b261971c509b1a0fde46649899aa7098bd7060a9..36fa3830a36cea4461ee8abc0458c9777dd37267 100644 --- a/app/code/Magento/Review/Controller/Product/ListAjax.php +++ b/app/code/Magento/Review/Controller/Product/ListAjax.php @@ -15,7 +15,7 @@ class ListAjax extends ProductController * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->initProduct(); /** @var \Magento\Framework\View\Result\Layout $resultLayout */ diff --git a/app/code/Magento/Review/Controller/Product/Post.php b/app/code/Magento/Review/Controller/Product/Post.php index a68f0d18c3bc56a807f46cb6596a2e6324a67ee0..9cf199d7f72c9e51fda91570b5a041d7c320b581 100644 --- a/app/code/Magento/Review/Controller/Product/Post.php +++ b/app/code/Magento/Review/Controller/Product/Post.php @@ -18,7 +18,7 @@ class Post extends ProductController * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Review/Controller/Product/View.php b/app/code/Magento/Review/Controller/Product/View.php index f65d1ceb8198cf1f0a834f5feabdf3aea6fef526..fb2a1893ba6e22da252bf5906c007773591fac17 100644 --- a/app/code/Magento/Review/Controller/Product/View.php +++ b/app/code/Magento/Review/Controller/Product/View.php @@ -40,7 +40,7 @@ class View extends ProductController * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $review = $this->loadReview((int)$this->getRequest()->getParam('id')); /** @var \Magento\Framework\Controller\Result\Forward $resultForward */ diff --git a/app/code/Magento/Review/Model/Rating.php b/app/code/Magento/Review/Model/Rating.php index f9af9a9223ee7bcb99cf2b8b5a50eae449ee8add..f251cf838cc1381e4786a54d40bcbda4db5fe683 100644 --- a/app/code/Magento/Review/Model/Rating.php +++ b/app/code/Magento/Review/Model/Rating.php @@ -5,6 +5,8 @@ */ namespace Magento\Review\Model; +use Magento\Framework\DataObject\IdentityInterface; + /** * Rating model * @@ -18,7 +20,7 @@ namespace Magento\Review\Model; * * @author Magento Core Team <core@magentocommerce.com> */ -class Rating extends \Magento\Framework\Model\AbstractModel +class Rating extends \Magento\Framework\Model\AbstractModel implements IdentityInterface { /** * rating entity codes @@ -161,4 +163,15 @@ class Rating extends \Magento\Framework\Model\AbstractModel { return $this->getResource()->getEntityIdByCode($entityCode); } + + /** + * Return unique ID(s) for each object in system + * + * @return array + */ + public function getIdentities() + { + // clear cache for all reviews + return [Review::CACHE_TAG]; + } } diff --git a/app/code/Magento/Review/Model/Review.php b/app/code/Magento/Review/Model/Review.php index a44da6d2f825851d1e65636140c2a8047a491af2..792babfba4e3203a536054c4555cbc48471edd64 100644 --- a/app/code/Magento/Review/Model/Review.php +++ b/app/code/Magento/Review/Model/Review.php @@ -31,6 +31,11 @@ class Review extends \Magento\Framework\Model\AbstractModel implements IdentityI */ protected $_eventPrefix = 'review'; + /** + * Cache tag + */ + const CACHE_TAG = 'review_block'; + /** * Product entity review code */ diff --git a/app/code/Magento/Review/Test/Unit/Block/Product/ReviewTest.php b/app/code/Magento/Review/Test/Unit/Block/Product/ReviewTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0bc6dd49473e2f59ec96f7313e98a4bdc1f32963 --- /dev/null +++ b/app/code/Magento/Review/Test/Unit/Block/Product/ReviewTest.php @@ -0,0 +1,163 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Review\Test\Unit\Block\Product; + +use Magento\Framework\Registry; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\View\Element\Template\Context; +use Magento\Catalog\Model\Product; +use Magento\Review\Block\Product\Review as ReviewBlock; +use Magento\Review\Model\ResourceModel\Review\Collection; +use Magento\Review\Model\ResourceModel\Review\CollectionFactory; +use Magento\Review\Model\Review; +use Magento\Store\Model\Store; +use Magento\Store\Model\StoreManager; + +/** + * Class ReviewTest + * @package Magento\Review\Test\Unit\Block\Product + */ +class ReviewTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Review\Block\Product\Review + */ + private $block; + + /** + * @var \Magento\Review\Model\ResourceModel\Review\Collection|\PHPUnit_Framework_MockObject_MockObject + */ + private $collection; + + /** + * @var \Magento\Review\Model\ResourceModel\Review\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $collectionFactory; + + /** + * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject + */ + private $registry; + + /** + * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject + */ + private $product; + + /** + * @var \Magento\Store\Model\StoreManager|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeManager; + + /** + * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject + */ + private $store; + + protected function setUp() + { + $this->initContextMock(); + $this->initRegistryMock(); + $this->initCollectionMocks(); + + $helper = new ObjectManager($this); + $this->block = $helper->getObject(ReviewBlock::class, [ + 'storeManager' => $this->storeManager, + 'registry' => $this->registry, + 'collectionFactory' => $this->collectionFactory, + ]); + } + + /** + * @covers \Magento\Review\Block\Product\Review::getIdentities() + */ + public function testGetIdentities() + { + static::assertEquals([Review::CACHE_TAG], $this->block->getIdentities()); + } + + /** + * Create mocks for collection and its factory + */ + private function initCollectionMocks() + { + $this->collection = $this->getMockBuilder(Collection::class) + ->disableOriginalConstructor() + ->setMethods(['addStoreFilter', 'addStatusFilter', 'addEntityFilter', 'getSize', '__wakeup']) + ->getMock(); + + $this->collection->expects(static::any()) + ->method('addStoreFilter') + ->willReturnSelf(); + + $this->collection->expects(static::any()) + ->method('addStatusFilter') + ->with(Review::STATUS_APPROVED) + ->willReturnSelf(); + + $this->collection->expects(static::any()) + ->method('addEntityFilter') + ->willReturnSelf(); + + $this->collectionFactory = $this->getMockBuilder(CollectionFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create', '__wakeup']) + ->getMock(); + + $this->collectionFactory->expects(static::once()) + ->method('create') + ->willReturn($this->collection); + } + + /** + * Create mock for registry object + */ + private function initRegistryMock() + { + $this->initProductMock(); + $this->registry = $this->getMockBuilder(Registry::class) + ->disableOriginalConstructor() + ->setMethods(['registry']) + ->getMock(); + + $this->registry->expects(static::once()) + ->method('registry') + ->with('product') + ->willReturn($this->product); + } + + /** + * Create mock object for catalog product + */ + private function initProductMock() + { + $this->product = $this->getMockBuilder(Product::class) + ->disableOriginalConstructor() + ->setMethods(['getId']) + ->getMock(); + } + + /** + * Create mock object for context + */ + private function initContextMock() + { + $this->store = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->setMethods(['getId', '__wakeup']) + ->getMock(); + + $this->storeManager = $this->getMockBuilder(StoreManager::class) + ->disableOriginalConstructor() + ->setMethods(['getStore', '__wakeup']) + ->getMock(); + + $this->storeManager->expects(static::any()) + ->method('getStore') + ->willReturn($this->store); + } +} diff --git a/app/code/Magento/Review/Test/Unit/Controller/Adminhtml/Product/PostTest.php b/app/code/Magento/Review/Test/Unit/Controller/Adminhtml/Product/PostTest.php index d20abf31a19c4ac8896c57b171e41a6abdcd9050..1c6cc30cafb1745809d223c91a52c9cf1b56e555 100644 --- a/app/code/Magento/Review/Test/Unit/Controller/Adminhtml/Product/PostTest.php +++ b/app/code/Magento/Review/Test/Unit/Controller/Adminhtml/Product/PostTest.php @@ -209,6 +209,6 @@ class PostTest extends \PHPUnit_Framework_TestCase ->method('addOptionVote') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->postController->execute()); + $this->assertSame($this->resultRedirectMock, $this->postController->executeInternal()); } } diff --git a/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php b/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php index 9cedb87e15afe212c3dd428b623a7d1c95a3f1c5..f1ccec681b25a8d73b527e510d5e75a0a284b2ee 100644 --- a/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php +++ b/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php @@ -315,6 +315,6 @@ class PostTest extends \PHPUnit_Framework_TestCase ->with(true) ->willReturn($redirectUrl); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Review/Test/Unit/Model/RatingTest.php b/app/code/Magento/Review/Test/Unit/Model/RatingTest.php new file mode 100644 index 0000000000000000000000000000000000000000..82db181bedfb56dccf9af12ad10e0ce979e2b7c2 --- /dev/null +++ b/app/code/Magento/Review/Test/Unit/Model/RatingTest.php @@ -0,0 +1,36 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Review\Test\Unit\Model; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Review\Model\Review; +use Magento\Review\Model\Rating; + +class RatingTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Review\Model\Rating + */ + private $rating; + + /** + * Init objects needed by tests + */ + protected function setUp() + { + $helper = new ObjectManager($this); + $this->rating = $helper->getObject(Rating::class); + } + + /** + * @covers \Magento\Review\Model\Rating::getIdentities() + * @return void + */ + public function testGetIdentities() + { + static::assertEquals([Review::CACHE_TAG], $this->rating->getIdentities()); + } +} diff --git a/app/code/Magento/Rss/App/Action/Plugin/BackendAuthentication.php b/app/code/Magento/Rss/App/Action/Plugin/BackendAuthentication.php index 5bdb72f7036ad35acdfc56a94ac5be3c5e9879e5..f3e450c8c722d5652ec3ea43bc5a9f7f28c981d3 100644 --- a/app/code/Magento/Rss/App/Action/Plugin/BackendAuthentication.php +++ b/app/code/Magento/Rss/App/Action/Plugin/BackendAuthentication.php @@ -95,7 +95,7 @@ class BackendAuthentication extends \Magento\Backend\App\Action\Plugin\Authentic * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function aroundDispatch(AbstractAction $subject, \Closure $proceed, RequestInterface $request) + public function aroundExecute(AbstractAction $subject, \Closure $proceed, RequestInterface $request) { $resource = isset($this->aclResources[$request->getControllerName()]) ? isset($this->aclResources[$request->getControllerName()][$request->getActionName()]) @@ -107,7 +107,7 @@ class BackendAuthentication extends \Magento\Backend\App\Action\Plugin\Authentic $resourceType = isset($this->aclResources[$type]) ? $this->aclResources[$type] : null; if (!$resource || !$resourceType) { - return parent::aroundDispatch($subject, $proceed, $request); + return parent::aroundExecute($subject, $proceed, $request); } $session = $this->_auth->getAuthStorage(); @@ -129,6 +129,6 @@ class BackendAuthentication extends \Magento\Backend\App\Action\Plugin\Authentic return $this->_response; } - return parent::aroundDispatch($subject, $proceed, $request); + return parent::aroundExecute($subject, $proceed, $request); } } diff --git a/app/code/Magento/Rss/Controller/Adminhtml/Feed/Index.php b/app/code/Magento/Rss/Controller/Adminhtml/Feed/Index.php index 61da0e27c2e12c99f5db440b287521c670b59fd1..96b989cdf78452f59b443fa5a33f398e38f6f325 100644 --- a/app/code/Magento/Rss/Controller/Adminhtml/Feed/Index.php +++ b/app/code/Magento/Rss/Controller/Adminhtml/Feed/Index.php @@ -20,7 +20,7 @@ class Index extends \Magento\Rss\Controller\Adminhtml\Feed * @return void * @throws NotFoundException */ - public function execute() + public function executeInternal() { if (!$this->scopeConfig->getValue('rss/config/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE)) { throw new NotFoundException(__('Page not found.')); diff --git a/app/code/Magento/Rss/Controller/Feed/Index.php b/app/code/Magento/Rss/Controller/Feed/Index.php index e3679a100212d62f1fc86674ee13e9e4c7851881..5f8e58afefd7e0b27588900b00ff954a0e665075 100644 --- a/app/code/Magento/Rss/Controller/Feed/Index.php +++ b/app/code/Magento/Rss/Controller/Feed/Index.php @@ -20,7 +20,7 @@ class Index extends \Magento\Rss\Controller\Feed * @return void * @throws NotFoundException */ - public function execute() + public function executeInternal() { if (!$this->scopeConfig->getValue('rss/config/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE)) { throw new NotFoundException(__('Page not found.')); diff --git a/app/code/Magento/Rss/Controller/Index/Index.php b/app/code/Magento/Rss/Controller/Index/Index.php index 63575ad8e44ec3864d50c97ace7421dd2d984754..0a2096c35d89e2dfbcb38d569945b656bbe5557f 100644 --- a/app/code/Magento/Rss/Controller/Index/Index.php +++ b/app/code/Magento/Rss/Controller/Index/Index.php @@ -16,7 +16,7 @@ class Index extends \Magento\Rss\Controller\Index * @return void * @throws NotFoundException */ - public function execute() + public function executeInternal() { if ($this->_scopeConfig->getValue('rss/config/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE)) { $this->_view->loadLayout(); diff --git a/app/code/Magento/Rss/Model/System/Config/Backend/Links.php b/app/code/Magento/Rss/Model/System/Config/Backend/Links.php index 64f383245e31226cac93726c22a84bd5d90d8a3a..665a7e68e1a13c7911f0377b58f65e9d6c9620c0 100644 --- a/app/code/Magento/Rss/Model/System/Config/Backend/Links.php +++ b/app/code/Magento/Rss/Model/System/Config/Backend/Links.php @@ -11,42 +11,16 @@ namespace Magento\Rss\Model\System\Config\Backend; */ class Links extends \Magento\Framework\App\Config\Value { - /** - * @var \Magento\Framework\App\Cache\TypeListInterface - */ - protected $_cacheTypeList; - - /** - * @param \Magento\Framework\Model\Context $context - * @param \Magento\Framework\Registry $registry - * @param \Magento\Framework\App\Config\ScopeConfigInterface $config - * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource - * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection - * @param array $data - */ - public function __construct( - \Magento\Framework\Model\Context $context, - \Magento\Framework\Registry $registry, - \Magento\Framework\App\Config\ScopeConfigInterface $config, - \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, - \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, - \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] - ) { - $this->_cacheTypeList = $cacheTypeList; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); - } - /** * Invalidate cache type, when value was changed * - * @return void + * @return $this */ public function afterSave() { if ($this->isValueChanged()) { - $this->_cacheTypeList->invalidate(\Magento\Framework\View\Element\AbstractBlock::CACHE_GROUP); + $this->cacheTypeList->invalidate(\Magento\Framework\View\Element\AbstractBlock::CACHE_GROUP); } + return parent::afterSave(); } } diff --git a/app/code/Magento/Rss/Test/Unit/App/Action/Plugin/BackendAuthenticationTest.php b/app/code/Magento/Rss/Test/Unit/App/Action/Plugin/BackendAuthenticationTest.php index 79685fb88a379f911c2814d9a766306dee6cbb6c..240da650216ccc0c4e78b783308b50752e752c5e 100644 --- a/app/code/Magento/Rss/Test/Unit/App/Action/Plugin/BackendAuthenticationTest.php +++ b/app/code/Magento/Rss/Test/Unit/App/Action/Plugin/BackendAuthenticationTest.php @@ -7,7 +7,7 @@ namespace Magento\Rss\Test\Unit\App\Action\Plugin; class BackendAuthenticationTest extends \PHPUnit_Framework_TestCase { - public function testAroundDispatch() + public function testAroundExecute() { /** @var \Magento\Backend\App\AbstractAction|\PHPUnit_Framework_MockObject_MockObject $subject */ $subject = $this->getMock('Magento\Backend\App\AbstractAction', [], [], '', false); @@ -69,7 +69,7 @@ class BackendAuthenticationTest extends \PHPUnit_Framework_TestCase ); $this->assertSame( $response, - $plugin->aroundDispatch($subject, $proceed, $request) + $plugin->aroundExecute($subject, $proceed, $request) ); } } diff --git a/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php b/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php index 83126339130811da07cc0f7beea5f1fbc2adcb16..2d58e440902cdd1094b5207738fb806ff81059c0 100644 --- a/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php +++ b/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php @@ -93,7 +93,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->rssFactory->expects($this->once())->method('create')->will($this->returnValue($rssModel)); $this->rssManager->expects($this->once())->method('getProvider')->will($this->returnValue($dataProvider)); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithException() @@ -110,6 +110,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->rssManager->expects($this->once())->method('getProvider')->will($this->returnValue($dataProvider)); $this->setExpectedException('\Zend_Feed_Builder_Exception'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php b/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php index 5b209caa274490682c05e3a39dd1f15e901bc87f..638f2dc802dcfa202ec6b39a5410194043660b51 100644 --- a/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php +++ b/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php @@ -81,7 +81,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->rssFactory->expects($this->once())->method('create')->will($this->returnValue($rssModel)); $this->rssManager->expects($this->once())->method('getProvider')->will($this->returnValue($dataProvider)); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteWithException() @@ -98,6 +98,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->rssManager->expects($this->once())->method('getProvider')->will($this->returnValue($dataProvider)); $this->setExpectedException('\Zend_Feed_Builder_Exception'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php index c2184950d83e0ee967732fca8ded9c21e03655ac..784a78e5a4caeba2498b2451214d008e1acfd2ad 100644 --- a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php +++ b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php @@ -153,7 +153,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon */ protected function _addSpecialAttributes(array &$attributes) { - $attributes['attribute_set_id'] = __('Product Template'); + $attributes['attribute_set_id'] = __('Attribute Set'); $attributes['category_ids'] = __('Category'); } diff --git a/app/code/Magento/Sales/Api/CreditmemoCommentRepositoryInterface.php b/app/code/Magento/Sales/Api/CreditmemoCommentRepositoryInterface.php index d7c1f067cc046997e5fedc2901a803dee5757aa7..bc8cda48f2b216ecb5a5f00a40bd049eb8848a1e 100644 --- a/app/code/Magento/Sales/Api/CreditmemoCommentRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/CreditmemoCommentRepositoryInterface.php @@ -32,10 +32,10 @@ interface CreditmemoCommentRepositoryInterface * * Returns a credit memo comment search results interface. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\CreditmemoCommentSearchResultInterface Credit memo comment search results interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Deletes a specified credit memo comment. diff --git a/app/code/Magento/Sales/Api/CreditmemoItemRepositoryInterface.php b/app/code/Magento/Sales/Api/CreditmemoItemRepositoryInterface.php index b322cc7b68f48f26651dfd462ee085be56c5ac40..9921c53a8438537d65923d25cb153ecd11523b04 100644 --- a/app/code/Magento/Sales/Api/CreditmemoItemRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/CreditmemoItemRepositoryInterface.php @@ -27,10 +27,10 @@ interface CreditmemoItemRepositoryInterface /** * Lists credit memo items that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\CreditmemoItemSearchResultInterface Credit memo item search results interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Deletes a specified credit memo item. diff --git a/app/code/Magento/Sales/Api/CreditmemoManagementInterface.php b/app/code/Magento/Sales/Api/CreditmemoManagementInterface.php index 551f48488869ec27090402719588374cbb88cd0c..b2d7aab6eb09f3facf2f69e589cb9dfe3d7f721c 100644 --- a/app/code/Magento/Sales/Api/CreditmemoManagementInterface.php +++ b/app/code/Magento/Sales/Api/CreditmemoManagementInterface.php @@ -48,12 +48,10 @@ interface CreditmemoManagementInterface * * @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo * @param bool $offlineRequested - * @param bool $notifyCustomer * @return \Magento\Sales\Api\Data\CreditmemoInterface */ public function refund( \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo, - $offlineRequested = false, - $notifyCustomer = false + $offlineRequested = false ); } diff --git a/app/code/Magento/Sales/Api/CreditmemoRepositoryInterface.php b/app/code/Magento/Sales/Api/CreditmemoRepositoryInterface.php index 8bb487d732299972229da96cbee376258ab580ad..e1577630215c42a3010af96f96e2fba988cedc39 100644 --- a/app/code/Magento/Sales/Api/CreditmemoRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/CreditmemoRepositoryInterface.php @@ -18,10 +18,10 @@ interface CreditmemoRepositoryInterface /** * Lists credit memos that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\CreditmemoSearchResultInterface Credit memo search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified credit memo. diff --git a/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php b/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php index f256bb88af2ab2fd0f57dc8c7603c7eea67ebeda..d9d698b987b61f99ef8c0e1f10d429dc92e48300 100644 --- a/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/InvoiceCommentRepositoryInterface.php @@ -17,10 +17,10 @@ interface InvoiceCommentRepositoryInterface /** * Lists invoice comments that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\InvoiceCommentSearchResultInterface Invoice search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified invoice comment. diff --git a/app/code/Magento/Sales/Api/InvoiceItemRepositoryInterface.php b/app/code/Magento/Sales/Api/InvoiceItemRepositoryInterface.php index 90ae5cea092df03f80ce641764fe2141fb8211e8..510623d1932ba5258a4233efc2cd244e76150844 100644 --- a/app/code/Magento/Sales/Api/InvoiceItemRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/InvoiceItemRepositoryInterface.php @@ -16,10 +16,10 @@ interface InvoiceItemRepositoryInterface /** * Lists the invoice items that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria * @return \Magento\Sales\Api\Data\InvoiceItemSearchResultInterface */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified invoice item. diff --git a/app/code/Magento/Sales/Api/InvoiceRepositoryInterface.php b/app/code/Magento/Sales/Api/InvoiceRepositoryInterface.php index 0fa5f268be6429360a289232c6e49f0c56f9ae08..9b864ba2ea380b6c77d61fc311b245c370ab7df4 100644 --- a/app/code/Magento/Sales/Api/InvoiceRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/InvoiceRepositoryInterface.php @@ -16,10 +16,10 @@ interface InvoiceRepositoryInterface /** * Lists invoices that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\InvoiceSearchResultInterface Invoice search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Return Invoice object diff --git a/app/code/Magento/Sales/Api/OrderAddressRepositoryInterface.php b/app/code/Magento/Sales/Api/OrderAddressRepositoryInterface.php index 5c3db02774762f0296206d736bb917d1d8078d82..8071ec0c4894c2372adace78d317302fdba3cc31 100644 --- a/app/code/Magento/Sales/Api/OrderAddressRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/OrderAddressRepositoryInterface.php @@ -18,10 +18,10 @@ interface OrderAddressRepositoryInterface /** * Lists order addresses that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\OrderAddressSearchResultInterface Order address search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified order address. diff --git a/app/code/Magento/Sales/Api/OrderItemRepositoryInterface.php b/app/code/Magento/Sales/Api/OrderItemRepositoryInterface.php index e1832a09e5568c47194b0e79a32cc1a12b4746fc..6355db859bbcf2fd1ccd223375f5a31c41e888aa 100644 --- a/app/code/Magento/Sales/Api/OrderItemRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/OrderItemRepositoryInterface.php @@ -18,10 +18,10 @@ interface OrderItemRepositoryInterface /** * Lists order items that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\OrderItemSearchResultInterface Order item search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified order item. diff --git a/app/code/Magento/Sales/Api/OrderPaymentRepositoryInterface.php b/app/code/Magento/Sales/Api/OrderPaymentRepositoryInterface.php index e4ff2acf54ba627fcdedfa402021460c12e20020..005de16342db398b9e4e8afda49ff6f3ab21f7bd 100644 --- a/app/code/Magento/Sales/Api/OrderPaymentRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/OrderPaymentRepositoryInterface.php @@ -18,10 +18,10 @@ interface OrderPaymentRepositoryInterface /** * Lists order payments that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\OrderPaymentSearchResultInterface Order payment search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified order payment. diff --git a/app/code/Magento/Sales/Api/OrderRepositoryInterface.php b/app/code/Magento/Sales/Api/OrderRepositoryInterface.php index d8420ce0da7294626a3567db9f2001ae54bd89ba..50a683b43715356ac8371146f42bae2cadf04e5f 100644 --- a/app/code/Magento/Sales/Api/OrderRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/OrderRepositoryInterface.php @@ -18,10 +18,10 @@ interface OrderRepositoryInterface /** * Lists orders that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\OrderSearchResultInterface Order search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified order. diff --git a/app/code/Magento/Sales/Api/OrderStatusHistoryRepositoryInterface.php b/app/code/Magento/Sales/Api/OrderStatusHistoryRepositoryInterface.php index b99bf0dc2c729d7f97aef8560a7e0511769a4fb7..743f9aaa734e94ddc8a867071a40423685886294 100644 --- a/app/code/Magento/Sales/Api/OrderStatusHistoryRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/OrderStatusHistoryRepositoryInterface.php @@ -21,10 +21,10 @@ interface OrderStatusHistoryRepositoryInterface /** * Lists order status history comments that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\OrderStatusHistorySearchResultInterface Order status history search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified order status comment. diff --git a/app/code/Magento/Sales/Api/ShipmentCommentRepositoryInterface.php b/app/code/Magento/Sales/Api/ShipmentCommentRepositoryInterface.php index e6605c9c5dd24267466d846eb82fd2a3e342d91a..9ca3bb336f268c515e91d4365fc2b9c01056bd14 100644 --- a/app/code/Magento/Sales/Api/ShipmentCommentRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/ShipmentCommentRepositoryInterface.php @@ -17,10 +17,10 @@ interface ShipmentCommentRepositoryInterface /** * Lists shipment comments that match specific search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\ShipmentCommentSearchResultInterface Shipment comment search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified shipment comment. diff --git a/app/code/Magento/Sales/Api/ShipmentItemRepositoryInterface.php b/app/code/Magento/Sales/Api/ShipmentItemRepositoryInterface.php index 0db3adabf885cdd1fcf0c4059d19958151554530..5d2d3946a91971c23256a720b0258213ae1bcb58 100644 --- a/app/code/Magento/Sales/Api/ShipmentItemRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/ShipmentItemRepositoryInterface.php @@ -17,10 +17,10 @@ interface ShipmentItemRepositoryInterface /** * Lists shipment items that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\ShipmentItemSearchResultInterface Shipment item search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified shipment item. diff --git a/app/code/Magento/Sales/Api/ShipmentRepositoryInterface.php b/app/code/Magento/Sales/Api/ShipmentRepositoryInterface.php index 1cfa85d87e66facb2affe05c8541a8a96982c68f..858347a6f166d47255572bc92064924c3a42efc7 100644 --- a/app/code/Magento/Sales/Api/ShipmentRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/ShipmentRepositoryInterface.php @@ -17,10 +17,10 @@ interface ShipmentRepositoryInterface /** * Lists shipments that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\ShipmentSearchResultInterface Shipment search results interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified shipment. diff --git a/app/code/Magento/Sales/Api/ShipmentTrackRepositoryInterface.php b/app/code/Magento/Sales/Api/ShipmentTrackRepositoryInterface.php index 5d7817b0c828d997707e9b826c2a7890aa305bc2..ada64b54d862fbabdb3a514e03a73b29172be1e9 100644 --- a/app/code/Magento/Sales/Api/ShipmentTrackRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/ShipmentTrackRepositoryInterface.php @@ -17,10 +17,10 @@ interface ShipmentTrackRepositoryInterface /** * Lists shipment tracks that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\ShipmentTrackSearchResultInterface Shipment track search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified shipment track. diff --git a/app/code/Magento/Sales/Api/TransactionRepositoryInterface.php b/app/code/Magento/Sales/Api/TransactionRepositoryInterface.php index 7a256e7deaf7ccc55bfd07ec8baf8625d17529e1..be5315f1329cc64f18ca3a2e65459e33d62bc6e5 100644 --- a/app/code/Magento/Sales/Api/TransactionRepositoryInterface.php +++ b/app/code/Magento/Sales/Api/TransactionRepositoryInterface.php @@ -16,10 +16,10 @@ interface TransactionRepositoryInterface /** * Lists transactions that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\TransactionSearchResultInterface Transaction search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria); + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria); /** * Loads a specified transaction. diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php index 1ee0386f871101b753d45cfd6814540cae15016c..4af19b69b136158103c391443fce0e8cc37163c0 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php @@ -160,8 +160,8 @@ class Address extends \Magento\Sales\Block\Adminhtml\Order\Create\Form\AbstractF ->setConditionType('eq') ->create(); $this->searchCriteriaBuilder->addFilters([$filter]); - $criteria = $this->searchCriteriaBuilder->create(); - $result = $this->addressService->getList($criteria); + $searchCriteria = $this->searchCriteriaBuilder->create(); + $result = $this->addressService->getList($searchCriteria); return $result->getItems(); } return []; diff --git a/app/code/Magento/Sales/Controller/AbstractController/PrintAction.php b/app/code/Magento/Sales/Controller/AbstractController/PrintAction.php index b011b8f60e5921abde3a497c0328633763855162..433e8d38c4d61671a6736ec26a1c4d68e4aca973 100644 --- a/app/code/Magento/Sales/Controller/AbstractController/PrintAction.php +++ b/app/code/Magento/Sales/Controller/AbstractController/PrintAction.php @@ -41,7 +41,7 @@ abstract class PrintAction extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $result = $this->orderLoader->load($this->_request); if ($result instanceof \Magento\Framework\Controller\ResultInterface) { diff --git a/app/code/Magento/Sales/Controller/AbstractController/PrintCreditmemo.php b/app/code/Magento/Sales/Controller/AbstractController/PrintCreditmemo.php index 24f13d49d08c736d6cd160f422526684a4595a23..bffa469a2ee07a4b8d6b9e76ff4d8ddc25a3bb72 100644 --- a/app/code/Magento/Sales/Controller/AbstractController/PrintCreditmemo.php +++ b/app/code/Magento/Sales/Controller/AbstractController/PrintCreditmemo.php @@ -58,7 +58,7 @@ abstract class PrintCreditmemo extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { $creditmemoId = (int)$this->getRequest()->getParam('creditmemo_id'); if ($creditmemoId) { diff --git a/app/code/Magento/Sales/Controller/AbstractController/PrintInvoice.php b/app/code/Magento/Sales/Controller/AbstractController/PrintInvoice.php index 04088a9c79c2a8ce1c3902c57ab5f380354ce21a..fffcb6ca4dfd87a967f2c00c7a019e9dda1371b6 100644 --- a/app/code/Magento/Sales/Controller/AbstractController/PrintInvoice.php +++ b/app/code/Magento/Sales/Controller/AbstractController/PrintInvoice.php @@ -49,7 +49,7 @@ abstract class PrintInvoice extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { $invoiceId = (int)$this->getRequest()->getParam('invoice_id'); if ($invoiceId) { diff --git a/app/code/Magento/Sales/Controller/AbstractController/PrintShipment.php b/app/code/Magento/Sales/Controller/AbstractController/PrintShipment.php index 74fbb3439445d4185be0be3ec4aadb63757197cc..ab17469ccf16d60189a54ef1adc534aa7f4c1e47 100644 --- a/app/code/Magento/Sales/Controller/AbstractController/PrintShipment.php +++ b/app/code/Magento/Sales/Controller/AbstractController/PrintShipment.php @@ -49,7 +49,7 @@ abstract class PrintShipment extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { $shipmentId = (int)$this->getRequest()->getParam('shipment_id'); if ($shipmentId) { diff --git a/app/code/Magento/Sales/Controller/AbstractController/Reorder.php b/app/code/Magento/Sales/Controller/AbstractController/Reorder.php index bf86825d8b4739e20c19dd481efd5e03ec0e3ed8..f589dbabab90cd16d2540562133944b8cc98b74a 100644 --- a/app/code/Magento/Sales/Controller/AbstractController/Reorder.php +++ b/app/code/Magento/Sales/Controller/AbstractController/Reorder.php @@ -41,7 +41,7 @@ abstract class Reorder extends Action\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $result = $this->orderLoader->load($this->_request); if ($result instanceof \Magento\Framework\Controller\ResultInterface) { diff --git a/app/code/Magento/Sales/Controller/AbstractController/View.php b/app/code/Magento/Sales/Controller/AbstractController/View.php index 987fa30704e598629f767023e37ef5ac4340dbfa..0bef4ed08e0681872f1e67a94099a10df0980160 100644 --- a/app/code/Magento/Sales/Controller/AbstractController/View.php +++ b/app/code/Magento/Sales/Controller/AbstractController/View.php @@ -41,7 +41,7 @@ abstract class View extends Action\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $result = $this->orderLoader->load($this->_request); if ($result instanceof \Magento\Framework\Controller\ResultInterface) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php index 68fc9d62e85ac52be9ee4423627e8c778cee74a9..6a6babfc1b1538e52ca4b31a177629a595a20db9 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php @@ -25,7 +25,7 @@ class Email extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $creditmemoId = $this->getRequest()->getParam('creditmemo_id'); if (!$creditmemoId) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Grid.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Grid.php index 3022cf995e632e91dc32c5f89aa07ea86b893490..209096f62fee28d9551f41f8826684b42a95203a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Grid.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Grid.php @@ -37,7 +37,7 @@ class Grid extends \Magento\Backend\App\Action * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $resultLayout = $this->resultLayoutFactory->create(); return $resultLayout; diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Index.php index 4fbd4c7ff5bd52e99bf0cce1e3f84ef03bd5d4fd..5569d131abd88962a742eb6bfa82e048ea56442c 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Index.php @@ -51,7 +51,7 @@ class Index extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->_initAction(); $resultPage->getConfig()->getTitle()->prepend(__('Credit Memos')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/PrintAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/PrintAction.php index 83befcc3b58f9bf8207663ed516de2128e165ab1..39137a698fe91878a87a57fc6a1fc9fbd6ba4ba2 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/PrintAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/PrintAction.php @@ -55,7 +55,7 @@ class PrintAction extends \Magento\Backend\App\Action /** * @return ResponseInterface|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @see \Magento\Sales\Controller\Adminhtml\Order\Invoice */ $creditmemoId = $this->getRequest()->getParam('creditmemo_id'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/View.php index 06e42091731751c2306be89d9742abcf0328a624..c70eb6e4cb482a7fcf74d635bc8856efd35ce9d6 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/View.php @@ -37,7 +37,7 @@ class View extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $resultForward = $this->resultForwardFactory->create(); if ($this->getRequest()->getParam('creditmemo_id')) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/Index.php index baa603c9ef5c15f3962207fd842ab9293c4cefff..c7ea617b5354af5172e3b6121bceda3b41ca5437 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/Index.php @@ -12,8 +12,8 @@ class Index extends \Magento\Sales\Controller\Adminhtml\Creditmemo\AbstractCredi * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { - return parent::execute(); + return parent::executeInternal(); } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php index c807026addf05d8fcb8ca31efd67f9559047f90e..8c32e32f47897907649733aaefa3905a6bde5906 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php @@ -45,7 +45,7 @@ abstract class Email extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Forward|\Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $invoiceId = $this->getRequest()->getParam('invoice_id'); if (!$invoiceId) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Grid.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Grid.php index d448d97138f60afe0edd03c448c4aaafd93d5598..a01e0ba26f620f89a0f5102ee84e2a16220d49f0 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Grid.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Grid.php @@ -38,7 +38,7 @@ abstract class Grid extends \Magento\Backend\App\Action * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { return $this->resultLayoutFactory->create(); } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Index.php index e88f6089c48b4cb211a6c6d98d3491265ad62c0b..603ec3258ba8cc8ce571cadd0e8065e6654749e2 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Index.php @@ -53,7 +53,7 @@ abstract class Index extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->_initAction(); $resultPage->getConfig()->getTitle()->prepend(__('Invoices')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/PrintAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/PrintAction.php index ac5c97372b7f07adbaa5eb7f228da047f240580e..b72dc44f2ca3a43e54d0193963ca72d5dfef0b17 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/PrintAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/PrintAction.php @@ -47,7 +47,7 @@ abstract class PrintAction extends \Magento\Backend\App\Action /** * @return ResponseInterface|void */ - public function execute() + public function executeInternal() { $invoiceId = $this->getRequest()->getParam('invoice_id'); if ($invoiceId) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/View.php index e6e49dd0ca65bd1bd8a4c16f7598eb29db7c5ad2..98fe68a4def0ebe9071b379cc750da440e3f8413 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/View.php @@ -49,7 +49,7 @@ abstract class View extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $resultForward = $this->resultForwardFactory->create(); if ($this->getRequest()->getParam('invoice_id')) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AbstractMassAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AbstractMassAction.php index badfbc2ad438df50d0870a131da62730a7c6159a..225ab0ddd0111c5c1ac7a11f49dcf022602c3902 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AbstractMassAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AbstractMassAction.php @@ -48,7 +48,7 @@ abstract class AbstractMassAction extends \Magento\Backend\App\Action * @return \Magento\Backend\Model\View\Result\Redirect * @throws \Magento\Framework\Exception\LocalizedException|\Exception */ - public function execute() + public function executeInternal() { try { $collection = $this->filter->getCollection($this->collectionFactory->create()); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php index 29729f850bb64f28e2975694d24893c6eb428f66..f83fb55e218098e0307a5bfb3d8a8d16253bf4cf 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php @@ -16,7 +16,7 @@ class AddComment extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $order = $this->_initOrder(); if ($order) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php index 18fdf29cf80249ca881eee3e90267467492e7627..07a49e22fab858cfcbad3cf62d383c02c49a1567 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php @@ -13,7 +13,7 @@ class Address extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $addressId = $this->getRequest()->getParam('address_id'); $address = $this->_objectManager->create('Magento\Sales\Model\Order\Address')->load($addressId); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php index e3d15fd93cdd6765c1c3aa3739603db07ac23f95..43962356bab67cf69f153f1f71ac0a38a0458164 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php @@ -13,16 +13,23 @@ class AddressSave extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $addressId = $this->getRequest()->getParam('address_id'); - $address = $this->_objectManager->create('Magento\Sales\Model\Order\Address')->load($addressId); + /** @var $address \Magento\Sales\Api\Data\OrderAddressInterface|\Magento\Sales\Model\Order\Address */ + $address = $this->_objectManager->create('Magento\Sales\Api\Data\OrderAddressInterface')->load($addressId); $data = $this->getRequest()->getPostValue(); $resultRedirect = $this->resultRedirectFactory->create(); if ($data && $address->getId()) { $address->addData($data); try { $address->save(); + $this->_eventManager->dispatch( + 'admin_sales_order_address_update', + [ + 'order_id' => $address->getParentId() + ] + ); $this->messageManager->addSuccess(__('You updated the order address.')); return $resultRedirect->setPath('sales/*/view', ['order_id' => $address->getParentId()]); } catch (\Magento\Framework\Exception\LocalizedException $e) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php index 959917738dbc0f6f9a5966a4dd78b438aade353d..c4740f7825af47d418b470ecd7909222b09a8b9a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php @@ -13,7 +13,7 @@ class Cancel extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); if (!$this->isValidPostRequest()) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/CommentsHistory.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/CommentsHistory.php index 54774ec719e7d3c26afe87468b451d41dfe0fd8a..fd6239b48480f9f4e9c921e5abe713cb8db67a28 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/CommentsHistory.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/CommentsHistory.php @@ -74,7 +74,7 @@ class CommentsHistory extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $this->_initOrder(); $layout = $this->layoutFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/AddConfigured.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/AddConfigured.php index b991a11b2878ccb38fa66ad0a1a3b737ef50d123..cbc62796bcd09e949162c2da63e2cd7036988059 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/AddConfigured.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/AddConfigured.php @@ -12,7 +12,7 @@ class AddConfigured extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $errorMessage = null; try { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Cancel.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Cancel.php index f778a07a85a4fe81b8cb187a432f98e55af00a42..7cfd40bda0c1e71acd264b280d1f75733a890cbc 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Cancel.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Cancel.php @@ -12,7 +12,7 @@ class Cancel extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureProductToAdd.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureProductToAdd.php index d8c70e6d63b338c0fb95451bd9cd00d91ea7ca32..07bbc3e479fa69a9ccb638d6b530e4be3fc6362b 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureProductToAdd.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureProductToAdd.php @@ -12,7 +12,7 @@ class ConfigureProductToAdd extends \Magento\Sales\Controller\Adminhtml\Order\Cr * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { // Prepare data $productId = (int)$this->getRequest()->getParam('id'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureQuoteItems.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureQuoteItems.php index 080d5103c08620cf554ff4af0aae49bcfef0ef7d..10c3432f5c8b2a805e7cad9e96af54306f3bf398 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureQuoteItems.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ConfigureQuoteItems.php @@ -12,7 +12,7 @@ class ConfigureQuoteItems extends \Magento\Sales\Controller\Adminhtml\Order\Crea * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { // Prepare data $configureResult = new \Magento\Framework\DataObject(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Index.php index 055b3fe11f81178c12070f3be65560ea38b9c454..2d159a99ee4253e725d383b6da56bb6356540d73 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Index.php @@ -12,7 +12,7 @@ class Index extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return void */ - public function execute() + public function executeInternal() { $this->_initSession(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/LoadBlock.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/LoadBlock.php index ba4b0e833e2893fafea898a6392b7c0c2c3eff45..e5b063280bbe7e82cac38fe6e980a664ab0f10e7 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/LoadBlock.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/LoadBlock.php @@ -48,7 +48,7 @@ class LoadBlock extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return \Magento\Backend\Model\View\Result\Redirect|\Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $request = $this->getRequest(); try { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ProcessData.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ProcessData.php index 7d550a7d357308ec7d011306252d3ee898ca2cd0..cc2d978556caf099834df185d3277a476b1d9b67 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ProcessData.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ProcessData.php @@ -12,7 +12,7 @@ class ProcessData extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->_initSession(); $this->_processData(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Reorder.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Reorder.php index b64cb14c95c39d9a8e250c836f65e8939ebd87ee..8c91da215ca16012b11390f06c8c5c902e56d099 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Reorder.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Reorder.php @@ -10,7 +10,7 @@ class Reorder extends \Magento\Sales\Controller\Adminhtml\Order\Create /** * @return \Magento\Backend\Model\View\Result\Forward|\Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $this->_getSession()->clearStorage(); $orderId = $this->getRequest()->getParam('order_id'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Save.php index 3f48e6cf0679df10198993c48f684047cbe9f04f..087e6311cb69d5b4e67e8f42ea2e61c2a016f5d9 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Save.php @@ -16,7 +16,7 @@ class Save extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ShowUpdateResult.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ShowUpdateResult.php index a3546de1fa6a7f37cd8e53e223f2a7963460c365..9cd5b4d52454713631e8a4accd92ee4997ce4b2a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ShowUpdateResult.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/ShowUpdateResult.php @@ -49,7 +49,7 @@ class ShowUpdateResult extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */ $resultRaw = $this->resultRawFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Start.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Start.php index d9fd5c50f5badcc4598003c0a56ce5d0e3f1114c..acc80e97426853b3be94ee4ef6bf5ac49fc908ed 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Start.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create/Start.php @@ -14,7 +14,7 @@ class Start extends \Magento\Sales\Controller\Adminhtml\Order\Create * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $this->_getSession()->clearStorage(); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php index a3cf6e6a308daa223a30d5eebc42634866858835..d404c6a16aa4e3f9fd63b650c0321cb9eb7f9bea 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php @@ -72,7 +72,7 @@ class AddComment extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\Result\Raw|\Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { try { $this->getRequest()->setParam('creditmemo_id', $this->getRequest()->getParam('id')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Cancel.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Cancel.php index ce4652929c7badc5af4c674e901f8be66d6767db..935eca652b36558d3244930bc6dabd7ada98ebaa 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Cancel.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Cancel.php @@ -40,7 +40,7 @@ class Cancel extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Redirect|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $creditmemoId = $this->getRequest()->getParam('creditmemo_id'); if ($creditmemoId) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/NewAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/NewAction.php index a9760a20fda4c2542acc8646336ae4d3df205ec8..e1c7b8d9cc2caf5fb6ac233aa4cf20f0394edcb2 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/NewAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/NewAction.php @@ -55,7 +55,7 @@ class NewAction extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->creditmemoLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->creditmemoLoader->setCreditmemoId($this->getRequest()->getParam('creditmemo_id')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/PrintAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/PrintAction.php index b5bb3333ac32e0ce6685090269e6ff00eaca3839..a848506b90030380a68a08676321d00122828dc7 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/PrintAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/PrintAction.php @@ -49,13 +49,13 @@ class PrintAction extends \Magento\Sales\Controller\Adminhtml\Creditmemo\Abstrac * * @return ResponseInterface|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->creditmemoLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->creditmemoLoader->setCreditmemoId($this->getRequest()->getParam('creditmemo_id')); $this->creditmemoLoader->setCreditmemo($this->getRequest()->getParam('creditmemo')); $this->creditmemoLoader->setInvoiceId($this->getRequest()->getParam('invoice_id')); $this->creditmemoLoader->load(); - return parent::execute(); + return parent::executeInternal(); } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php index 24d74e2177f1ceea61ee1aee9f2dcb8ade79fc2e..c66532f3aa5d44cc4e4f11d4094de5a2a82c7329 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php @@ -61,7 +61,7 @@ class Save extends \Magento\Backend\App\Action * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); $data = $this->getRequest()->getPost('creditmemo'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Start.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Start.php index 4305bef4930e7e12b6a5f06e4a0b73a3b9948b32..a60433a2e0348d5f78965be8762c41c669e0ab5d 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Start.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Start.php @@ -20,7 +20,7 @@ class Start extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** * Clear old values for creditmemo qty's diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php index 38068b10918bbcaf2fcf5fbeb1d9e808b059d7e8..d1f400c84fba5a8485c10aabc7c857e477b78f4d 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php @@ -63,7 +63,7 @@ class UpdateQty extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\Result\Json|\Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { try { $this->creditmemoLoader->setOrderId($this->getRequest()->getParam('order_id')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/View.php index 486b041554a3b1ff315be4e2b13cabdca3972b15..fe8808c559f8bae16c7f05b2e403bcd1742c63d9 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/View.php @@ -55,7 +55,7 @@ class View extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->creditmemoLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->creditmemoLoader->setCreditmemoId($this->getRequest()->getParam('creditmemo_id')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Void.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Void.php index 23bd5f1ccdb82d889f8e800a620f91a43318300d..fcc978d5ddd06fc3a21e9a7c59eaec2739af2c7a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Void.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Void.php @@ -47,7 +47,7 @@ class Void extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Redirect|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $this->creditmemoLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->creditmemoLoader->setCreditmemoId($this->getRequest()->getParam('creditmemo_id')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php index cf69855c1489cf99d438b9892f7b0b38da97870c..5918bdb0326b94b22357a02afa89e3551b245ae4 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php @@ -14,14 +14,14 @@ use \Magento\Sales\Model\Order\CreditmemoFactory; * Class CreditmemoLoader * * @package Magento\Sales\Controller\Adminhtml\Order - * @method CreditmemoLoader setCreditmemoId - * @method CreditmemoLoader setCreditmemo - * @method CreditmemoLoader setInvoiceId - * @method CreditmemoLoader setOrderId - * @method int getCreditmemoId - * @method string getCreditmemo - * @method int getInvoiceId - * @method int getOrderId + * @method CreditmemoLoader setCreditmemoId($id) + * @method CreditmemoLoader setCreditmemo($creditMemo) + * @method CreditmemoLoader setInvoiceId($id) + * @method CreditmemoLoader setOrderId($id) + * @method int getCreditmemoId() + * @method string getCreditmemo() + * @method int getInvoiceId() + * @method int getOrderId() */ class CreditmemoLoader extends DataObject { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php index 46571b222f35c858a46f05b4f39f9abca3524cab..9fb23be0820b457ad3d24f660672f1de69a0a496 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php @@ -12,7 +12,7 @@ class Creditmemos extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->_initOrder(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Index.php index a40e61cfa89f3bf026400987cc2a84c58e8eda2d..f2384d108842e043d452f0ef3e092d6bd2849755 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Index.php @@ -22,7 +22,7 @@ class Index extends \Magento\Sales\Controller\Adminhtml\Order\Create\Index * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->_initSession(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Start.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Start.php index 22bcb5a621277be0edb3be249526fde1816d438e..c216968a893ead6efdd41dc85e3426c5ac06a9d2 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Start.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Edit/Start.php @@ -22,7 +22,7 @@ class Start extends \Magento\Sales\Controller\Adminhtml\Order\Create\Start * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $this->_getSession()->clearStorage(); $orderId = $this->getRequest()->getParam('order_id'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php index ae1763485bdbc8ca2bea50874bcf0778cc08d6b9..95e845bce78c7e667f078be5ecaa546d0c869530 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php @@ -12,7 +12,7 @@ class Email extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $order = $this->_initOrder(); if ($order) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Grid.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Grid.php index d16a0ea8cd1d8c2248d5ba0e5cb0642d206f216c..c2017647e88ed5fb4832ac1334d847098c77b5d2 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Grid.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Grid.php @@ -12,7 +12,7 @@ class Grid extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $resultLayout = $this->resultLayoutFactory->create(); return $resultLayout; diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php index 881ba0c98c9d4612e3b22e384ebc615bb2e876ee..fd5f07df5e98380475269b139849131eb7023d7e 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php @@ -12,7 +12,7 @@ class Hold extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); if (!$this->isValidPostRequest()) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Index.php index 9fc67fd2754f5e4e392d251e4a3163461245a9b9..3aac062e01b111bbdf4c35dad5365a6b9db3049a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Index.php @@ -12,7 +12,7 @@ class Index extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->_initAction(); $resultPage->getConfig()->getTitle()->prepend(__('Orders')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php index 2be526b212971230a0754cb3008333f23699c2ed..f4a48a1456895c8999a1ae867ed32d87efbd885c 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php @@ -68,7 +68,7 @@ class AddComment extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInv * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { try { $this->getRequest()->setParam('invoice_id', $this->getRequest()->getParam('id')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Cancel.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Cancel.php index a717843c7e99c930a1de1fe22b8400128e5af439..d79599efb94cb2002091f906612d5f1e03a6d357 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Cancel.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Cancel.php @@ -13,7 +13,7 @@ class Cancel extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvoice * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $invoice = $this->getInvoice(); if (!$invoice) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Capture.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Capture.php index 50ab1d8a9f2bf479f3b98d4d5797b367d7e2bb00..3f8b12d19fcf652ccffc2deacafcdcb261a23662 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Capture.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Capture.php @@ -13,7 +13,7 @@ class Capture extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvoic * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $invoice = $this->getInvoice(); if (!$invoice) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php index 306518b16edcb6301cfb04d26a1dcba2d1e14184..4c52db5ff57509134db82ce74fad7ef42f9f5c27 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php @@ -73,7 +73,7 @@ class NewAction extends \Magento\Backend\App\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $orderId = $this->getRequest()->getParam('order_id'); $invoiceData = $this->getRequest()->getParam('invoice', []); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php index 1ffa64f0100cc98f478328b8fdec042abc7df507..5a822770fe5275d6c4e3a16929726547c13bae56 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php @@ -110,7 +110,7 @@ class Save extends \Magento\Backend\App\Action * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Start.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Start.php index 8db329dad0876ee1cb73483dcd62ba8131b0c5bc..594a437c653bfc928392b22a7590536932e1fe1b 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Start.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Start.php @@ -13,7 +13,7 @@ class Start extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvoice\ * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** * Clear old values for invoice qty's diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php index 3b30dbde11f07a6029f79b7703a1d1239923e7e6..cfee5ad1ff2d006fda9e6e001c22323ae8b4a23a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php @@ -71,7 +71,7 @@ class UpdateQty extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvo * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { try { $orderId = $this->getRequest()->getParam('order_id'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/View.php index b6f4ae27b44e65de744cc67949ad28d185f7d8f1..9e01376261e5ad93bbd42ed8e0207099eea835b9 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/View.php @@ -39,7 +39,7 @@ class View extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvoice\V * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $invoice = $this->getInvoice(); if (!$invoice) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Void.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Void.php index 841d517037b43ef46b27c7b0892bcf81d0005f06..005c3cdbc47d058ba4611150d12f494c74b79399 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Void.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Void.php @@ -13,7 +13,7 @@ class Void extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvoice\V * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $invoice = $this->getInvoice(); if (!$invoice) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoices.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoices.php index 08354deb668398804af8bdf958636414b4ef8588..cfb8841f41cf02cdc6b4abbc4cd1b54d8678de75 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoices.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoices.php @@ -12,7 +12,7 @@ class Invoices extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->_initOrder(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php index 8a0d64c9bcb6e88bb568341d398665c8a7d94f71..a2d72953eb41b0151fd16904f24c2ff4ff8657b8 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php @@ -16,7 +16,7 @@ class ReviewPayment extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); try { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipments.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipments.php index 98683c76017909904fe4b2693a3dff95f12f42da..84efbffee9d236254472564baa38354c4d8fa84f 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipments.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipments.php @@ -12,7 +12,7 @@ class Shipments extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->_initOrder(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Assign.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Assign.php index 04e05fc348e1f7aae99a6fca4ce7f97c789e8e57..7a2abd381e1a9c4cfeb97487d08e63471a1a52bd 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Assign.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Assign.php @@ -36,7 +36,7 @@ class Assign extends \Magento\Sales\Controller\Adminhtml\Order\Status * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php index a77c6dc3cc642e6429785b8303ae4da801015f7b..a103fbf41755713b8c20950618f143bc3547524c 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php @@ -13,7 +13,7 @@ class AssignPost extends \Magento\Sales\Controller\Adminhtml\Order\Status * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Edit.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Edit.php index 26ee0651e3657e65ba93868d13c2ae8e5751793c..0f5f2e720b8ce8de233de67c0a75bfb3ded1d710 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Edit.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Edit.php @@ -36,7 +36,7 @@ class Edit extends \Magento\Sales\Controller\Adminhtml\Order\Status * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $status = $this->_initStatus(); if ($status) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Index.php index 3bafba1937248c7220f0d0428265c2ef95a4ca49..65f3dd3f164dc8dfff07d0309d2d8675da3afeea 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Index.php @@ -36,7 +36,7 @@ class Index extends \Magento\Sales\Controller\Adminhtml\Order\Status * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/NewAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/NewAction.php index f9668e8325859e2836be2e4f908123fca5bdbcea..57e8e0b852ea78c0bc4aa2c5c56006b4c415d8af 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/NewAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/NewAction.php @@ -36,7 +36,7 @@ class NewAction extends \Magento\Sales\Controller\Adminhtml\Order\Status * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $data = $this->_getSession()->getFormData(true); if ($data) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php index efd73d7a2b34ee9a655b618aebef0e5928b65e88..79efd7eede660089d7c0f6499ffe66dac4ec3194 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php @@ -13,7 +13,7 @@ class Save extends \Magento\Sales\Controller\Adminhtml\Order\Status * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); $isNew = $this->getRequest()->getParam('is_new'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php index e44b4f5e48eef040ded0a53c5a8ca9cfb6714d48..e84ac0bc45b240ad436fdbc0c2bbd35a4b66b82a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php @@ -11,7 +11,7 @@ class Unassign extends \Magento\Sales\Controller\Adminhtml\Order\Status /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $state = $this->getRequest()->getParam('state'); $status = $this->_initStatus(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Transactions.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Transactions.php index f41824df84b5f75ebcfd573145cd5bd81973ec7c..9801ada2f82f3bd621008c5c798c8a6e333e04eb 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Transactions.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Transactions.php @@ -14,7 +14,7 @@ class Transactions extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Framework\View\Result\Layout */ - public function execute() + public function executeInternal() { $this->_initOrder(); $resultLayout = $this->resultLayoutFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php index 6cedb1e60b95f5ab9f3ab32ce874b1bf75979a43..83fc8808df3cc493ae5d9bc07bf32c87d201e6ab 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php @@ -12,7 +12,7 @@ class Unhold extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $resultRedirect = $this->resultRedirectFactory->create(); if (!$this->isValidPostRequest()) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php index 831538fa21d11b0d29bd3d2b0c290d8d2cd7bdf7..011056eac1403580e04556d958a05644cd654eba 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php @@ -14,7 +14,7 @@ class View extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $order = $this->_initOrder(); $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php index 554935ed551ad55f72de3086fc220ab0a28f4a31..13ced62a888497bf60cc9a57f2ee614c862b7a78 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php @@ -11,7 +11,7 @@ class Save extends \Magento\Sales\Controller\Adminhtml\Order\View\Giftmessage /** * @return void */ - public function execute() + public function executeInternal() { try { $this->_getGiftmessageSaveModel()->setGiftmessages( diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php index 03b870d71cab1fe66b651da96c3b185f52113918..3a10f5684c6aa06d30b448d2dd97a14d4393a385 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php @@ -12,7 +12,7 @@ class VoidPayment extends \Magento\Sales\Controller\Adminhtml\Order * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $order = $this->_initOrder(); $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/Index.php index 1a800be5b93a3d41a9487ee7ffef0a7556820967..c393c2b1a1c911bb061d6577e1ca67bed3e46c41 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/Index.php @@ -41,7 +41,7 @@ abstract class Index extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/PrintAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/PrintAction.php index 633cf071b933bcd97bcbbc3fd3760b720056c7c5..6a72dfe0ebcaa0bd94bc9d01022193c6a6f63aa7 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/PrintAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/PrintAction.php @@ -50,7 +50,7 @@ abstract class PrintAction extends \Magento\Backend\App\Action /** * @return ResponseInterface|\Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { $shipmentId = $this->getRequest()->getParam('shipment_id'); if ($shipmentId) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/View.php index 150f98e597b106cb50e7d0dccd1c30574d1ce6dd..926a46c14c4f12c0237ca240b2906d4b1b8ed0e2 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment/View.php @@ -41,7 +41,7 @@ abstract class View extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php index df3a48ca4a76d7a746ff4e107908d3055ec1f2c8..a2ac001589d6396847b56706c2fa375035e00913 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php @@ -17,7 +17,7 @@ class Fetch extends \Magento\Sales\Controller\Adminhtml\Transactions * * @return Redirect */ - public function execute() + public function executeInternal() { $txn = $this->_initTransaction(); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Grid.php b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Grid.php index 0b4579d1810b9ac30b24b5d5074c2523423eec72..d65bba3d004bfe3c98f99f0a8227655a7bc226f7 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Grid.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Grid.php @@ -16,7 +16,7 @@ class Grid extends \Magento\Sales\Controller\Adminhtml\Transactions * * @return Layout */ - public function execute() + public function executeInternal() { return $this->resultLayoutFactory->create(); } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Index.php b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Index.php index 6125b244d2991f815e7841a4fdbd66499ef1777a..2d39c91638ec318f680e6525ad377ac985311cb1 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Index.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Sales\Controller\Adminhtml\Transactions /** * @return Page */ - public function execute() + public function executeInternal() { /** @var Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/View.php index 867d700cb41ecc1e00e68f3886c4d6dfcd806e3e..df25ccba4a9c484c261fd15024a68d6bbcf481f5 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/View.php @@ -16,7 +16,7 @@ class View extends \Magento\Sales\Controller\Adminhtml\Transactions * * @return Page */ - public function execute() + public function executeInternal() { $txn = $this->_initTransaction(); if (!$txn) { diff --git a/app/code/Magento/Sales/Controller/Download/DownloadCustomOption.php b/app/code/Magento/Sales/Controller/Download/DownloadCustomOption.php index 991ac197d784a71ab6f5c636987293bcefd5a4f6..d0e7ca016d0523aba740fc1e106df9a117e9b485 100644 --- a/app/code/Magento/Sales/Controller/Download/DownloadCustomOption.php +++ b/app/code/Magento/Sales/Controller/Download/DownloadCustomOption.php @@ -54,7 +54,7 @@ class DownloadCustomOption extends \Magento\Framework\App\Action\Action * * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { $quoteItemOptionId = $this->getRequest()->getParam('id'); /** @var $option \Magento\Quote\Model\Quote\Item\Option */ diff --git a/app/code/Magento/Sales/Controller/Guest/Form.php b/app/code/Magento/Sales/Controller/Guest/Form.php index c9f87d44e7995fabf5078c1b200b2effcea693c1..03f56609495b90aac35722aa82187661d4338e35 100644 --- a/app/code/Magento/Sales/Controller/Guest/Form.php +++ b/app/code/Magento/Sales/Controller/Guest/Form.php @@ -30,7 +30,7 @@ class Form extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\Result\Redirect|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { if ($this->_objectManager->get('Magento\Customer\Model\Session')->isLoggedIn()) { return $this->resultRedirectFactory->create()->setPath('customer/account/'); diff --git a/app/code/Magento/Sales/Controller/Guest/PrintCreditmemo.php b/app/code/Magento/Sales/Controller/Guest/PrintCreditmemo.php index 5b6fd6c5a6a1049dbcb82265ce4e84989d28c6ae..cc62bfa704781fe1833579608e5ae2a9a4892659 100644 --- a/app/code/Magento/Sales/Controller/Guest/PrintCreditmemo.php +++ b/app/code/Magento/Sales/Controller/Guest/PrintCreditmemo.php @@ -52,7 +52,7 @@ class PrintCreditmemo extends \Magento\Sales\Controller\AbstractController\Print /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $result = $this->orderLoader->load($this->_request); if ($result instanceof \Magento\Framework\Controller\ResultInterface) { diff --git a/app/code/Magento/Sales/Controller/Guest/PrintInvoice.php b/app/code/Magento/Sales/Controller/Guest/PrintInvoice.php index ddd943b3246b5029a5e19b5ed989a10d5c28710e..d8c30fe056d141560d3335207f991ae36b624ba1 100644 --- a/app/code/Magento/Sales/Controller/Guest/PrintInvoice.php +++ b/app/code/Magento/Sales/Controller/Guest/PrintInvoice.php @@ -42,7 +42,7 @@ class PrintInvoice extends \Magento\Sales\Controller\AbstractController\PrintInv /** * {@inheritdoc} */ - public function execute() + public function executeInternal() { $result = $this->orderLoader->load($this->_request); if ($result instanceof \Magento\Framework\Controller\ResultInterface) { diff --git a/app/code/Magento/Sales/Controller/Guest/PrintShipment.php b/app/code/Magento/Sales/Controller/Guest/PrintShipment.php index 8dcbfe4ef735cb9d330de055feece6b5e9fe0fcb..8a1ad2b803e16af16c38d5c45e87df5b5f5b26e7 100644 --- a/app/code/Magento/Sales/Controller/Guest/PrintShipment.php +++ b/app/code/Magento/Sales/Controller/Guest/PrintShipment.php @@ -42,7 +42,7 @@ class PrintShipment extends \Magento\Sales\Controller\AbstractController\PrintSh /** * {@inheritdoc} */ - public function execute() + public function executeInternal() { $result = $this->orderLoader->load($this->_request); if ($result instanceof \Magento\Framework\Controller\ResultInterface) { diff --git a/app/code/Magento/Sales/Controller/Guest/View.php b/app/code/Magento/Sales/Controller/Guest/View.php index 93de3cab2db471fe463842f980715fe1a185f91e..500d1d30d0813ad1b624fea6ba51e0564421ea85 100644 --- a/app/code/Magento/Sales/Controller/Guest/View.php +++ b/app/code/Magento/Sales/Controller/Guest/View.php @@ -40,7 +40,7 @@ class View extends Action\Action /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $result = $this->guestHelper->loadValidOrder($this->getRequest()); if ($result instanceof ResultInterface) { diff --git a/app/code/Magento/Sales/Controller/Order/History.php b/app/code/Magento/Sales/Controller/Order/History.php index 5a87a8b944258f0b434381588735d532e984410e..8dd70bfbe330bed6b4610db4723ee0cd2ee5a730 100644 --- a/app/code/Magento/Sales/Controller/Order/History.php +++ b/app/code/Magento/Sales/Controller/Order/History.php @@ -34,7 +34,7 @@ class History extends \Magento\Framework\App\Action\Action implements OrderInter * * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Order/Plugin/Authentication.php b/app/code/Magento/Sales/Controller/Order/Plugin/Authentication.php index e496f13e7a64ada322ac67af6d4b10182e7f5ed7..fed11efb2717cc93c5c87ae1924b16c5b76f1ebc 100644 --- a/app/code/Magento/Sales/Controller/Order/Plugin/Authentication.php +++ b/app/code/Magento/Sales/Controller/Order/Plugin/Authentication.php @@ -40,7 +40,7 @@ class Authentication * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function beforeDispatch(\Magento\Framework\App\ActionInterface $subject, RequestInterface $request) + public function beforeExecute(\Magento\Framework\App\ActionInterface $subject, RequestInterface $request) { $loginUrl = $this->customerUrl->getLoginUrl(); diff --git a/app/code/Magento/Sales/Helper/Guest.php b/app/code/Magento/Sales/Helper/Guest.php index baf3512eed4c3019f589b641364d3f31200e57e3..a69fa337b8da2c19710a94c655a64aa165b6abf0 100644 --- a/app/code/Magento/Sales/Helper/Guest.php +++ b/app/code/Magento/Sales/Helper/Guest.php @@ -139,8 +139,9 @@ class Guest extends \Magento\Framework\App\Helper\AbstractHelper $lastName = $post['oar_billing_lastname']; $email = $post['oar_email']; $zip = $post['oar_zip']; + $storeId = $this->_storeManager->getStore()->getId(); - if (empty($incrementId) || empty($lastName) || empty($type) || !in_array( + if (empty($incrementId) || empty($lastName) || empty($type) || empty($storeId) || !in_array( $type, ['email', 'zip'] ) || $type == 'email' && empty($email) || $type == 'zip' && empty($zip) @@ -149,7 +150,7 @@ class Guest extends \Magento\Framework\App\Helper\AbstractHelper } if (!$errors) { - $order->loadByIncrementId($incrementId); + $order = $order->loadByIncrementIdAndStoreId($incrementId, $storeId); } $errors = true; diff --git a/app/code/Magento/Sales/Model/Download.php b/app/code/Magento/Sales/Model/Download.php index be8054315ea9ccf7ffaa42e4ffeaf86864f571bf..0f2649d7de582651d8ab65af4866b2cca21139d4 100644 --- a/app/code/Magento/Sales/Model/Download.php +++ b/app/code/Magento/Sales/Model/Download.php @@ -6,6 +6,7 @@ namespace Magento\Sales\Model; use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Exception\LocalizedException; class Download { @@ -29,19 +30,27 @@ class Download */ protected $_fileFactory; + /** + * @var string + */ + protected $rootDirBasePath; + /** * @param \Magento\Framework\Filesystem $filesystem * @param \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDatabase * @param \Magento\MediaStorage\Model\File\Storage\DatabaseFactory $storageDatabaseFactory * @param \Magento\Framework\App\Response\Http\FileFactory $fileFactory + * @param string $rootDirBasePath */ public function __construct( \Magento\Framework\Filesystem $filesystem, \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDatabase, \Magento\MediaStorage\Model\File\Storage\DatabaseFactory $storageDatabaseFactory, - \Magento\Framework\App\Response\Http\FileFactory $fileFactory + \Magento\Framework\App\Response\Http\FileFactory $fileFactory, + $rootDirBasePath = DirectoryList::MEDIA ) { - $this->_rootDir = $filesystem->getDirectoryWrite(DirectoryList::ROOT); + $this->rootDirBasePath = $rootDirBasePath; + $this->_rootDir = $filesystem->getDirectoryWrite($this->rootDirBasePath); $this->_fileStorageDatabase = $fileStorageDatabase; $this->_storageDatabaseFactory = $storageDatabaseFactory; $this->_fileFactory = $fileFactory; @@ -57,18 +66,19 @@ class Download public function downloadFile($info) { $relativePath = $info['order_path']; - if ($this->_isCanProcessed($relativePath)) { + if (!$this->_isCanProcessed($relativePath)) { //try get file from quote $relativePath = $info['quote_path']; - if ($this->_isCanProcessed($relativePath)) { - throw new \Exception(); + if (!$this->_isCanProcessed($relativePath)) { + throw new LocalizedException( + __('Path "%1" is not part of allowed directory "%2"', $relativePath, $this->rootDirBasePath) + ); } } - $this->_fileFactory->create( $info['title'], ['value' => $this->_rootDir->getRelativePath($relativePath), 'type' => 'filename'], - DirectoryList::ROOT + $this->rootDirBasePath ); } @@ -79,32 +89,28 @@ class Download protected function _isCanProcessed($relativePath) { $filePath = $this->_rootDir->getAbsolutePath($relativePath); - return (!$this->_rootDir->isFile( - $relativePath - ) || !$this->_rootDir->isReadable( - $relativePath - )) && !$this->_processDatabaseFile( - $filePath - ); + return (strpos($this->_rootDir->getDriver()->getRealPath($filePath), $relativePath) !== false + && $this->_rootDir->isFile($relativePath) && $this->_rootDir->isReadable($relativePath)) + || $this->_processDatabaseFile($filePath, $relativePath); } /** * Check file in database storage if needed and place it on file system * * @param string $filePath + * @param string $relativePath * @return bool */ - protected function _processDatabaseFile($filePath) + protected function _processDatabaseFile($filePath, $relativePath) { if (!$this->_fileStorageDatabase->checkDbUsage()) { return false; } - $relativePath = $this->_fileStorageDatabase->getMediaRelativePath($filePath); $file = $this->_storageDatabaseFactory->create()->loadByFilename($relativePath); if (!$file->getId()) { return false; } - $stream = $this->_rootDir->openFile($filePath, 'w+'); + $stream = $this->_rootDir->openFile($relativePath, 'w+'); $stream->lock(); $stream->write($filePath, $file->getContent()); $stream->unlock(); diff --git a/app/code/Magento/Sales/Model/Order.php b/app/code/Magento/Sales/Model/Order.php index e53438bd6844b88d4a9f91fefb81da78d5ae7f07..e289e654b98d6c7c22b5de527e175ea5e610eca2 100644 --- a/app/code/Magento/Sales/Model/Order.php +++ b/app/code/Magento/Sales/Model/Order.php @@ -252,6 +252,11 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface */ protected $_trackCollectionFactory; + /** + * @var \Magento\Sales\Model\ResourceModel\Order\CollectionFactory + */ + protected $salesOrderCollectionFactory; + /** * @var PriceCurrencyInterface */ @@ -284,6 +289,7 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface * @param \Magento\Sales\Model\ResourceModel\Order\Shipment\CollectionFactory $shipmentCollectionFactory * @param \Magento\Sales\Model\ResourceModel\Order\Creditmemo\CollectionFactory $memoCollectionFactory * @param \Magento\Sales\Model\ResourceModel\Order\Shipment\Track\CollectionFactory $trackCollectionFactory + * @param ResourceModel\Order\CollectionFactory $salesOrderCollectionFactory * @param PriceCurrencyInterface $priceCurrency * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productListFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -313,6 +319,7 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface \Magento\Sales\Model\ResourceModel\Order\Shipment\CollectionFactory $shipmentCollectionFactory, \Magento\Sales\Model\ResourceModel\Order\Creditmemo\CollectionFactory $memoCollectionFactory, \Magento\Sales\Model\ResourceModel\Order\Shipment\Track\CollectionFactory $trackCollectionFactory, + \Magento\Sales\Model\ResourceModel\Order\CollectionFactory $salesOrderCollectionFactory, PriceCurrencyInterface $priceCurrency, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productListFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -337,6 +344,7 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface $this->_shipmentCollectionFactory = $shipmentCollectionFactory; $this->_memoCollectionFactory = $memoCollectionFactory; $this->_trackCollectionFactory = $trackCollectionFactory; + $this->salesOrderCollectionFactory = $salesOrderCollectionFactory; $this->priceCurrency = $priceCurrency; parent::__construct( $context, @@ -435,6 +443,40 @@ class Order extends AbstractModel implements EntityInterface, OrderInterface return $this->loadByAttribute('increment_id', $incrementId); } + /** + * Load order by system increment and store identifiers + * + * @param string $incrementId + * @param string $storeId + * @return \Magento\Sales\Model\Order + */ + public function loadByIncrementIdAndStoreId($incrementId, $storeId) + { + $orderCollection = $this->getSalesOrderCollection( + [ + 'increment_id' => $incrementId, + 'store_id' => $storeId + ] + ); + return $orderCollection->getFirstItem(); + } + + /** + * Get sales Order collection model populated with data + * + * @param array $filters + * @return \Magento\Sales\Model\ResourceModel\Order\Collection + */ + protected function getSalesOrderCollection(array $filters = []) + { + /** @var \Magento\Sales\Model\ResourceModel\Order\Collection $salesOrderCollection */ + $salesOrderCollection = $this->salesOrderCollectionFactory->create(); + foreach ($filters as $field => $condition) { + $salesOrderCollection->addFieldToFilter($field, $condition); + } + return $salesOrderCollection->load(); + } + /** * Load order by custom attribute value. Attribute value should be unique * diff --git a/app/code/Magento/Sales/Model/Order/AddressRepository.php b/app/code/Magento/Sales/Model/Order/AddressRepository.php index 2e4c9df86fa22c97348f932c07b1d8dc41d46d46..ec5a39bce3b6c290d88bf0569d5af6d8d5082ba5 100644 --- a/app/code/Magento/Sales/Model/Order/AddressRepository.php +++ b/app/code/Magento/Sales/Model/Order/AddressRepository.php @@ -14,6 +14,8 @@ use Magento\Framework\Exception\InputException; /** * Repository class for @see \Magento\Sales\Api\Data\OrderAddressInterface + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class AddressRepository implements \Magento\Sales\Api\OrderAddressRepositoryInterface { @@ -77,24 +79,24 @@ class AddressRepository implements \Magento\Sales\Api\OrderAddressRepositoryInte /** * Find order addresses by criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria * @return \Magento\Sales\Api\Data\OrderAddressInterface[] */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { //@TODO: fix search logic /** @var \Magento\Sales\Api\Data\OrderAddressSearchResultInterface $searchResult */ $searchResult = $this->searchResultFactory->create(); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $searchResult->setCurPage($criteria->getCurrentPage()); - $searchResult->setPageSize($criteria->getPageSize()); + $searchResult->setCurPage($searchCriteria->getCurrentPage()); + $searchResult->setPageSize($searchCriteria->getPageSize()); return $searchResult; } diff --git a/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php b/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php index 200a57a73fff5804e589b9688d1ecc443db061e1..c9621a7e668d34ec8ae53db42e0051c8e4e59c07 100644 --- a/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php +++ b/app/code/Magento/Sales/Model/Order/CreditmemoRepository.php @@ -87,21 +87,21 @@ class CreditmemoRepository implements \Magento\Sales\Api\CreditmemoRepositoryInt /** * Lists credit memos that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\CreditmemoSearchResultInterface Credit memo search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { /** @var \Magento\Sales\Api\Data\CreditmemoSearchResultInterface $searchResult */ $searchResult = $this->searchResultFactory->create(); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $searchResult->setCurPage($criteria->getCurrentPage()); - $searchResult->setPageSize($criteria->getPageSize()); + $searchResult->setCurPage($searchCriteria->getCurrentPage()); + $searchResult->setPageSize($searchCriteria->getPageSize()); return $searchResult; } diff --git a/app/code/Magento/Sales/Model/Order/InvoiceRepository.php b/app/code/Magento/Sales/Model/Order/InvoiceRepository.php index 04275723bda95706d78cf85f717bb195dbbbf6ff..6ac147108bb73a6da51fb8aeb22f803ef63c151c 100644 --- a/app/code/Magento/Sales/Model/Order/InvoiceRepository.php +++ b/app/code/Magento/Sales/Model/Order/InvoiceRepository.php @@ -83,21 +83,21 @@ class InvoiceRepository implements InvoiceRepositoryInterface /** * Find entities by criteria * - * @param \Magento\Framework\Api\SearchCriteria $criteria + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria * @return \Magento\Sales\Api\Data\InvoiceInterface[] */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { /** @var \Magento\Sales\Model\ResourceModel\Order\Invoice\Collection $collection */ $collection = $this->searchResultFactory->create(); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $collection->setCurPage($criteria->getCurrentPage()); - $collection->setPageSize($criteria->getPageSize()); + $collection->setCurPage($searchCriteria->getCurrentPage()); + $collection->setPageSize($searchCriteria->getPageSize()); return $collection; } diff --git a/app/code/Magento/Sales/Model/Order/ItemRepository.php b/app/code/Magento/Sales/Model/Order/ItemRepository.php index 776b862828658da8092d992697e790599941c770..983a87834fabfde0ba471c20c2a42ebbc6ca5b5c 100644 --- a/app/code/Magento/Sales/Model/Order/ItemRepository.php +++ b/app/code/Magento/Sales/Model/Order/ItemRepository.php @@ -114,16 +114,16 @@ class ItemRepository implements OrderItemRepositoryInterface /** * Find entities by criteria * - * @param SearchCriteria $criteria + * @param SearchCriteria $searchCriteria * @return OrderItemInterface[] */ - public function getList(SearchCriteria $criteria) + public function getList(SearchCriteria $searchCriteria) { /** @var OrderItemSearchResultInterface $searchResult */ $searchResult = $this->searchResultFactory->create(); - $searchResult->setSearchCriteria($criteria); + $searchResult->setSearchCriteria($searchCriteria); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); diff --git a/app/code/Magento/Sales/Model/Order/Payment.php b/app/code/Magento/Sales/Model/Order/Payment.php index 690bde68d5c575ece27f56d68165d1ccf31bc7d5..83cf0853fdab41721a8bde05cdfc46426fc6cd94 100644 --- a/app/code/Magento/Sales/Model/Order/Payment.php +++ b/app/code/Magento/Sales/Model/Order/Payment.php @@ -629,7 +629,7 @@ class Payment extends Info implements OrderPaymentInterface $this->getOrder()->getId() ); if ($captureTxn) { - $this->setParentTransactionId($captureTxn->getTxnId()); + $this->setTransactionIdsForRefund($captureTxn); } $this->setShouldCloseParentTransaction(true); // TODO: implement multiple refunds per capture @@ -638,10 +638,7 @@ class Payment extends Info implements OrderPaymentInterface $this->getOrder()->getStoreId() ); $this->setRefundTransactionId($invoice->getTransactionId()); - $gateway->refund( - $this, - $baseAmountToRefund - ); + $gateway->refund($this, $baseAmountToRefund); $creditmemo->setTransactionId($this->getLastTransId()); } catch (\Magento\Framework\Exception\LocalizedException $e) { @@ -1263,16 +1260,8 @@ class Payment extends Info implements OrderPaymentInterface */ public function isCaptureFinal($amountToCapture) { - $amountPaid = $this->formatAmount($this->getBaseAmountPaid(), true); - $amountToCapture = $this->formatAmount($amountToCapture, true); - $orderGrandTotal = $this->formatAmount($this->getOrder()->getBaseGrandTotal(), true); - if ($orderGrandTotal == $amountPaid + $amountToCapture) { - if (false !== $this->getShouldCloseParentTransaction()) { - $this->setShouldCloseParentTransaction(true); - } - return true; - } - return false; + $total = $this->getOrder()->getTotalDue(); + return $this->formatAmount($total, true) == $this->formatAmount($amountToCapture, true); } /** @@ -2414,5 +2403,24 @@ class Payment extends Info implements OrderPaymentInterface return (bool)$this->getData('should_close_parent_transaction'); } + /** + * Set payment parent transaction id and current transaction id if it not set + * @param Transaction $transaction + * @return void + */ + private function setTransactionIdsForRefund(Transaction $transaction) + { + if (!$this->getTransactionId()) { + $this->setTransactionId( + $this->transactionManager->generateTransactionId( + $this, + Transaction::TYPE_REFUND, + $transaction + ) + ); + } + $this->setParentTransactionId($transaction->getTxnId()); + } + //@codeCoverageIgnoreEnd } diff --git a/app/code/Magento/Sales/Model/Order/Payment/Operations/CaptureOperation.php b/app/code/Magento/Sales/Model/Order/Payment/Operations/CaptureOperation.php index 590422b153130b34b55dddb6f1777fd206ec4149..3bb13ccca2bf88b3d99cce521f59e7e0b6fb2126 100644 --- a/app/code/Magento/Sales/Model/Order/Payment/Operations/CaptureOperation.php +++ b/app/code/Magento/Sales/Model/Order/Payment/Operations/CaptureOperation.php @@ -37,13 +37,6 @@ class CaptureOperation extends AbstractOperation $amountToCapture = $payment->formatAmount($invoice->getBaseGrandTotal()); $order = $payment->getOrder(); - // prepare parent transaction and its amount - $paidWorkaround = 0; - if (!$invoice->wasPayCalled()) { - $paidWorkaround = (double)$amountToCapture; - } - $payment->isCaptureFinal($paidWorkaround); - $payment->setTransactionId( $this->transactionManager->generateTransactionId( $payment, @@ -72,38 +65,48 @@ class CaptureOperation extends AbstractOperation ); } - if (!$invoice->getIsPaid()) { - // attempt to capture: this can trigger "is_transaction_pending" - $method = $payment->getMethodInstance(); - $method->setStore( - $order->getStoreId() + if ($invoice->getIsPaid()) { + throw new \Magento\Framework\Exception\LocalizedException( + __('The transaction "%1" cannot be captured yet.', $invoice->getTransactionId()) ); - //TODO replace for sale usage - $method->capture($payment, $amountToCapture); + } + + // attempt to capture: this can trigger "is_transaction_pending" + $method = $payment->getMethodInstance(); + $method->setStore( + $order->getStoreId() + ); + //TODO replace for sale usage + $method->capture($payment, $amountToCapture); - $transactionBuilder = $this->transactionBuilder->setPayment($payment); - $transactionBuilder->setOrder($order); - $transactionBuilder->setFailSafe(true); - $transactionBuilder->setTransactionId($payment->getTransactionId()); - $transactionBuilder->setAdditionalInformation($payment->getTransactionAdditionalInfo()); - $transactionBuilder->setSalesDocument($invoice); - $transaction = $transactionBuilder->build(Transaction::TYPE_CAPTURE); + // prepare parent transaction and its amount + $paidWorkaround = 0; + if (!$invoice->wasPayCalled()) { + $paidWorkaround = (double)$amountToCapture; + } + if ($payment->isCaptureFinal($paidWorkaround)) { + $payment->setShouldCloseParentTransaction(true); + } - $message = $this->stateCommand->execute($payment, $amountToCapture, $order); - if ($payment->getIsTransactionPending()) { - $invoice->setIsPaid(false); - } else { - $invoice->setIsPaid(true); - $this->updateTotals($payment, ['base_amount_paid_online' => $amountToCapture]); - } - $message = $payment->prependMessage($message); - $payment->addTransactionCommentsToOrder($transaction, $message); - $invoice->setTransactionId($payment->getLastTransId()); + $transactionBuilder = $this->transactionBuilder->setPayment($payment); + $transactionBuilder->setOrder($order); + $transactionBuilder->setFailSafe(true); + $transactionBuilder->setTransactionId($payment->getTransactionId()); + $transactionBuilder->setAdditionalInformation($payment->getTransactionAdditionalInfo()); + $transactionBuilder->setSalesDocument($invoice); + $transaction = $transactionBuilder->build(Transaction::TYPE_CAPTURE); - return $payment; + $message = $this->stateCommand->execute($payment, $amountToCapture, $order); + if ($payment->getIsTransactionPending()) { + $invoice->setIsPaid(false); + } else { + $invoice->setIsPaid(true); + $this->updateTotals($payment, ['base_amount_paid_online' => $amountToCapture]); } - throw new \Magento\Framework\Exception\LocalizedException( - __('The transaction "%1" cannot be captured yet.', $invoice->getTransactionId()) - ); + $message = $payment->prependMessage($message); + $payment->addTransactionCommentsToOrder($transaction, $message); + $invoice->setTransactionId($payment->getLastTransId()); + + return $payment; } } diff --git a/app/code/Magento/Sales/Model/Order/Payment/Operations/RegisterCaptureNotificationOperation.php b/app/code/Magento/Sales/Model/Order/Payment/Operations/RegisterCaptureNotificationOperation.php index 7c5e892ce035878f1ae41ee5c55d89c0bab8056c..8b7759b79a680079aadee62d56279e59a267cc2d 100644 --- a/app/code/Magento/Sales/Model/Order/Payment/Operations/RegisterCaptureNotificationOperation.php +++ b/app/code/Magento/Sales/Model/Order/Payment/Operations/RegisterCaptureNotificationOperation.php @@ -44,6 +44,7 @@ class RegisterCaptureNotificationOperation extends AbstractOperation $invoice->setOrder($order); $order->addRelatedObject($invoice); $payment->setCreatedInvoice($invoice); + $payment->setShouldCloseParentTransaction(true); } else { $payment->setIsFraudDetected(!$skipFraudDetection); $this->updateTotals($payment, ['base_amount_paid_online' => $amount]); diff --git a/app/code/Magento/Sales/Model/Order/Payment/Repository.php b/app/code/Magento/Sales/Model/Order/Payment/Repository.php index 2517c4b9adbcc1aca5b648f7ad4974645624220c..ef3fb08b5daa1b4980a9ef2a34fd43bcd59fcd6b 100644 --- a/app/code/Magento/Sales/Model/Order/Payment/Repository.php +++ b/app/code/Magento/Sales/Model/Order/Payment/Repository.php @@ -47,21 +47,21 @@ class Repository implements OrderPaymentRepositoryInterface /** * Lists order payments that match specified search criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria The search criteria. + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria The search criteria. * @return \Magento\Sales\Api\Data\OrderPaymentSearchResultInterface Order payment search result interface. */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { /** @var \Magento\Sales\Model\ResourceModel\Order\Payment\Collection $collection */ $collection = $this->searchResultFactory->create(); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $collection->setCurPage($criteria->getCurrentPage()); - $collection->setPageSize($criteria->getPageSize()); + $collection->setCurPage($searchCriteria->getCurrentPage()); + $collection->setPageSize($searchCriteria->getPageSize()); return $collection; } diff --git a/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php b/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php index 051ab5401d59fda4ded3f0af78bab2869e526617..a3550d6073ecd8f5040e230c5f350ea4ec0eb2ab 100644 --- a/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php +++ b/app/code/Magento/Sales/Model/Order/Payment/Transaction/Repository.php @@ -185,18 +185,18 @@ class Repository implements TransactionRepositoryInterface /** * {@inheritdoc} */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { /** @var TransactionResource\Collection $collection */ $collection = $this->searchResultFactory->create(); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $collection->setCurPage($criteria->getCurrentPage()); - $collection->setPageSize($criteria->getPageSize()); + $collection->setCurPage($searchCriteria->getCurrentPage()); + $collection->setPageSize($searchCriteria->getPageSize()); $collection->addPaymentInformation(['method']); $collection->addOrderInformation(['increment_id']); return $collection; diff --git a/app/code/Magento/Sales/Model/Order/ShipmentRepository.php b/app/code/Magento/Sales/Model/Order/ShipmentRepository.php index c44fa79ae56c7525b36bd8fa9a2f15ffa0206946..9cb32363b480fcdd1c69c673f37c3fd9cf5a54a6 100644 --- a/app/code/Magento/Sales/Model/Order/ShipmentRepository.php +++ b/app/code/Magento/Sales/Model/Order/ShipmentRepository.php @@ -14,6 +14,8 @@ use Magento\Framework\Exception\InputException; /** * Repository class for @see \Magento\Sales\Api\Data\ShipmentInterface + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class ShipmentRepository implements \Magento\Sales\Api\ShipmentRepositoryInterface { @@ -77,24 +79,24 @@ class ShipmentRepository implements \Magento\Sales\Api\ShipmentRepositoryInterfa /** * Find shipments by criteria. * - * @param \Magento\Framework\Api\SearchCriteria $criteria + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria * @return \Magento\Sales\Api\Data\ShipmentInterface[] */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { //@TODO: fix search logic /** @var \Magento\Sales\Api\Data\ShipmentSearchResultInterface $searchResult */ $searchResult = $this->searchResultFactory->create(); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $searchResult->setCurPage($criteria->getCurrentPage()); - $searchResult->setPageSize($criteria->getPageSize()); + $searchResult->setCurPage($searchCriteria->getCurrentPage()); + $searchResult->setPageSize($searchCriteria->getPageSize()); return $searchResult; } diff --git a/app/code/Magento/Sales/Model/OrderRepository.php b/app/code/Magento/Sales/Model/OrderRepository.php index 976a03486a4f1ead05696c96dfc28ba9652f2d68..1d4a7b8e66a9a72b902636aae8efc8ae919a3204 100644 --- a/app/code/Magento/Sales/Model/OrderRepository.php +++ b/app/code/Magento/Sales/Model/OrderRepository.php @@ -73,22 +73,22 @@ class OrderRepository implements \Magento\Sales\Api\OrderRepositoryInterface /** * Find entities by criteria * - * @param \Magento\Framework\Api\SearchCriteria $criteria + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria * @return \Magento\Sales\Api\Data\OrderInterface[] */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { //@TODO: fix search logic /** @var \Magento\Sales\Api\Data\OrderSearchResultInterface $searchResult */ $searchResult = $this->searchResultFactory->create(); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $searchResult->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $searchResult->setCurPage($criteria->getCurrentPage()); - $searchResult->setPageSize($criteria->getPageSize()); + $searchResult->setCurPage($searchCriteria->getCurrentPage()); + $searchResult->setPageSize($searchCriteria->getPageSize()); return $searchResult; } diff --git a/app/code/Magento/Sales/Model/ResourceModel/Order/Address.php b/app/code/Magento/Sales/Model/ResourceModel/Order/Address.php index 6df065f7ee30372b130c002875fb0518d266a8ca..625fe5e2b342f629ca0f62df308687c6d132c7e4 100644 --- a/app/code/Magento/Sales/Model/ResourceModel/Order/Address.php +++ b/app/code/Magento/Sales/Model/ResourceModel/Order/Address.php @@ -122,19 +122,4 @@ class Address extends SalesResource implements OrderAddressResourceInterface } return $this; } - - /** - * Update related grid table after object save - * - * @param \Magento\Framework\Model\AbstractModel|\Magento\Framework\DataObject $object - * @return \Magento\Framework\Model\ResourceModel\Db\AbstractDb - */ - protected function _afterSave(\Magento\Framework\Model\AbstractModel $object) - { - $resource = parent::_afterSave($object); - if ($object->getParentId()) { - $this->gridPool->refreshByOrderId($object->getParentId()); - } - return $resource; - } } diff --git a/app/code/Magento/Sales/Model/Service/CreditmemoService.php b/app/code/Magento/Sales/Model/Service/CreditmemoService.php index ea0e1ed82d1b3321648f2507ae646098cc620c8d..1993e1d1cae54bd62b2c4a2d632589c89f28cfd9 100644 --- a/app/code/Magento/Sales/Model/Service/CreditmemoService.php +++ b/app/code/Magento/Sales/Model/Service/CreditmemoService.php @@ -108,8 +108,8 @@ class CreditmemoService implements \Magento\Sales\Api\CreditmemoManagementInterf $this->searchCriteriaBuilder->addFilters( [$this->filterBuilder->setField('parent_id')->setValue($id)->setConditionType('eq')->create()] ); - $criteria = $this->searchCriteriaBuilder->create(); - return $this->commentRepository->getList($criteria); + $searchCriteria = $this->searchCriteriaBuilder->create(); + return $this->commentRepository->getList($searchCriteria); } /** @@ -129,13 +129,11 @@ class CreditmemoService implements \Magento\Sales\Api\CreditmemoManagementInterf * * @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo * @param bool $offlineRequested - * @param bool $notifyCustomer * @return \Magento\Sales\Api\Data\CreditmemoInterface */ public function refund( \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo, - $offlineRequested = false, - $notifyCustomer = false + $offlineRequested = false ) { $this->validateForRefund($creditmemo); $creditmemo->setState(\Magento\Sales\Model\Order\Creditmemo::STATE_REFUNDED); diff --git a/app/code/Magento/Sales/Model/Service/InvoiceService.php b/app/code/Magento/Sales/Model/Service/InvoiceService.php index 5c07bf365e9fb1669804dd81b554c79af88d8a62..7352d0f221e330110014f371c5a62713b496addf 100644 --- a/app/code/Magento/Sales/Model/Service/InvoiceService.php +++ b/app/code/Magento/Sales/Model/Service/InvoiceService.php @@ -103,8 +103,8 @@ class InvoiceService implements InvoiceManagementInterface $this->criteriaBuilder->addFilters( [$this->filterBuilder->setField('parent_id')->setValue($id)->setConditionType('eq')->create()] ); - $criteria = $this->criteriaBuilder->create(); - return $this->commentRepository->getList($criteria); + $searchCriteria = $this->criteriaBuilder->create(); + return $this->commentRepository->getList($searchCriteria); } /** diff --git a/app/code/Magento/Sales/Model/Service/OrderService.php b/app/code/Magento/Sales/Model/Service/OrderService.php index 5df21bf9df691206d6bcd6f64fc4b9264c940e1a..29b719a1873a6144d7e83853d8a47316bc9349c7 100644 --- a/app/code/Magento/Sales/Model/Service/OrderService.php +++ b/app/code/Magento/Sales/Model/Service/OrderService.php @@ -44,6 +44,11 @@ class OrderService implements OrderManagementInterface */ protected $eventManager; + /** + * @var \Magento\Sales\Model\Order\Email\Sender\OrderCommentSender + */ + protected $orderCommentSender; + /** * Constructor * @@ -53,6 +58,7 @@ class OrderService implements OrderManagementInterface * @param \Magento\Framework\Api\FilterBuilder $filterBuilder * @param \Magento\Sales\Model\OrderNotifier $notifier * @param \Magento\Framework\Event\ManagerInterface $eventManager + * @param \Magento\Sales\Model\Order\Email\Sender\OrderCommentSender $orderCommentSender */ public function __construct( \Magento\Sales\Api\OrderRepositoryInterface $orderRepository, @@ -60,7 +66,8 @@ class OrderService implements OrderManagementInterface \Magento\Framework\Api\SearchCriteriaBuilder $criteriaBuilder, \Magento\Framework\Api\FilterBuilder $filterBuilder, \Magento\Sales\Model\OrderNotifier $notifier, - \Magento\Framework\Event\ManagerInterface $eventManager + \Magento\Framework\Event\ManagerInterface $eventManager, + \Magento\Sales\Model\Order\Email\Sender\OrderCommentSender $orderCommentSender ) { $this->orderRepository = $orderRepository; $this->historyRepository = $historyRepository; @@ -68,6 +75,7 @@ class OrderService implements OrderManagementInterface $this->filterBuilder = $filterBuilder; $this->notifier = $notifier; $this->eventManager = $eventManager; + $this->orderCommentSender = $orderCommentSender; } /** @@ -98,8 +106,8 @@ class OrderService implements OrderManagementInterface $this->criteriaBuilder->addFilters( [$this->filterBuilder->setField('parent_id')->setValue($id)->setConditionType('eq')->create()] ); - $criteria = $this->criteriaBuilder->create(); - return $this->historyRepository->getList($criteria); + $searchCriteria = $this->criteriaBuilder->create(); + return $this->historyRepository->getList($searchCriteria); } /** @@ -114,6 +122,9 @@ class OrderService implements OrderManagementInterface $order = $this->orderRepository->get($id); $order->addStatusHistory($statusHistory); $this->orderRepository->save($order); + $notify = isset($statusHistory['is_customer_notified']) ? $statusHistory['is_customer_notified'] : false; + $comment = trim(strip_tags($statusHistory->getComment())); + $this->orderCommentSender->send($order, $notify, $comment); return true; } diff --git a/app/code/Magento/Sales/Model/Service/ShipmentService.php b/app/code/Magento/Sales/Model/Service/ShipmentService.php index 6523e8e83825e5112286d787a1f15bdff3e394bd..62593c1b1d0dc58165dafe3453291e13fcf0a123 100644 --- a/app/code/Magento/Sales/Model/Service/ShipmentService.php +++ b/app/code/Magento/Sales/Model/Service/ShipmentService.php @@ -91,8 +91,8 @@ class ShipmentService implements ShipmentManagementInterface $this->criteriaBuilder->addFilters( [$this->filterBuilder->setField('parent_id')->setValue($id)->setConditionType('eq')->create()] ); - $criteria = $this->criteriaBuilder->create(); - return $this->commentRepository->getList($criteria); + $searchCriteria = $this->criteriaBuilder->create(); + return $this->commentRepository->getList($searchCriteria); } /** diff --git a/app/code/Magento/Sales/Observer/GridProcessAddressChange.php b/app/code/Magento/Sales/Observer/GridProcessAddressChange.php new file mode 100644 index 0000000000000000000000000000000000000000..e053801290dbefb220c3e89af178495533ba24b4 --- /dev/null +++ b/app/code/Magento/Sales/Observer/GridProcessAddressChange.php @@ -0,0 +1,44 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Sales\Observer; + +use Magento\Framework\Event\Observer as EventObserver; +use Magento\Sales\Model\ResourceModel\GridPool; +use Magento\Framework\Event\ObserverInterface; + +/** + * Class GridProcessAddressChange + */ +class GridProcessAddressChange implements ObserverInterface +{ + + /** + * @var GridPool + */ + protected $gridPool; + + /** + * @param GridPool $gridPool + */ + public function __construct( + GridPool $gridPool + ) { + $this->gridPool= $gridPool; + } + + /** + * Refresh addresses in grids according to performed changed + * This is manual admin action, as result we perform this operation without delay + * + * @param EventObserver $observer + * @return void + */ + public function execute(EventObserver $observer) + { + $this->gridPool->refreshByOrderId($observer->getOrderId()); + } +} diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php index 6a78aef9bcf3da5e6ec6d935b6b0e7cfb63ebf40..b35968afc83ee8dc96c790264ee0f0c0a8f56776 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php @@ -163,7 +163,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->creditmemoEmail->execute() + $this->creditmemoEmail->executeInternal() ); $this->assertEquals($this->response, $this->creditmemoEmail->getResponse()); } @@ -175,7 +175,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase ->with('creditmemo_id') ->will($this->returnValue(null)); - $this->assertNull($this->creditmemoEmail->execute()); + $this->assertNull($this->creditmemoEmail->executeInternal()); } /** diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php index 4e5bd8e7472da26ca528f98a3636209effefcc12..0566645df83e066a56d3f48b089f58209ca1a5c0 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php @@ -206,7 +206,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase ->method('setPath') ->with('sales/invoice/view', ['order_id' => $orderId, 'invoice_id' => $invoiceId]) ->willReturnSelf(); - $this->assertInstanceOf('Magento\Backend\Model\View\Result\Redirect', $this->invoiceEmail->execute()); + $this->assertInstanceOf('Magento\Backend\Model\View\Result\Redirect', $this->invoiceEmail->executeInternal()); } public function testEmailNoInvoiceId() @@ -223,7 +223,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertInstanceOf('Magento\Backend\Model\View\Result\Forward', $this->invoiceEmail->execute()); + $this->assertInstanceOf('Magento\Backend\Model\View\Result\Forward', $this->invoiceEmail->executeInternal()); } public function testEmailNoInvoice() @@ -253,6 +253,6 @@ class EmailTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertInstanceOf('Magento\Backend\Model\View\Result\Forward', $this->invoiceEmail->execute()); + $this->assertInstanceOf('Magento\Backend\Model\View\Result\Forward', $this->invoiceEmail->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/CancelTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/CancelTest.php index 186a40730f98aef4490443006c1338d5d0c2bf76..fe34c10eb4f64821cda391dbe7e9e2d386300315 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/CancelTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/CancelTest.php @@ -137,6 +137,6 @@ class CancelTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->controller->execute()); + $this->assertEquals($this->resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Create/ProcessDataTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Create/ProcessDataTest.php index 805edbea1ea9b415d312090cdad93a8bc5be2568..c0763bf80d8ace933d961d3112b80a09e47dd9d9 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Create/ProcessDataTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Create/ProcessDataTest.php @@ -233,7 +233,7 @@ class ProcessDataTest extends \PHPUnit_Framework_TestCase ->method('forward') ->with('index') ->willReturnSelf(); - $this->assertInstanceOf('Magento\Backend\Model\View\Result\Forward', $this->processData->execute()); + $this->assertInstanceOf('Magento\Backend\Model\View\Result\Forward', $this->processData->executeInternal()); } public function isApplyDiscountDataProvider() diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php index b96f2254501abc8b280e52b4626abdd7c29d2478..f7f6a0db9dc400db8be4948bb4cc8a06a16a1412 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php @@ -173,7 +173,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\Controller\Result\Json', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -201,7 +201,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\Controller\Result\Json', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -230,7 +230,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\Controller\Result\Json', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -294,7 +294,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\Controller\Result\Raw', - $this->controller->execute() + $this->controller->executeInternal() ); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/CancelTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/CancelTest.php index 223b5a9753b63f5742b10b68f2ffc143669482a6..5b8749215aaab3fd65c3666c49065fa7bbc2099f 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/CancelTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/CancelTest.php @@ -200,7 +200,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -235,7 +235,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -258,7 +258,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Forward', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -293,7 +293,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->controller->execute() + $this->controller->executeInternal() ); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/NewActionTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/NewActionTest.php index 68726f2894c5859816695d605857c01c989321ec..99abeba2695a94727b2f5c82fdbb188c720c52c9 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/NewActionTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/NewActionTest.php @@ -238,7 +238,7 @@ class NewActionTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Page', - $this->controller->execute() + $this->controller->executeInternal() ); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/PrintActionTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/PrintActionTest.php index 7f2ae31af7e98be857073bf74d88d53098b741cf..753ed02380db46175b35f15f02c279544175e7d6 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/PrintActionTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/PrintActionTest.php @@ -152,7 +152,7 @@ class PrintActionTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Sales\Controller\Adminhtml\Order\Creditmemo\PrintAction::execute + * @covers \Magento\Sales\Controller\Adminhtml\Order\Creditmemo\PrintAction::executeInternal */ public function testExecute() { @@ -201,12 +201,12 @@ class PrintActionTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\App\ResponseInterface', - $this->printAction->execute() + $this->printAction->executeInternal() ); } /** - * @covers \Magento\Sales\Controller\Adminhtml\Order\Creditmemo\PrintAction::execute + * @covers \Magento\Sales\Controller\Adminhtml\Order\Creditmemo\PrintAction::executeInternal */ public function testExecuteNoCreditmemoId() { @@ -222,7 +222,7 @@ class PrintActionTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Forward', - $this->printAction->execute() + $this->printAction->executeInternal() ); } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php index 5549ee7f193ce5a5515571bff33de979e0afba47..6c0a726a516b087c61c3706079d472b7791112a2 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php @@ -14,7 +14,7 @@ namespace Magento\Sales\Test\Unit\Controller\Adminhtml\Order\Creditmemo; class SaveTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Sales\Controller\Adminhtml\Order\Creditmemo + * @var \Magento\Sales\Controller\Adminhtml\Order\Creditmemo\Save */ protected $_controller; @@ -190,7 +190,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->_controller->execute() + $this->_controller->executeInternal() ); } @@ -237,7 +237,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->_setSaveActionExpectationForMageCoreException($data, 'The credit memo\'s total must be positive.'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } /** diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php index 9e02c98b1c374df8f7263bfcf33733073e86d5d4..30534fcacfdec728e1af0fac811a3639c89a79db 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php @@ -221,7 +221,7 @@ class UpdateQtyTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\Controller\Result\Json', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -252,7 +252,7 @@ class UpdateQtyTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\Controller\Result\Json', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -300,7 +300,7 @@ class UpdateQtyTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Framework\Controller\Result\Raw', - $this->controller->execute() + $this->controller->executeInternal() ); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/ViewTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/ViewTest.php index fb87393407dcef1d4f4b3e1738890664a9eaf6cc..1b45562472581ebc1ee0e1ae6f4d10653e4e7fb6 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/ViewTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/ViewTest.php @@ -223,7 +223,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Forward', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -269,7 +269,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Page', - $this->controller->execute() + $this->controller->executeInternal() ); } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/VoidTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/VoidTest.php index 6d2d02861be077932095d947a73f411ecf65d4c7..efd4d5b43551f44d946a29dbceaa7ed873b02fa2 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/VoidTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/VoidTest.php @@ -207,7 +207,7 @@ class VoidTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Forward', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -243,7 +243,7 @@ class VoidTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -279,7 +279,7 @@ class VoidTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->controller->execute() + $this->controller->executeInternal() ); } @@ -333,7 +333,7 @@ class VoidTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->controller->execute() + $this->controller->executeInternal() ); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/EmailTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/EmailTest.php index 73396196f9723a40f1b17c97093835995660c7f1..578f64454d5fbf47b5c058a8554dd09bf43e5309 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/EmailTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/EmailTest.php @@ -196,7 +196,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->orderEmail->execute() + $this->orderEmail->executeInternal() ); $this->assertEquals($this->response, $this->orderEmail->getResponse()); } @@ -228,7 +228,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->orderEmail->execute() + $this->orderEmail->executeInternal() ); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/HoldTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/HoldTest.php index 18dd6a8c8b3376d7cf936aafd0351afd9e922d3a..2ddc7d1d212b1314f5e2a74d35621500433f6ef7 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/HoldTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/HoldTest.php @@ -137,6 +137,6 @@ class HoldTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->controller->execute()); + $this->assertEquals($this->resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/AddCommentTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/AddCommentTest.php index f8b5c3f44b178aa31b4ddfd0849e558bdb0cbfd2..a72cf068a00b19613db2f7860f36bcfa78923cea 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/AddCommentTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/AddCommentTest.php @@ -265,7 +265,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase $resultRaw->expects($this->once())->method('setContents')->with($response); $this->resultRawFactoryMock->expects($this->once())->method('create')->will($this->returnValue($resultRaw)); - $this->assertSame($resultRaw, $this->controller->execute()); + $this->assertSame($resultRaw, $this->controller->executeInternal()); } /** @@ -288,7 +288,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($this->resultJsonMock)); $this->resultJsonMock->expects($this->once())->method('setData')->with($response); - $this->assertSame($this->resultJsonMock, $this->controller->execute()); + $this->assertSame($this->resultJsonMock, $this->controller->executeInternal()); } /** @@ -310,6 +310,6 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($this->resultJsonMock)); $this->resultJsonMock->expects($this->once())->method('setData')->with($response); - $this->assertSame($this->resultJsonMock, $this->controller->execute()); + $this->assertSame($this->resultJsonMock, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CancelTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CancelTest.php index 689d7efa270a73ffb545ed41e6e2968b6d38bb64..9190aefc128265b242908c3d287ce6d762c4b35f 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CancelTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CancelTest.php @@ -226,7 +226,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } /** @@ -263,7 +263,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultForward)); - $this->assertSame($resultForward, $this->controller->execute()); + $this->assertSame($resultForward, $this->controller->executeInternal()); } /** @@ -319,7 +319,7 @@ class CancelTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } /** @@ -375,6 +375,6 @@ class CancelTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CaptureTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CaptureTest.php index c0e86d79f3481f0e56036263f56abad74a1f7e01..e1e759a8cdd38e9acdb9d081a6a2250eaefde2cf 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CaptureTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/CaptureTest.php @@ -244,7 +244,7 @@ class CaptureTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } /** @@ -280,7 +280,7 @@ class CaptureTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultForward)); - $this->assertSame($resultForward, $this->controller->execute()); + $this->assertSame($resultForward, $this->controller->executeInternal()); } /** @@ -339,7 +339,7 @@ class CaptureTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } /** @@ -399,6 +399,6 @@ class CaptureTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/NewActionTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/NewActionTest.php index 5beb118dda9e4c9c6c1466ce8bf2bce9ebeede89..7ddb6084b1db573394e2ceff0216f092f2faefd1 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/NewActionTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/NewActionTest.php @@ -285,7 +285,7 @@ class NewActionTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($this->resultPageMock)); - $this->assertSame($this->resultPageMock, $this->controller->execute()); + $this->assertSame($this->resultPageMock, $this->controller->executeInternal()); } public function testExecuteNoOrder() @@ -329,6 +329,6 @@ class NewActionTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/PrintActionTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/PrintActionTest.php index 223e5e4311ea89988bf543a09e4739620a017c88..4ac90b4c26b9673060fda421808f746f9a7ddd9c 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/PrintActionTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/PrintActionTest.php @@ -147,6 +147,6 @@ class PrintActionTest extends \PHPUnit_Framework_TestCase ->with('Magento\Framework\Stdlib\DateTime\DateTime') ->willReturn($dateTimeMock); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/SaveTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/SaveTest.php index 619b6b0bbba4b665a6c426a48585f99d76f5e22a..9d21a5e3027995cb9b0040497a37d6b88ff207d5 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/SaveTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/SaveTest.php @@ -128,6 +128,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('sales/order/index') ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->controller->execute()); + $this->assertEquals($redirectMock, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/UpdateQtyTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/UpdateQtyTest.php index 2be9749e0c70ccbc544a248202bf75a5b12bcaa3..b3356c971a979a0dfb0d0c81d8b36255cdfc6619 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/UpdateQtyTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/UpdateQtyTest.php @@ -257,7 +257,7 @@ class UpdateQtyTest extends \PHPUnit_Framework_TestCase $this->resultRawFactoryMock->expects($this->once())->method('create')->will($this->returnValue($resultRaw)); - $this->assertSame($resultRaw, $this->controller->execute()); + $this->assertSame($resultRaw, $this->controller->executeInternal()); } /** @@ -300,7 +300,7 @@ class UpdateQtyTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultJsonMock)); - $this->assertSame($resultJsonMock, $this->controller->execute()); + $this->assertSame($resultJsonMock, $this->controller->executeInternal()); } /** @@ -343,6 +343,6 @@ class UpdateQtyTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultJsonMock)); - $this->assertSame($resultJsonMock, $this->controller->execute()); + $this->assertSame($resultJsonMock, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/ViewTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/ViewTest.php index edb47e37f44f6ec75db8f82559ceccab8863ac66..af2d51618d91f8081c7907821f91804f39b27086 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/ViewTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/ViewTest.php @@ -244,7 +244,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($this->resultPageMock)); - $this->assertSame($this->resultPageMock, $this->controller->execute()); + $this->assertSame($this->resultPageMock, $this->controller->executeInternal()); } public function testExecuteNoInvoice() @@ -278,6 +278,6 @@ class ViewTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultForward)); - $this->assertSame($resultForward, $this->controller->execute()); + $this->assertSame($resultForward, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/VoidTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/VoidTest.php index c2bfc012aa69e7e1a03f44297f717a52c41fd70a..a4b638984573cf5bd605417c730355355c1680e4 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/VoidTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Invoice/VoidTest.php @@ -255,7 +255,7 @@ class VoidTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } /** @@ -297,7 +297,7 @@ class VoidTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultForward)); - $this->assertSame($resultForward, $this->controller->execute()); + $this->assertSame($resultForward, $this->controller->executeInternal()); } /** @@ -354,6 +354,6 @@ class VoidTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValue($resultRedirect)); - $this->assertSame($resultRedirect, $this->controller->execute()); + $this->assertSame($resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassCancelTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassCancelTest.php index 40a5b450f042d308196b27fde855f6efe1838739..aa9ed541fad34e856b1baa40008033578a9d765d 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassCancelTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassCancelTest.php @@ -215,7 +215,7 @@ class MassCancelTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } /** @@ -259,7 +259,7 @@ class MassCancelTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } /** @@ -287,6 +287,6 @@ class MassCancelTest extends \PHPUnit_Framework_TestCase ->method('addError') ->with('Can not cancel'); - $this->massAction->execute(); + $this->massAction->executeInternal(); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassHoldTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassHoldTest.php index 5c4d78706854baaba2625c1eda874f96391a71e6..440d0dda48f79ea4ab79545d6def6bbce75d823a 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassHoldTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassHoldTest.php @@ -217,7 +217,7 @@ class MassHoldTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } public function testExecuteNoOrdersPutOnHold() @@ -257,6 +257,6 @@ class MassHoldTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassUnholdTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassUnholdTest.php index 127ccc343ae2d3793e8eda9ecca7ea83b70b5516..781834d3a1bf1618a5e9f7edc83a5fedecdff89c 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassUnholdTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/MassUnholdTest.php @@ -212,7 +212,7 @@ class MassUnholdTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } public function testExecuteNoReleasedOrderFromHold() @@ -251,6 +251,6 @@ class MassUnholdTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->massAction->execute(); + $this->massAction->executeInternal(); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ReviewPaymentTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ReviewPaymentTest.php index 866c083c049a9e8398aa675626bb2cf5113b1436..2fd32794370f6f259517f8449a98f8619e71bfad 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ReviewPaymentTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ReviewPaymentTest.php @@ -163,7 +163,7 @@ class ReviewPaymentTest extends \PHPUnit_Framework_TestCase ->with('sales/order/view') ->willReturnSelf(); - $result = $this->reviewPayment->execute(); + $result = $this->reviewPayment->executeInternal(); $this->assertEquals($this->resultRedirectMock, $result); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/UnholdTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/UnholdTest.php index 1dbf1baafa60d52ff06a74a8058d3224f0499b48..e25884e837a1a171fbe95e96d49a5e2bcf97d42f 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/UnholdTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/UnholdTest.php @@ -137,6 +137,6 @@ class UnholdTest extends \PHPUnit_Framework_TestCase ->with('sales/*/') ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->controller->execute()); + $this->assertEquals($this->resultRedirect, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ViewTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ViewTest.php index 3037e323da0ce54a9907841ccff2a6197387eb7c..fdbd6bf306e2b0665f3557cd3593dba859c358be 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ViewTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/ViewTest.php @@ -167,7 +167,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase } /** - * @covers \Magento\Sales\Controller\Adminhtml\Order\View::execute + * @covers \Magento\Sales\Controller\Adminhtml\Order\View::executeInternal */ public function testExecute() { @@ -197,12 +197,12 @@ class ViewTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Page', - $this->viewAction->execute() + $this->viewAction->executeInternal() ); } /** - * @covers \Magento\Sales\Controller\Adminhtml\Order\View::execute + * @covers \Magento\Sales\Controller\Adminhtml\Order\View::executeInternal */ public function testExecuteNoOrder() { @@ -224,12 +224,12 @@ class ViewTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->viewAction->execute() + $this->viewAction->executeInternal() ); } /** - * @covers \Magento\Sales\Controller\Adminhtml\Order\View::execute + * @covers \Magento\Sales\Controller\Adminhtml\Order\View::executeInternal */ public function testGlobalException() { @@ -253,7 +253,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', - $this->viewAction->execute() + $this->viewAction->executeInternal() ); } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Download/DownloadCustomOptionTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Download/DownloadCustomOptionTest.php index 629cb0ce5eb719d426c721cffb640af8a6d9059e..0299f4841761b6837279bc1c07a2662a688a772f 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Download/DownloadCustomOptionTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Download/DownloadCustomOptionTest.php @@ -209,7 +209,7 @@ class DownloadCustomOptionTest extends \PHPUnit_Framework_TestCase $this->objectMock->expects($this->once())->method('endExecute')->willReturn(true); } - $this->objectMock->execute(); + $this->objectMock->executeInternal(); } public function executeDataProvider() @@ -329,6 +329,6 @@ class DownloadCustomOptionTest extends \PHPUnit_Framework_TestCase $this->resultForwardMock->expects($this->once())->method('forward')->with('noroute')->willReturn(true); - $this->objectMock->execute(); + $this->objectMock->executeInternal(); } } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Guest/ViewTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Guest/ViewTest.php index 78aa59f9eedaadb4c2fd51ba6b4d906e5f6e6f2c..dbe89bc05333b475ac61a7dcc05976a9533d8bd7 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Guest/ViewTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Guest/ViewTest.php @@ -103,7 +103,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase ->method('getBreadcrumbs') ->with($this->resultPageMock); - $this->assertSame($this->resultPageMock, $this->viewController->execute()); + $this->assertSame($this->resultPageMock, $this->viewController->executeInternal()); } /** @@ -116,6 +116,6 @@ class ViewTest extends \PHPUnit_Framework_TestCase ->with($this->requestMock) ->willReturn($this->resultRedirectMock); - $this->assertSame($this->resultRedirectMock, $this->viewController->execute()); + $this->assertSame($this->resultRedirectMock, $this->viewController->executeInternal()); } } diff --git a/app/code/Magento/Sales/Test/Unit/Helper/GuestTest.php b/app/code/Magento/Sales/Test/Unit/Helper/GuestTest.php index 208fc66106dfbf91b2044c7c4b54b0f61a37dfab..6772ac7276d6895cf3b817333ae42e68b8724dc9 100644 --- a/app/code/Magento/Sales/Test/Unit/Helper/GuestTest.php +++ b/app/code/Magento/Sales/Test/Unit/Helper/GuestTest.php @@ -3,15 +3,12 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Sales\Test\Unit\Helper; -use \Magento\Sales\Helper\Guest; - +use Magento\Sales\Helper\Guest; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; /** - * Class GuestTest * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class GuestTest extends \PHPUnit_Framework_TestCase @@ -49,6 +46,12 @@ class GuestTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $viewInterfaceMock; + /** @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject */ + protected $storeModelMock; + + /** @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject */ + protected $salesOrderMock; + protected function setUp() { $this->appContextHelperMock = $this->getMock('Magento\Framework\App\Helper\Context', [], [], '', false); @@ -66,6 +69,19 @@ class GuestTest extends \PHPUnit_Framework_TestCase $this->managerInterfaceMock = $this->getMock('Magento\Framework\Message\ManagerInterface'); $this->orderFactoryMock = $this->getMock('Magento\Sales\Model\OrderFactory', ['create'], [], '', false); $this->viewInterfaceMock = $this->getMock('Magento\Framework\App\ViewInterface'); + $this->storeModelMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + $this->salesOrderMock = $this->getMock( + 'Magento\Sales\Model\Order', + [ + 'getProtectCode', 'loadByIncrementIdAndStoreId', 'loadByIncrementId', + 'getId', 'getBillingAddress', '__wakeup' + ], + [], + '', + false + ); $this->objectManagerHelper = new ObjectManagerHelper($this); $this->guest = $this->objectManagerHelper->getObject( @@ -86,8 +102,6 @@ class GuestTest extends \PHPUnit_Framework_TestCase public function testLoadValidOrderNotEmptyPost() { - $this->sessionMock->expects($this->once())->method('isLoggedIn')->will($this->returnValue(false)); - $post = [ 'oar_order_id' => 1, 'oar_type' => 'email', @@ -96,20 +110,17 @@ class GuestTest extends \PHPUnit_Framework_TestCase 'oar_zip' => 'oar_zip', ]; + $storeId = '1'; $incrementId = $post['oar_order_id']; + $protectedCode = 'protectedCode'; + $this->sessionMock->expects($this->once())->method('isLoggedIn')->willReturn(false); $requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); - $requestMock->expects($this->once())->method('getPostValue')->will($this->returnValue($post)); - - $orderMock = $this->getMock( - 'Magento\Sales\Model\Order', - ['getProtectCode', 'loadByIncrementId', 'getId', 'getBillingAddress', '__wakeup'], - [], - '', - false - ); - $this->orderFactoryMock->expects($this->once())->method('create')->will($this->returnValue($orderMock)); - $orderMock->expects($this->once())->method('loadByIncrementId')->with($incrementId); - $orderMock->expects($this->exactly(2))->method('getId')->will($this->returnValue($incrementId)); + $requestMock->expects($this->once())->method('getPostValue')->willReturn($post); + $this->storeManagerInterfaceMock->expects($this->once())->method('getStore')->willReturn($this->storeModelMock); + $this->storeModelMock->expects($this->once())->method('getId')->willReturn($storeId); + $this->orderFactoryMock->expects($this->once())->method('create')->willReturn($this->salesOrderMock); + $this->salesOrderMock->expects($this->once())->method('loadByIncrementIdAndStoreId')->willReturnSelf(); + $this->salesOrderMock->expects($this->any())->method('getId')->willReturn($incrementId); $billingAddressMock = $this->getMock( 'Magento\Sales\Model\Order\Address', @@ -118,15 +129,10 @@ class GuestTest extends \PHPUnit_Framework_TestCase '', false ); - $billingAddressMock->expects($this->once())->method('getLastname')->will( - $this->returnValue($post['oar_billing_lastname']) - ); - $billingAddressMock->expects($this->once())->method('getEmail')->will( - $this->returnValue($post['oar_email']) - ); - $orderMock->expects($this->once())->method('getBillingAddress')->will($this->returnValue($billingAddressMock)); - $protectedCode = 'protectedCode'; - $orderMock->expects($this->once())->method('getProtectCode')->will($this->returnValue($protectedCode)); + $billingAddressMock->expects($this->once())->method('getLastname')->willReturn(($post['oar_billing_lastname'])); + $billingAddressMock->expects($this->once())->method('getEmail')->willReturn(($post['oar_email'])); + $this->salesOrderMock->expects($this->once())->method('getBillingAddress')->willReturn($billingAddressMock); + $this->salesOrderMock->expects($this->once())->method('getProtectCode')->willReturn($protectedCode); $metaDataMock = $this->getMock( 'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata', [], @@ -134,17 +140,16 @@ class GuestTest extends \PHPUnit_Framework_TestCase '', false ); - $metaDataMock->expects($this->once()) - ->method('setPath') + $metaDataMock->expects($this->once())->method('setPath') ->with(Guest::COOKIE_PATH) - ->will($this->returnSelf()); + ->willReturnSelf(); $metaDataMock->expects($this->once()) ->method('setHttpOnly') ->with(true) - ->will($this->returnSelf()); + ->willReturnSelf(); $this->cookieMetadataFactoryMock->expects($this->once()) ->method('createPublicCookieMetadata') - ->will($this->returnValue($metaDataMock)); + ->willReturn($metaDataMock); $this->cookieManagerMock->expects($this->once()) ->method('setPublicCookie') ->with(Guest::COOKIE_NAME, $this->anything(), $metaDataMock); @@ -153,26 +158,22 @@ class GuestTest extends \PHPUnit_Framework_TestCase public function testLoadValidOrderStoredCookie() { - $this->sessionMock->expects($this->once())->method('isLoggedIn')->will($this->returnValue(false)); - $orderMock = $this->getMock( - 'Magento\Sales\Model\Order', - ['getProtectCode', 'loadByIncrementId', 'getId', 'getBillingAddress', '__wakeup'], - [], - '', - false - ); $protectedCode = 'protectedCode'; $incrementId = 1; $cookieData = $protectedCode . ':' . $incrementId; $cookieDataHash = base64_encode($cookieData); - $this->orderFactoryMock->expects($this->once())->method('create')->will($this->returnValue($orderMock)); - - $this->cookieManagerMock->expects($this->once())->method('getCookie')->with(Guest::COOKIE_NAME)->will( - $this->returnValue($cookieDataHash) - ); - $orderMock->expects($this->once())->method('loadByIncrementId')->with($incrementId); - $orderMock->expects($this->exactly(1))->method('getId')->will($this->returnValue($incrementId)); - $orderMock->expects($this->once())->method('getProtectCode')->will($this->returnValue($protectedCode)); + $this->sessionMock->expects($this->once())->method('isLoggedIn')->willReturn(false); + $this->orderFactoryMock->expects($this->once())->method('create')->willReturn($this->salesOrderMock); + $this->cookieManagerMock->expects($this->once()) + ->method('getCookie') + ->with(Guest::COOKIE_NAME) + ->willReturn($cookieDataHash); + $this->salesOrderMock->expects($this->once()) + ->method('loadByIncrementId') + ->with($incrementId) + ->willReturnSelf(); + $this->salesOrderMock->expects($this->exactly(1))->method('getId')->willReturn($incrementId); + $this->salesOrderMock->expects($this->once())->method('getProtectCode')->willReturn($protectedCode); $metaDataMock = $this->getMock( 'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata', [], @@ -183,18 +184,17 @@ class GuestTest extends \PHPUnit_Framework_TestCase $metaDataMock->expects($this->once()) ->method('setPath') ->with(Guest::COOKIE_PATH) - ->will($this->returnSelf()); + ->willReturnSelf(); $metaDataMock->expects($this->once()) ->method('setHttpOnly') ->with(true) - ->will($this->returnSelf()); + ->willReturnSelf(); $this->cookieMetadataFactoryMock->expects($this->once()) ->method('createPublicCookieMetadata') - ->will($this->returnValue($metaDataMock)); + ->willReturn($metaDataMock); $this->cookieManagerMock->expects($this->once()) ->method('setPublicCookie') ->with(Guest::COOKIE_NAME, $this->anything(), $metaDataMock); - $requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); $this->assertTrue($this->guest->loadValidOrder($requestMock)); } diff --git a/app/code/Magento/Sales/Test/Unit/Model/DownloadTest.php b/app/code/Magento/Sales/Test/Unit/Model/DownloadTest.php index e7410b411bfa6de5ca497929115cf224d31f45f6..295981ef91ed16cb6102014764155615ae87b492 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/DownloadTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/DownloadTest.php @@ -39,6 +39,11 @@ class DownloadTest extends \PHPUnit_Framework_TestCase */ protected $writeDirectoryMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $driverMock; + protected function setUp() { $this->writeDirectoryMock = $this->getMockBuilder('Magento\Framework\Filesystem\Directory\Write') @@ -49,9 +54,10 @@ class DownloadTest extends \PHPUnit_Framework_TestCase ->getMock(); $this->filesystemMock->expects($this->any()) ->method('getDirectoryWrite') - ->with(DirectoryList::ROOT) + ->with(DirectoryList::MEDIA) ->will($this->returnValue($this->writeDirectoryMock)); + $this->driverMock = $this->getMockForAbstractClass('Magento\Framework\Filesystem\DriverInterface'); $this->storageMock = $this->getMockBuilder('Magento\MediaStorage\Helper\File\Storage\Database') ->disableOriginalConstructor() ->getMock(); @@ -83,17 +89,23 @@ class DownloadTest extends \PHPUnit_Framework_TestCase } /** - * @expectedException \Exception + * @param $realPatchCheck + * @param $isFile + * @param $isReadable + * @expectedException \Magento\Framework\Exception\LocalizedException + * @dataProvider dataProviderForTestDownloadFileException */ - public function testDownloadFileException() + public function testDownloadFileException($realPatchCheck, $isFile, $isReadable) { $info = ['order_path' => 'test/path', 'quote_path' => 'test/path2', 'title' => 'test title']; - $isFile = true; - $isReadable = false; $this->writeDirectoryMock->expects($this->any()) ->method('getAbsolutePath') ->will($this->returnArgument(0)); + $this->writeDirectoryMock->expects($this->any()) + ->method('getDriver') + ->willReturn($this->driverMock); + $this->driverMock->expects($this->any())->method('getRealPath')->willReturn($realPatchCheck); $this->writeDirectoryMock->expects($this->any()) ->method('isFile') ->will($this->returnValue($isFile)); @@ -104,12 +116,25 @@ class DownloadTest extends \PHPUnit_Framework_TestCase $this->storageFactoryMock->expects($this->any()) ->method('checkDbUsage') ->will($this->returnValue(false)); + $this->httpFileFactoryMock->expects($this->never())->method('create'); $this->model->downloadFile($info); } /** - * @expectedException \Exception + * @return array + */ + public function dataProviderForTestDownloadFileException() + { + return [ + [1, true, false], + [1, false, true], + [false, true, true], + ]; + } + + /** + * @expectedException \Magento\Framework\Exception\LocalizedException */ public function testDownloadFileNoStorage() { @@ -120,6 +145,11 @@ class DownloadTest extends \PHPUnit_Framework_TestCase $this->writeDirectoryMock->expects($this->any()) ->method('getAbsolutePath') ->will($this->returnArgument(0)); + $this->writeDirectoryMock->expects($this->any()) + ->method('getDriver') + ->willReturn($this->driverMock); + $this->driverMock->expects($this->any())->method('getRealPath')->willReturn(true); + $this->writeDirectoryMock->expects($this->any()) ->method('isFile') ->will($this->returnValue($isFile)); @@ -130,9 +160,6 @@ class DownloadTest extends \PHPUnit_Framework_TestCase $this->storageMock->expects($this->any()) ->method('checkDbUsage') ->will($this->returnValue(true)); - $this->storageMock->expects($this->any()) - ->method('getMediaRelativePath') - ->will($this->returnArgument(0)); $storageDatabaseMock = $this->getMockBuilder('Magento\MediaStorage\Model\File\Storage\Database') ->disableOriginalConstructor() @@ -153,6 +180,7 @@ class DownloadTest extends \PHPUnit_Framework_TestCase $this->storageFactoryMock->expects($this->any()) ->method('create') ->will($this->returnValue($storageDatabaseMock)); + $this->httpFileFactoryMock->expects($this->never())->method('create'); $this->model->downloadFile($info); } @@ -178,6 +206,11 @@ class DownloadTest extends \PHPUnit_Framework_TestCase $this->writeDirectoryMock->expects($this->any()) ->method('getAbsolutePath') ->will($this->returnArgument(0)); + $this->writeDirectoryMock->expects($this->any()) + ->method('getDriver') + ->willReturn($this->driverMock); + $this->driverMock->expects($this->any())->method('getRealPath')->willReturn(true); + $this->writeDirectoryMock->expects($this->any()) ->method('isFile') ->will($this->returnValue($isFile)); @@ -195,9 +228,6 @@ class DownloadTest extends \PHPUnit_Framework_TestCase $this->storageMock->expects($this->any()) ->method('checkDbUsage') ->will($this->returnValue(true)); - $this->storageMock->expects($this->any()) - ->method('getMediaRelativePath') - ->will($this->returnArgument(0)); $storageDatabaseMock = $this->getMockBuilder('Magento\MediaStorage\Model\File\Storage\Database') ->disableOriginalConstructor() @@ -220,7 +250,7 @@ class DownloadTest extends \PHPUnit_Framework_TestCase ->with( $info['title'], ['value' => $info['order_path'], 'type' => 'filename'], - DirectoryList::ROOT, + DirectoryList::MEDIA, 'application/octet-stream', null ); diff --git a/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php index 4a2ef97a19764b757f6de4da62500cbfeee27653..0cb9a4dc715765cc8c9311d12218e244e28f0d72 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/InvoiceRepositoryTest.php @@ -148,10 +148,10 @@ class InvoiceRepositoryTest extends \PHPUnit_Framework_TestCase ->method('getFilters') ->willReturn([$filter]); - $criteria = $this->getMockBuilder('Magento\Framework\Api\SearchCriteria') + $searchCriteria = $this->getMockBuilder('Magento\Framework\Api\SearchCriteria') ->disableOriginalConstructor() ->getMock(); - $criteria->expects($this->once()) + $searchCriteria->expects($this->once()) ->method('getFilterGroups') ->willReturn($filterGroups); @@ -166,7 +166,7 @@ class InvoiceRepositoryTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($collection); - $this->assertEquals($collection, $this->invoice->getList($criteria)); + $this->assertEquals($collection, $this->invoice->getList($searchCriteria)); } public function testDelete() diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php index f943f6632225b1c026852e51ebfa4339444a999b..3dd1590bf72ad751cf18fbe81ba1c3951971a052 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/AddressRepositoryTest.php @@ -170,14 +170,14 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase ->method('getFilters') ->willReturn([$filter]); - $criteria = $this->getMock( + $searchCriteria = $this->getMock( 'Magento\Framework\Api\SearchCriteria', ['getFilterGroups'], [], '', false ); - $criteria->expects($this->once()) + $searchCriteria->expects($this->once()) ->method('getFilterGroups') ->willReturn([$filterGroup]); @@ -196,7 +196,7 @@ class AddressRepositoryTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($collection); - $this->assertEquals($collection, $this->subject->getList($criteria)); + $this->assertEquals($collection, $this->subject->getList($searchCriteria)); } public function testDelete() diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php index cba7908dacd42bae57729dfe770587a2708c8f4a..25357bd65177fe791572664736220c8ae59161b1 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/CreditmemoRepositoryTest.php @@ -153,10 +153,10 @@ class CreditmemoRepositoryTest extends \PHPUnit_Framework_TestCase ->method('getFilters') ->willReturn([$filter]); - $criteria = $this->getMockBuilder('Magento\Framework\Api\SearchCriteria') + $searchCriteria = $this->getMockBuilder('Magento\Framework\Api\SearchCriteria') ->disableOriginalConstructor() ->getMock(); - $criteria->expects($this->once()) + $searchCriteria->expects($this->once()) ->method('getFilterGroups') ->willReturn($filterGroups); @@ -171,7 +171,7 @@ class CreditmemoRepositoryTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($collection); - $this->assertEquals($collection, $this->creditmemo->getList($criteria)); + $this->assertEquals($collection, $this->creditmemo->getList($searchCriteria)); } public function testDelete() diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php index e2deb200dbcfcd930ae170dee2cd48819509a8f3..314271c3156963559230464f983dc06f2872e7e1 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/ItemRepositoryTest.php @@ -200,10 +200,10 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase ->method('getFilters') ->willReturn([$filterMock]); - $criteriaMock = $this->getMockBuilder('Magento\Framework\Api\SearchCriteria') + $searchCriteriaMock = $this->getMockBuilder('Magento\Framework\Api\SearchCriteria') ->disableOriginalConstructor() ->getMock(); - $criteriaMock->expects($this->once()) + $searchCriteriaMock->expects($this->once()) ->method('getFilterGroups') ->willReturn([$filterGroupMock]); @@ -230,7 +230,7 @@ class ItemRepositoryTest extends \PHPUnit_Framework_TestCase ->willReturn($searchResultMock); $model = $this->getModel($orderItemMock, $productType); - $this->assertSame($searchResultMock, $model->getList($criteriaMock)); + $this->assertSame($searchResultMock, $model->getList($searchCriteriaMock)); } public function testDeleteById() diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/PaymentTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/PaymentTest.php index 29757fc570f2380410376d09d3ca137062ffad9d..b56c83e38d724a1783f82744e4c53d69846e42d8 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/PaymentTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/PaymentTest.php @@ -17,6 +17,8 @@ use Magento\Sales\Model\Order\Payment\Transaction; */ class PaymentTest extends \PHPUnit_Framework_TestCase { + const TRANSACTION_ID = 'ewr34fM49V0'; + private $mockContext; /** * @var Payment @@ -166,6 +168,7 @@ class PaymentTest extends \PHPUnit_Framework_TestCase 'order', 'isInitializeNeeded', 'initialize', + 'refund' ] ) ->getMock(); @@ -258,7 +261,10 @@ class PaymentTest extends \PHPUnit_Framework_TestCase 'register', 'addComment', 'save', - 'getGrandTotal' + 'getGrandTotal', + 'getBaseGrandTotal', + 'getDoTransaction', + 'getInvoice' ], [], '', @@ -268,7 +274,7 @@ class PaymentTest extends \PHPUnit_Framework_TestCase $this->payment = $this->initPayment(); $this->payment->setMethod('any'); $this->payment->setOrder($this->orderMock); - $this->transactionId = 100; + $this->transactionId = self::TRANSACTION_ID; } protected function tearDown() @@ -825,13 +831,13 @@ class PaymentTest extends \PHPUnit_Framework_TestCase */ protected function mockInvoice($transactionId, $countCall = 1) { - $this->invoiceMock->expects($this->once()) + $this->invoiceMock->expects(static::any()) ->method('getTransactionId') ->willReturn($transactionId); - $this->invoiceMock->expects($this->once()) + $this->invoiceMock->expects(static::any()) ->method('load') ->with($transactionId); - $this->invoiceMock->expects($this->once()) + $this->invoiceMock->expects(static::any()) ->method('getId') ->willReturn($transactionId); $this->orderMock->expects($this->exactly($countCall)) @@ -1314,7 +1320,8 @@ class PaymentTest extends \PHPUnit_Framework_TestCase */ public function testRegisterRefundNotification() { - $message = 'Registered notification about refunded amount of . Transaction ID: "100-refund"'; + $message = 'Registered notification about refunded amount of . Transaction ID: "' . + self::TRANSACTION_ID . '-refund"'; $amount = 50; $grandTotalCreditMemo = 50; $invoiceBaseGrandTotal = 50; @@ -1429,6 +1436,73 @@ class PaymentTest extends \PHPUnit_Framework_TestCase $this->assertEquals($canRefund, $this->payment->canRefund()); } + /** + * @covers \Magento\Sales\Model\Order\Payment::refund() + */ + public function testRefund() + { + $amount = 204.04; + $this->creditMemoMock->expects(static::once()) + ->method('getBaseGrandTotal') + ->willReturn($amount); + $this->creditMemoMock->expects(static::once()) + ->method('getGrandTotal') + ->willReturn($amount); + $this->creditMemoMock->expects(static::once()) + ->method('getDoTransaction') + ->willReturn(true); + + $this->paymentMethodMock->expects(static::once()) + ->method('canRefund') + ->willReturn(true); + + $this->mockInvoice(self::TRANSACTION_ID, 0); + $this->creditMemoMock->expects(static::once()) + ->method('getInvoice') + ->willReturn($this->invoiceMock); + + $captureTranId = self::TRANSACTION_ID . '-' . Transaction::TYPE_CAPTURE; + $captureTransaction = $this->getMockBuilder(Transaction::class) + ->disableOriginalConstructor() + ->setMethods(['getTxnId']) + ->getMock(); + + $refundTranId = $captureTranId . '-' . Transaction::TYPE_REFUND; + $this->transactionManagerMock->expects(static::once()) + ->method('generateTransactionId') + ->willReturn($refundTranId); + $captureTransaction->expects(static::once()) + ->method('getTxnId') + ->willReturn($captureTranId); + $this->transactionRepositoryMock->expects(static::once()) + ->method('getByTransactionId') + ->willReturn($captureTransaction); + + $this->paymentMethodMock->expects(static::once()) + ->method('refund') + ->with($this->payment, $amount); + + $isOnline = true; + $this->getTransactionBuilderMock([], $isOnline, Transaction::TYPE_REFUND, $refundTranId); + + $this->currencyMock->expects(static::once()) + ->method('formatTxt') + ->willReturn($amount); + $this->orderMock->expects(static::once()) + ->method('getBaseCurrency') + ->willReturn($this->currencyMock); + + $status = 'status'; + $message = 'We refunded ' . $amount . ' online. Transaction ID: "' . $refundTranId . '"'; + $this->mockGetDefaultStatus(Order::STATE_PROCESSING, $status); + $this->assertOrderUpdated(Order::STATE_PROCESSING, $status, $message); + + static::assertSame($this->payment, $this->payment->refund($this->creditMemoMock)); + static::assertEquals($amount, $this->payment->getData('amount_refunded')); + static::assertEquals($amount, $this->payment->getData('base_amount_refunded_online')); + static::assertEquals($amount, $this->payment->getData('base_amount_refunded')); + } + public function boolProvider() { return [ @@ -1437,6 +1511,36 @@ class PaymentTest extends \PHPUnit_Framework_TestCase ]; } + /** + * @covers \Magento\Sales\Model\Order\Payment::isCaptureFinal() + * @return void + */ + public function testIsCaptureFinal() + { + $amount = 23.02; + $partialAmount = 12.00; + + $this->orderMock->expects(static::exactly(2)) + ->method('getTotalDue') + ->willReturn($amount); + + static::assertFalse($this->payment->isCaptureFinal($partialAmount)); + static::assertTrue($this->payment->isCaptureFinal($amount)); + } + + /** + * @covers \Magento\Sales\Model\Order\Payment::getShouldCloseParentTransaction() + * @return void + */ + public function testGetShouldCloseParentTransaction() + { + $this->payment->setShouldCloseParentTransaction(1); + static::assertTrue($this->payment->getShouldCloseParentTransaction()); + + $this->payment->setShouldCloseParentTransaction(0); + static::assertFalse($this->payment->getShouldCloseParentTransaction()); + } + protected function initPayment() { return (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php index 50407a1fbd1cf0c7d05110291aa5309eb0213d0f..b00d3207cf4ae6cf958410f3b470a18d6407b0f4 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/ReaderTest.php @@ -74,7 +74,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->_schemaLocator = new \Magento\Sales\Model\Order\Pdf\Config\SchemaLocator($moduleReader); $this->_validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $this->_validationState->expects($this->once())->method('isValidated')->will($this->returnValue(false)); + $this->_validationState->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(false); $this->_model = new \Magento\Sales\Model\Order\Pdf\Config\Reader( $this->_fileResolverMock, diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/XsdTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/XsdTest.php index df9683026fa7b298b8f7628cf1b8e4619e3957bc..01fe130398cb291a741c059f81d1b3ee98e6a6a4 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/XsdTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Pdf/Config/XsdTest.php @@ -55,7 +55,10 @@ class XsdTest extends \PHPUnit_Framework_TestCase */ protected function _testSchema($schema, $fixtureXml, array $expectedErrors) { - $dom = new \Magento\Framework\Config\Dom($fixtureXml, [], null, null, '%message%'); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, '%message%'); $actualResult = $dom->validate($schema, $actualErrors); $this->assertEquals(empty($expectedErrors), $actualResult); $this->assertEquals($expectedErrors, $actualErrors); diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php index 36a8360ee094fbf2c05b70ed871492d1b0b0d25b..f76732578da21856a34ef5a9edee3011256dd831 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/ShipmentRepositoryTest.php @@ -170,14 +170,14 @@ class ShipmentRepositoryTest extends \PHPUnit_Framework_TestCase ->method('getFilters') ->willReturn([$filter]); - $criteria = $this->getMock( + $searchCriteria = $this->getMock( 'Magento\Framework\Api\SearchCriteria', ['getFilterGroups'], [], '', false ); - $criteria->expects($this->once()) + $searchCriteria->expects($this->once()) ->method('getFilterGroups') ->willReturn([$filterGroup]); @@ -196,7 +196,7 @@ class ShipmentRepositoryTest extends \PHPUnit_Framework_TestCase ->method('create') ->willReturn($collection); - $this->assertEquals($collection, $this->subject->getList($criteria)); + $this->assertEquals($collection, $this->subject->getList($searchCriteria)); } public function testDelete() diff --git a/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php b/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php index e334be584109f0df3fda0bb7d0ef2c62296107f6..7ed438f3ce7f129fbec4fd2d61723d6ff17803b4 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/OrderTest.php @@ -5,8 +5,7 @@ */ namespace Magento\Sales\Test\Unit\Model; -use \Magento\Sales\Model\Order; - +use Magento\Sales\Model\Order; use Magento\Sales\Model\ResourceModel\Order\Status\History\CollectionFactory as HistoryCollectionFactory; /** @@ -54,6 +53,16 @@ class OrderTest extends \PHPUnit_Framework_TestCase */ protected $priceCurrency; + /** + * @var \Magento\Sales\Model\ResourceModel\Order\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $salesOrderCollectionFactoryMock; + + /** + * @var \Magento\Sales\Model\ResourceModel\Order\Collection|\PHPUnit_Framework_MockObject_MockObject + */ + protected $salesOrderCollectionMock; + protected function setUp() { $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -78,6 +87,13 @@ class OrderTest extends \PHPUnit_Framework_TestCase '', false ); + $this->salesOrderCollectionFactoryMock = $this->getMock( + 'Magento\Sales\Model\ResourceModel\Order\CollectionFactory', + ['create'], + [], + '', + false + ); $this->item = $this->getMock( 'Magento\Sales\Model\ResourceModel\Order\Item', ['isDeleted', 'getQtyToInvoice', 'getParentItemId', 'getQuoteItemId', 'getLockedDoInvoice'], @@ -85,6 +101,10 @@ class OrderTest extends \PHPUnit_Framework_TestCase '', false ); + $this->salesOrderCollectionMock = $this->getMockBuilder('Magento\Sales\Model\ResourceModel\Order\Collection') + ->disableOriginalConstructor() + ->setMethods(['addFieldToFilter', 'load', 'getFirstItem']) + ->getMock(); $collection = $this->getMock('Magento\Sales\Model\ResourceModel\Order\Item\Collection', [], [], '', false); $collection->expects($this->any()) ->method('setOrderFilter') @@ -121,6 +141,7 @@ class OrderTest extends \PHPUnit_Framework_TestCase 'data' => ['increment_id' => $this->incrementId], 'context' => $context, 'historyCollectionFactory' => $this->historyCollectionFactoryMock, + 'salesOrderCollectionFactory' => $this->salesOrderCollectionFactoryMock, 'priceCurrency' => $this->priceCurrency ] ); @@ -722,6 +743,20 @@ class OrderTest extends \PHPUnit_Framework_TestCase } } + public function testLoadByIncrementIdAndStoreId() + { + $incrementId = '000000001'; + $storeId = '2'; + $this->salesOrderCollectionFactoryMock + ->expects($this->once()) + ->method('create') + ->willReturn($this->salesOrderCollectionMock); + $this->salesOrderCollectionMock->expects($this->any())->method('addFieldToFilter')->willReturnSelf(); + $this->salesOrderCollectionMock->expects($this->once())->method('load')->willReturnSelf(); + $this->salesOrderCollectionMock->expects($this->once())->method('getFirstItem')->willReturn($this->order); + $this->assertSame($this->order, $this->order->loadByIncrementIdAndStoreId($incrementId, $storeId)); + } + public function notInvoicingStatesProvider() { return [ diff --git a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Order/AddressTest.php b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Order/AddressTest.php index ffeb136782b1ce1b16873f54caa70ce3a1dbbb88..8ac891f47b43efca38e9efae9abf6e217fdb7fea 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Order/AddressTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Order/AddressTest.php @@ -40,11 +40,6 @@ class AddressTest extends \PHPUnit_Framework_TestCase */ protected $validatorMock; - /** - * @var \Magento\Sales\Model\ResourceModel\GridPool|\PHPUnit_Framework_MockObject_MockObject - */ - protected $gridPoolMock; - /** * @var \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot|\PHPUnit_Framework_MockObject_MockObject */ @@ -87,13 +82,6 @@ class AddressTest extends \PHPUnit_Framework_TestCase '', false ); - $this->gridPoolMock = $this->getMock( - 'Magento\Sales\Model\ResourceModel\GridPool', - ['refreshByOrderId'], - [], - '', - false - ); $this->entitySnapshotMock = $this->getMock( 'Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot', [], @@ -117,7 +105,6 @@ class AddressTest extends \PHPUnit_Framework_TestCase [ 'resource' => $this->appResourceMock, 'validator' => $this->validatorMock, - 'gridPool' => $this->gridPoolMock, 'entitySnapshot' => $this->entitySnapshotMock ] ); @@ -136,13 +123,9 @@ class AddressTest extends \PHPUnit_Framework_TestCase ->method('isModified') ->with($this->addressMock) ->willReturn(true); - $this->addressMock->expects($this->exactly(3)) + $this->addressMock->expects($this->once()) ->method('getParentId') ->will($this->returnValue(1)); - $this->gridPoolMock->expects($this->once()) - ->method('refreshByOrderId') - ->with($this->equalTo(1)) - ->will($this->returnSelf()); $this->addressResource->save($this->addressMock); } diff --git a/app/code/Magento/Sales/Test/Unit/Model/Service/OrderServiceTest.php b/app/code/Magento/Sales/Test/Unit/Model/Service/OrderServiceTest.php index dfbdd79bd337339cb1f54292df1f8c7ee3a36dd3..71a4bf2c0bb4819087bfeb07aa9a615a6d976545 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Service/OrderServiceTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Service/OrderServiceTest.php @@ -14,51 +14,67 @@ class OrderServiceTest extends \PHPUnit_Framework_TestCase * @var \Magento\Sales\Model\Service\OrderService */ protected $orderService; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Api\OrderRepositoryInterface */ protected $orderRepositoryMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Api\OrderStatusHistoryRepositoryInterface */ protected $orderStatusHistoryRepositoryMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\SearchCriteriaBuilder */ protected $searchCriteriaBuilderMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\SearchCriteria */ protected $searchCriteriaMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\FilterBuilder */ protected $filterBuilderMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Api\Filter */ protected $filterMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Model\OrderNotifier */ protected $orderNotifierMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Model\Order */ protected $orderMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Model\Order\Status\History */ protected $orderStatusHistoryMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Api\Data\OrderStatusHistorySearchResultInterface */ protected $orderSearchResultMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Event\ManagerInterface */ protected $eventManagerMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Model\Order\Email\Sender\OrderCommentSender + */ + protected $orderCommentSender; + protected function setUp() { $this->orderRepositoryMock = $this->getMockBuilder( @@ -116,13 +132,20 @@ class OrderServiceTest extends \PHPUnit_Framework_TestCase ) ->disableOriginalConstructor() ->getMock(); + $this->orderCommentSender = $this->getMockBuilder( + 'Magento\Sales\Model\Order\Email\Sender\OrderCommentSender' + ) + ->disableOriginalConstructor() + ->getMock(); + $this->orderService = new \Magento\Sales\Model\Service\OrderService( $this->orderRepositoryMock, $this->orderStatusHistoryRepositoryMock, $this->searchCriteriaBuilderMock, $this->filterBuilderMock, $this->orderNotifierMock, - $this->eventManagerMock + $this->eventManagerMock, + $this->orderCommentSender ); } @@ -174,6 +197,7 @@ class OrderServiceTest extends \PHPUnit_Framework_TestCase public function testAddComment() { + $clearComment = "Comment text here..."; $this->orderRepositoryMock->expects($this->once()) ->method('get') ->with(123) @@ -182,10 +206,16 @@ class OrderServiceTest extends \PHPUnit_Framework_TestCase ->method('addStatusHistory') ->with($this->orderStatusHistoryMock) ->willReturn($this->orderMock); + $this->orderStatusHistoryMock->expects($this->once()) + ->method('getComment') + ->willReturn("<h1>" . $clearComment); $this->orderRepositoryMock->expects($this->once()) ->method('save') ->with($this->orderMock) ->willReturn([]); + $this->orderCommentSender->expects($this->once()) + ->method('send') + ->with($this->orderMock, false, $clearComment); $this->assertTrue($this->orderService->addComment(123, $this->orderStatusHistoryMock)); } diff --git a/app/code/Magento/Sales/Test/Unit/Observer/GridProcessAddressChangeTest.php b/app/code/Magento/Sales/Test/Unit/Observer/GridProcessAddressChangeTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d6a8e5fab14f400a59d72ecf75aaddfe313577b6 --- /dev/null +++ b/app/code/Magento/Sales/Test/Unit/Observer/GridProcessAddressChangeTest.php @@ -0,0 +1,51 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Sales\Test\Unit\Observer; + +/** + * Class GridProcessAddressChangeTest + */ +class GridProcessAddressChangeTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Sales\Observer\GridProcessAddressChange + */ + protected $observer; + + /** + * @var \Magento\Sales\Model\ResourceModel\GridPool|\PHPUnit_Framework_MockObject_MockObject + */ + protected $gridPoolMock; + + /** + * @var \Magento\Framework\Event\ObserverInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $eventObserverMock; + + public function setUp() + { + $this->gridPoolMock = $this->getMockBuilder('Magento\Sales\Model\ResourceModel\GridPool') + ->disableOriginalConstructor() + ->getMock(); + $this->eventObserverMock = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods(['getOrderId']) + ->getMock(); + $this->observer = new \Magento\Sales\Observer\GridProcessAddressChange($this->gridPoolMock); + } + + public function testGridsReindex() + { + $this->eventObserverMock->expects($this->once()) + ->method('getOrderId') + ->willReturn(100500); + $this->gridPoolMock->expects($this->once()) + ->method('refreshByOrderId') + ->with(100500); + $this->assertNull($this->observer->execute($this->eventObserverMock)); + } +} diff --git a/app/code/Magento/Sales/etc/events.xml b/app/code/Magento/Sales/etc/events.xml index f02fcdd77a5bcfc8b4fdbce4414cb6c7f6886759..4dfe0d47c9c9a02372868b2602a6b4f3f0e2fcb3 100644 --- a/app/code/Magento/Sales/etc/events.xml +++ b/app/code/Magento/Sales/etc/events.xml @@ -33,6 +33,9 @@ <event name="sales_order_creditmemo_delete_after"> <observer name="sales_grid_order_creditmemo_sync_remove" instance="SalesCreditmemoIndexGridSyncRemove" /> </event> + <event name="admin_sales_order_address_update"> + <observer name="sales_grid_admin_refresh_grids" instance="Magento\Sales\Observer\GridProcessAddressChange" /> + </event> <event name="config_data_dev_grid_async_indexing_disabled"> <observer name="sales_grid_order_async_insert" instance="SalesOrderIndexGridAsyncInsertObserver" /> <observer name="sales_grid_order_invoice_async_insert" instance="SalesInvoiceIndexGridAsyncInsertObserver" /> diff --git a/app/code/Magento/Sales/i18n/de_DE.csv b/app/code/Magento/Sales/i18n/de_DE.csv index 8cd4ff0cf4df0f2a0f1a19dd8cd76501b258800c..736a5f91b8f7bdff46c575f58cef97634cc23241 100644 --- a/app/code/Magento/Sales/i18n/de_DE.csv +++ b/app/code/Magento/Sales/i18n/de_DE.csv @@ -679,3 +679,4 @@ order-header,order-header "State Code and Title","State Code and Title" "PDF Packing Slips","PDF Packzettel" "Status can't be unassigned, because it is used by existing order(s).","Status can't be unassigned, because it is used by existing order(s)." +Operations,Operations diff --git a/app/code/Magento/Sales/i18n/en_US.csv b/app/code/Magento/Sales/i18n/en_US.csv index 56fadf4515509308f95b77540604dc5f2d71d75a..5970b2ff82e61180ca857b984033987e748a25c1 100644 --- a/app/code/Magento/Sales/i18n/en_US.csv +++ b/app/code/Magento/Sales/i18n/en_US.csv @@ -679,3 +679,4 @@ order-header,order-header "State Code and Title","State Code and Title" "PDF Packing Slips","PDF Packing Slips" "Status can't be unassigned, because it is used by existing order(s).","Status can't be unassigned, because it is used by existing order(s)." +Operations,Operations diff --git a/app/code/Magento/Sales/i18n/es_ES.csv b/app/code/Magento/Sales/i18n/es_ES.csv index b14dd0c68fcbf24da272a1ee87d018e6707d71b7..d524aad0e94bab691f993b401f27bab7eaf89dd9 100644 --- a/app/code/Magento/Sales/i18n/es_ES.csv +++ b/app/code/Magento/Sales/i18n/es_ES.csv @@ -679,3 +679,4 @@ order-header,order-header "State Code and Title","State Code and Title" "PDF Packing Slips","Albaranes en PDF" "Status can't be unassigned, because it is used by existing order(s).","Status can't be unassigned, because it is used by existing order(s)." +Operations,Operations diff --git a/app/code/Magento/Sales/i18n/fr_FR.csv b/app/code/Magento/Sales/i18n/fr_FR.csv index d56acf87271da135c373d7758235de4e1dd3a419..e6ee0ec1c4a3f222b700b3a69b8608483fcea766 100644 --- a/app/code/Magento/Sales/i18n/fr_FR.csv +++ b/app/code/Magento/Sales/i18n/fr_FR.csv @@ -679,3 +679,4 @@ order-header,order-header "State Code and Title","State Code and Title" "PDF Packing Slips","Bons de livraison PDF" "Status can't be unassigned, because it is used by existing order(s).","Status can't be unassigned, because it is used by existing order(s)." +Operations,Operations diff --git a/app/code/Magento/Sales/i18n/nl_NL.csv b/app/code/Magento/Sales/i18n/nl_NL.csv index 8018624c475f507c9340145fd0b3b6b1f607e03f..1675d096d63af089cbc00fdadaf6521edde2f1b3 100644 --- a/app/code/Magento/Sales/i18n/nl_NL.csv +++ b/app/code/Magento/Sales/i18n/nl_NL.csv @@ -679,3 +679,4 @@ order-header,order-header "State Code and Title","State Code and Title" "PDF Packing Slips","PDF Packing Slips" "Status can't be unassigned, because it is used by existing order(s).","Status can't be unassigned, because it is used by existing order(s)." +Operations,Operations diff --git a/app/code/Magento/Sales/i18n/pt_BR.csv b/app/code/Magento/Sales/i18n/pt_BR.csv index ffba7bb166d6bd8f27bbbe74f2d1a791a88cec8e..41380ea687d54ada86ccbf21d77d50d9f14ae801 100644 --- a/app/code/Magento/Sales/i18n/pt_BR.csv +++ b/app/code/Magento/Sales/i18n/pt_BR.csv @@ -679,3 +679,4 @@ order-header,order-header "State Code and Title","State Code and Title" "PDF Packing Slips","Guias de remessas em PDF" "Status can't be unassigned, because it is used by existing order(s).","Status can't be unassigned, because it is used by existing order(s)." +Operations,Operations diff --git a/app/code/Magento/Sales/i18n/zh_Hans_CN.csv b/app/code/Magento/Sales/i18n/zh_Hans_CN.csv index ecbf74067715d46205ac92e77f11cf9eee47236a..72b4d5663d7eb6446ac3440a68092a338c16d861 100644 --- a/app/code/Magento/Sales/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Sales/i18n/zh_Hans_CN.csv @@ -679,3 +679,4 @@ order-header,order-header "State Code and Title","State Code and Title" "PDF Packing Slips",PDFç‰ˆåŒ…è£¹æ¸…å• "Status can't be unassigned, because it is used by existing order(s).","Status can't be unassigned, because it is used by existing order(s)." +Operations,Operations diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ApplyRules.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ApplyRules.php index 9e694ab9ea087a64765c8ad198d3170c8492ca96..28d6a8eb392b194b7c444b79f8e761f25be63899 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ApplyRules.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ApplyRules.php @@ -13,7 +13,7 @@ class ApplyRules extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction(); $this->_view->renderLayout(); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Chooser.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Chooser.php index f88d58097f2cd75cf7c457e9d6edea3f63ed4c36..0a7563e34a9ee743ea85969efe305301696d1b56 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Chooser.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Chooser.php @@ -13,7 +13,7 @@ class Chooser extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { $uniqId = $this->getRequest()->getParam('uniq_id'); $chooserBlock = $this->_view->getLayout()->createBlock( diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsGrid.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsGrid.php index 565e1d7d8ca44688d121f42279bd3788ff726020..3ce01abaf9bc02a9fb5f517026a745cebcd51a06 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsGrid.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsGrid.php @@ -13,7 +13,7 @@ class CouponsGrid extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { $this->_initRule(); $this->_view->loadLayout(); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsMassDelete.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsMassDelete.php index 623dedb6ae1b083261baf4195a6fdb160d011c2b..d938f67a30f76cd987c46f6c05e89ace3a7081e5 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsMassDelete.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/CouponsMassDelete.php @@ -13,7 +13,7 @@ class CouponsMassDelete extends \Magento\SalesRule\Controller\Adminhtml\Promo\Qu * * @return void */ - public function execute() + public function executeInternal() { $this->_initRule(); $rule = $this->_coreRegistry->registry('current_promo_quote_rule'); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php index c88dc7494f89512455ea539b75416905965b9f03..a8e5ca176cd9197eec87a73f50213d1a556e0ad0 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); if ($id) { diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Edit.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Edit.php index 6138a59b95ac241b6df44e33edd90fba92fcc369..636e0d548c34b0c47b565792243e454ce5d7ca2d 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Edit.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Edit.php @@ -14,7 +14,7 @@ class Edit extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * @return void * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $model = $this->_objectManager->create('Magento\SalesRule\Model\Rule'); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsCsv.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsCsv.php index bcbfee1049532f7eaae6fb7d2906ef16bfac5d00..3d06d95e63034056e3269918877fa00480834685 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsCsv.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsCsv.php @@ -15,7 +15,7 @@ class ExportCouponsCsv extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quo * * @return \Magento\Framework\App\ResponseInterface|null */ - public function execute() + public function executeInternal() { $this->_initRule(); $rule = $this->_coreRegistry->registry('current_promo_quote_rule'); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsXml.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsXml.php index 22172e206f50ece7573b3d8c377137e4e9eec8a1..717dc7246c64d03ff470cf5db51e15165c084e6d 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsXml.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/ExportCouponsXml.php @@ -15,7 +15,7 @@ class ExportCouponsXml extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quo * * @return \Magento\Framework\App\ResponseInterface|null */ - public function execute() + public function executeInternal() { $this->_initRule(); $rule = $this->_coreRegistry->registry('current_promo_quote_rule'); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Generate.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Generate.php index 437f2573bc2638c5e75f675d234a928d878fed2e..0bf21e978cf6b0a70e21d6edd05e0e62aefb73c4 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Generate.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Generate.php @@ -13,7 +13,7 @@ class Generate extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { if (!$this->getRequest()->isAjax()) { $this->_forward('noroute'); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Index.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Index.php index b27554f7fc6d0493b3277a313762214d9d68972e..8921d7c461b95a51f0cc7e01e1b4f63a2907215e 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Index.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction()->_addBreadcrumb(__('Catalog'), __('Catalog')); $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Cart Price Rules')); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewAction.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewAction.php index dc8b49e02e2eb1afe28d7092610db3cf066e9744..324d2d07b6b1d8f7756750335cb8f7189a73ebcd 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewAction.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewActionHtml.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewActionHtml.php index cf383bfed2d0c28b46e728a2bdc40425458018f3..422ee2a38a63188916004704a0d68616e03b7cec 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewActionHtml.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewActionHtml.php @@ -13,7 +13,7 @@ class NewActionHtml extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $typeArr = explode('|', str_replace('-', '/', $this->getRequest()->getParam('type'))); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewConditionHtml.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewConditionHtml.php index fb0c502a37e1a72734f9d26507ad47ec16e46bb3..48d05829f32744e125a3890a84cce249872c96c8 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewConditionHtml.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewConditionHtml.php @@ -13,7 +13,7 @@ class NewConditionHtml extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quo * * @return void */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $typeArr = explode('|', str_replace('-', '/', $this->getRequest()->getParam('type'))); diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php index 9434b07ed0b07f8bf62ff1bbea906c1278d09976..c0d318d345338d587cdbffba5f38324e9f10ad3d 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php @@ -15,7 +15,7 @@ class Save extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { if ($this->getRequest()->getPostValue()) { try { diff --git a/app/code/Magento/SalesRule/Model/Plugin/Rule.php b/app/code/Magento/SalesRule/Model/Plugin/Rule.php index 7bf8cb3c43d8aad796e96c8aec699536466b0091..8aa29ffe419e73635fc8fb845a652d1bcc9af86e 100644 --- a/app/code/Magento/SalesRule/Model/Plugin/Rule.php +++ b/app/code/Magento/SalesRule/Model/Plugin/Rule.php @@ -13,7 +13,7 @@ class Rule * @return \Magento\SalesRule\Model\Rule * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundLoadCouponCode( + public function aroundLoadRelations( \Magento\SalesRule\Model\Rule $subject, \Closure $proceed ) { diff --git a/app/code/Magento/SalesRule/Model/Rule.php b/app/code/Magento/SalesRule/Model/Rule.php index 200a836592c1c8bdfd1cf21d2330b23d7b609aca..4ecc75f77dd891ea1be1580e555c017ebda9da5d 100644 --- a/app/code/Magento/SalesRule/Model/Rule.php +++ b/app/code/Magento/SalesRule/Model/Rule.php @@ -231,11 +231,23 @@ class Rule extends \Magento\Rule\Model\AbstractModel */ protected function _afterLoad() { - $this->loadCouponCode(); + $this->loadRelations(); return parent::_afterLoad(); } /** + * Load all relative data + * + * @return void + */ + public function loadRelations() + { + $this->loadCouponCode(); + } + + /** + * Load coupon code + * * @return void */ public function loadCouponCode() diff --git a/app/code/Magento/SalesRule/Observer/SalesOrderAfterPlaceObserver.php b/app/code/Magento/SalesRule/Observer/SalesOrderAfterPlaceObserver.php index 1d1a6be10918d384aaaa5906b395c7f30f02c8e3..9ceb8221d17a2577af41219fc483601080e7cd11 100644 --- a/app/code/Magento/SalesRule/Observer/SalesOrderAfterPlaceObserver.php +++ b/app/code/Magento/SalesRule/Observer/SalesOrderAfterPlaceObserver.php @@ -77,6 +77,7 @@ class SalesOrderAfterPlaceObserver implements ObserverInterface $rule = $this->_ruleFactory->create(); $rule->load($ruleId); if ($rule->getId()) { + $rule->loadCouponCode(); $rule->setTimesUsed($rule->getTimesUsed() + 1); $rule->save(); diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/Plugin/RuleTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/Plugin/RuleTest.php index fb788c5cf5b6f22efc7b99f421bb77d6267b69ce..a30a4acb36a0f29d55a4716a17cc33d770cdd82a 100644 --- a/app/code/Magento/SalesRule/Test/Unit/Model/Plugin/RuleTest.php +++ b/app/code/Magento/SalesRule/Test/Unit/Model/Plugin/RuleTest.php @@ -14,7 +14,7 @@ class RuleTest extends \PHPUnit_Framework_TestCase protected $plugin; /**} - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\SalesRule\Model\Rule|\PHPUnit_Framework_MockObject_MockObject */ protected $subject; @@ -36,11 +36,11 @@ class RuleTest extends \PHPUnit_Framework_TestCase $this->plugin = $objectManager->getObject('Magento\SalesRule\Model\Plugin\Rule'); } - public function testLoadCouponCode() + public function testLoadRelations() { $this->assertEquals( $this->subject, - $this->plugin->aroundLoadCouponCode($this->subject, $this->genericClosure) + $this->plugin->aroundLoadRelations($this->subject, $this->genericClosure) ); } } diff --git a/app/code/Magento/SalesRule/view/frontend/web/template/cart/totals/discount.html b/app/code/Magento/SalesRule/view/frontend/web/template/cart/totals/discount.html index 1797b8ff9c276d5d0e3ecb760b764e594410eaf3..b8a057ff065dd211efb54bc8b6167d441e7702dc 100644 --- a/app/code/Magento/SalesRule/view/frontend/web/template/cart/totals/discount.html +++ b/app/code/Magento/SalesRule/view/frontend/web/template/cart/totals/discount.html @@ -7,7 +7,7 @@ <!-- ko if: isDisplayed() --> <tr class="totals"> <th colspan="1" style="" class="mark" scope="row" data-bind="text: title"></th> - <td class="amount" data-bind="attr: {'data-th': $t(title) }"> + <td class="amount" data-bind="attr: {'data-th': title}"> <span><span class="price" data-bind="text: getValue()"></span></span> </td> </tr> diff --git a/app/code/Magento/SalesRule/view/frontend/web/template/summary/discount.html b/app/code/Magento/SalesRule/view/frontend/web/template/summary/discount.html index 60ac9c7982a5f6a0a510abd25fb67e4ee11dc13a..705541de3b4fc90bb16fad0d109b58d587380e26 100644 --- a/app/code/Magento/SalesRule/view/frontend/web/template/summary/discount.html +++ b/app/code/Magento/SalesRule/view/frontend/web/template/summary/discount.html @@ -11,7 +11,7 @@ <span class="discount coupon" data-bind="text: getCouponCode()"></span> </th> <td class="amount"> - <span class="price" data-bind="text: getValue(), attr: {'data-th': $t(name) }"></span> + <span class="price" data-bind="text: getValue(), attr: {'data-th': name}"></span> </td> </tr> <!-- /ko --> diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/Delete.php b/app/code/Magento/Search/Controller/Adminhtml/Term/Delete.php index 78a24106294be4257fb39a2971f621db18458d4a..e3dc4e5a7a813818172376182b062397dc2e8ae1 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/Delete.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/Delete.php @@ -13,7 +13,7 @@ class Delete extends TermController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/Edit.php b/app/code/Magento/Search/Controller/Adminhtml/Term/Edit.php index ad6502e18ad1970a8f56b86cb9f12e15e1445fdb..df5c08a46937224bceb2ed9326cbeabd63f3ccc2 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/Edit.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/Edit.php @@ -35,7 +35,7 @@ class Edit extends TermController * @return \Magento\Framework\Controller\ResultInterface * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $id = $this->getRequest()->getParam('id'); $model = $this->_objectManager->create('Magento\Search\Model\Query'); diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php b/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php index da777ec44e462b0b518cf07c6d7fad9375aefb4d..34fe89f51bee08ee5448e7484a69eef7e618e5d9 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php @@ -35,7 +35,7 @@ class ExportSearchCsv extends TermController * * @return \Magento\Framework\App\ResponseInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Layout $resultLayout */ $resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT); diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchExcel.php b/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchExcel.php index b287a1f6ea8b2a08d9f02a7ca8e8d55565907d8a..2a89f2fb339aef515877e6f79584cda9d355f5d0 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchExcel.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchExcel.php @@ -35,7 +35,7 @@ class ExportSearchExcel extends TermController * * @return \Magento\Framework\App\ResponseInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Layout $resultLayout */ $resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT); diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/Index.php b/app/code/Magento/Search/Controller/Adminhtml/Term/Index.php index 6bce708278a12b5c989e21d609b1554b25f10f41..54e3a4b11c218d4cbf44a95e1eb9b2ca04e8ffd4 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/Index.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/Index.php @@ -12,7 +12,7 @@ class Index extends TermController /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->createPage(); $resultPage->getConfig()->getTitle()->prepend(__('Search Terms')); diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php b/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php index 97586e38d644edf87d37faccf0a3ba3054f29120..a10b869a24c8432c24724b1564d81090c3ec472f 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php @@ -13,7 +13,7 @@ class MassDelete extends TermController /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $searchIds = $this->getRequest()->getParam('search'); if (!is_array($searchIds)) { diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/NewAction.php b/app/code/Magento/Search/Controller/Adminhtml/Term/NewAction.php index 35f6d63e637f9b273c3aa0bf3e96d9a94ff4cb44..f049f45d9a00f864400d18dd5fcdf3c2ff01e2fa 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/NewAction.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends TermController /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultFactory->create(ResultFactory::TYPE_FORWARD); diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/Report.php b/app/code/Magento/Search/Controller/Adminhtml/Term/Report.php index 1c512961e58ed98a3147424e1161ba805cfc3b69..f0e9c4dc0984cc8a9c26dad77360a285b0f91f50 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/Report.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/Report.php @@ -15,7 +15,7 @@ class Report extends ReportsIndexController * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->_eventManager->dispatch('on_view_report', ['report' => 'search']); /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/Save.php b/app/code/Magento/Search/Controller/Adminhtml/Term/Save.php index 3a31a0555a73910398472114826795af837478fa..e50d11a84dee1602b1b13521050625cbcfc6b0f5 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/Save.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/Save.php @@ -36,7 +36,7 @@ class Save extends TermController * @return \Magento\Backend\Model\View\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); if ($this->getRequest()->isPost() && $data) { diff --git a/app/code/Magento/Search/Controller/Ajax/Suggest.php b/app/code/Magento/Search/Controller/Ajax/Suggest.php index f39c7bf708b45cf48217fc6a2aaf91f0cc31e21a..ca49bc1cceeee99740ce95134ecc726a137ae995 100644 --- a/app/code/Magento/Search/Controller/Ajax/Suggest.php +++ b/app/code/Magento/Search/Controller/Ajax/Suggest.php @@ -32,7 +32,7 @@ class Suggest extends Action /** * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { if (!$this->getRequest()->getParam('q', false)) { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Search/Controller/Term/Popular.php b/app/code/Magento/Search/Controller/Term/Popular.php index 687e17f62abe0f89d993893fc12972df59a37200..bcad10e4a1efd9104a7485255fafd811225efe05 100644 --- a/app/code/Magento/Search/Controller/Term/Popular.php +++ b/app/code/Magento/Search/Controller/Term/Popular.php @@ -35,7 +35,7 @@ class Popular extends Action * @param \Magento\Framework\App\RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $searchTerms = $this->scopeConfig->getValue( 'catalog/seo/search_terms', @@ -45,13 +45,13 @@ class Popular extends Action $this->_redirect('noroute'); $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true); } - return parent::dispatch($request); + return parent::execute($request); } /** * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); diff --git a/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Ajax/SuggestTest.php b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Ajax/SuggestTest.php index c8493a32a6bb3850c51538d5062c5e28463411ce..1b097fb97a849564d278ded7d4928153e778926e 100644 --- a/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Ajax/SuggestTest.php +++ b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Ajax/SuggestTest.php @@ -126,7 +126,7 @@ class SuggestTest extends \PHPUnit_Framework_TestCase ->method('setData') ->willReturnSelf(); - $this->assertSame($this->resultJsonMock, $this->controller->execute()); + $this->assertSame($this->resultJsonMock, $this->controller->executeInternal()); } public function testExecuteEmptyQuery() @@ -146,6 +146,6 @@ class SuggestTest extends \PHPUnit_Framework_TestCase ->with($url) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->controller->execute()); + $this->assertSame($this->resultRedirectMock, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/MassDeleteTest.php b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/MassDeleteTest.php index fd0e5f83a2594dfe70688e128dc3c5f329ef0264..8642f19bb477758b5c4e6a9568cd7a0189dbd801 100644 --- a/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/MassDeleteTest.php +++ b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/MassDeleteTest.php @@ -114,7 +114,7 @@ class MassDeleteTest extends \PHPUnit_Framework_TestCase ->with('search/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->controller->execute()); + $this->assertSame($this->resultRedirectMock, $this->controller->executeInternal()); } /** diff --git a/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/SaveTest.php b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/SaveTest.php index 5197e7d83e4509894c63e4c917794336b6921f66..3d17abf4677808f8d630061605b2c98ecb05fe1b 100644 --- a/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/SaveTest.php +++ b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/SaveTest.php @@ -120,7 +120,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->request->expects($this->at(0))->method('getPostValue')->willReturn($data); $this->request->expects($this->at(1))->method('isPost')->willReturn($isPost); $this->redirect->expects($this->once())->method('setPath')->willReturnSelf(); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } /** @@ -146,7 +146,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManager->expects($this->once())->method('addSuccess'); $this->redirect->expects($this->once())->method('setPath')->willReturnSelf(); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } public function testExecuteLoadQueryQueryIdQueryText() @@ -164,7 +164,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManager->expects($this->once())->method('addSuccess'); $this->redirect->expects($this->once())->method('setPath')->willReturnSelf(); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } public function testExecuteLoadQueryQueryIdQueryText2() @@ -183,7 +183,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManager->expects($this->once())->method('addSuccess'); $this->redirect->expects($this->once())->method('setPath')->willReturnSelf(); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } public function testExecuteLoadQueryQueryIdQueryTextException() @@ -202,7 +202,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManager->expects($this->once())->method('addError'); $this->session->expects($this->once())->method('setPageData'); $this->redirect->expects($this->once())->method('setPath')->willReturnSelf(); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } public function testExecuteException() @@ -219,7 +219,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManager->expects($this->once())->method('addException'); $this->session->expects($this->once())->method('setPageData'); $this->redirect->expects($this->once())->method('setPath')->willReturnSelf(); - $this->assertSame($this->redirect, $this->controller->execute()); + $this->assertSame($this->redirect, $this->controller->executeInternal()); } /** diff --git a/app/code/Magento/Search/etc/adminhtml/system.xml b/app/code/Magento/Search/etc/adminhtml/system.xml index 90d9943dd9f4380c39f4f504488f75be75da33b8..d32c75cb1a3a84381ca5174e226732b6d145d4b8 100644 --- a/app/code/Magento/Search/etc/adminhtml/system.xml +++ b/app/code/Magento/Search/etc/adminhtml/system.xml @@ -18,11 +18,6 @@ <field id="engine">mysql</field> </depends> </field> - <field id="use_layered_navigation_count"> - <depends> - <field id="engine">mysql</field> - </depends> - </field> </group> </section> </system> diff --git a/app/code/Magento/SendFriend/Controller/Product.php b/app/code/Magento/SendFriend/Controller/Product.php index 73a227ce32c9ad957b1d0213cc31e6a5bf7c6ce8..0532108e6e7d4044b507b01901b6a1e95c5e7b0b 100644 --- a/app/code/Magento/SendFriend/Controller/Product.php +++ b/app/code/Magento/SendFriend/Controller/Product.php @@ -65,7 +65,7 @@ abstract class Product extends \Magento\Framework\App\Action\Action * @return \Magento\Framework\App\ResponseInterface * @throws \Magento\Framework\Exception\NotFoundException */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { /* @var $helper \Magento\SendFriend\Helper\Data */ $helper = $this->_objectManager->get('Magento\SendFriend\Helper\Data'); @@ -84,7 +84,7 @@ abstract class Product extends \Magento\Framework\App\Action\Action ->setSendfriendFormData($request->getPostValue()); } } - return parent::dispatch($request); + return parent::execute($request); } /** diff --git a/app/code/Magento/SendFriend/Controller/Product/Send.php b/app/code/Magento/SendFriend/Controller/Product/Send.php index c6d7f3b05ddc0d6d5d38714219262e59c0304127..99e0f911710d23b926ef580f5ca7f482ddad0583 100644 --- a/app/code/Magento/SendFriend/Controller/Product/Send.php +++ b/app/code/Magento/SendFriend/Controller/Product/Send.php @@ -45,7 +45,7 @@ class Send extends \Magento\SendFriend\Controller\Product * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $product = $this->_initProduct(); diff --git a/app/code/Magento/SendFriend/Controller/Product/Sendmail.php b/app/code/Magento/SendFriend/Controller/Product/Sendmail.php index 048ce1060d8b3f11927e58a0f78a6495fb441265..aa34eefa5b2a8dbeda1e8b2098b15fb199257e23 100644 --- a/app/code/Magento/SendFriend/Controller/Product/Sendmail.php +++ b/app/code/Magento/SendFriend/Controller/Product/Sendmail.php @@ -50,7 +50,7 @@ class Sendmail extends \Magento\SendFriend\Controller\Product * @return \Magento\Framework\Controller\ResultInterface * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendTest.php b/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendTest.php index 090dc47f19b6575d3484fc6ac2625af631ccc3dc..bc981416c84180a53518d47200e1f92f54675bbe 100644 --- a/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendTest.php +++ b/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendTest.php @@ -175,7 +175,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with($formData) ->willReturnSelf(); - $this->assertEquals($pageMock, $this->model->execute()); + $this->assertEquals($pageMock, $this->model->executeInternal()); } /** @@ -254,7 +254,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('sendfriend.send') ->willReturn(false); - $this->assertEquals($pageMock, $this->model->execute()); + $this->assertEquals($pageMock, $this->model->executeInternal()); } public function testExecuteWithNoticeAndNoData() @@ -320,7 +320,7 @@ class SendTest extends \PHPUnit_Framework_TestCase $pageMock->expects($this->never()) ->method('getLayout'); - $this->assertEquals($pageMock, $this->model->execute()); + $this->assertEquals($pageMock, $this->model->executeInternal()); } public function testExecuteWithoutParam() @@ -345,7 +345,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertEquals($forwardMock, $this->model->execute()); + $this->assertEquals($forwardMock, $this->model->executeInternal()); } public function testExecuteWithoutProduct() @@ -377,7 +377,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertEquals($forwardMock, $this->model->execute()); + $this->assertEquals($forwardMock, $this->model->executeInternal()); } public function testExecuteWithNonVisibleProduct() @@ -418,6 +418,6 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertEquals($forwardMock, $this->model->execute()); + $this->assertEquals($forwardMock, $this->model->executeInternal()); } } diff --git a/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendmailTest.php b/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendmailTest.php index 807cb8adf04ae3d2ba5b94b42e467ff467ed0201..f6df2bc39b04ce5b1f115caa524506617101cb65 100644 --- a/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendmailTest.php +++ b/app/code/Magento/SendFriend/Test/Unit/Controller/Product/SendmailTest.php @@ -234,7 +234,7 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with($productUrl) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** @@ -361,7 +361,7 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with($redirectUrl) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** @@ -488,7 +488,7 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with($redirectUrl) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** @@ -615,7 +615,7 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with($redirectUrl) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** @@ -743,7 +743,7 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with($redirectUrl) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } /** @@ -799,7 +799,7 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertEquals($forwardMock, $this->model->execute()); + $this->assertEquals($forwardMock, $this->model->executeInternal()); } /** @@ -873,7 +873,7 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertEquals($forwardMock, $this->model->execute()); + $this->assertEquals($forwardMock, $this->model->executeInternal()); } public function testExecuteWithoutFormKey() @@ -901,6 +901,6 @@ class SendmailTest extends \PHPUnit_Framework_TestCase ->with('sendfriend/product/send', ['_current' => true]) ->willReturnSelf(); - $this->assertEquals($redirectMock, $this->model->execute()); + $this->assertEquals($redirectMock, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php index fb24a2a32580e881bef427175c7c948206ddc323..d012a1d1ecee678c2ded234bca48fca6398d7b52 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php @@ -58,7 +58,7 @@ class AddComment extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { try { $this->getRequest()->setParam('shipment_id', $this->getRequest()->getParam('id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php index ea5ab1d967769b557067550cd147bfe5fd561cd8..8a47ed1ddaec5fcc267f3263552096737a1915ef 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php @@ -41,7 +41,7 @@ class AddTrack extends \Magento\Backend\App\Action * @return void * @throws \Magento\Framework\Exception\LocalizedException */ - public function execute() + public function executeInternal() { try { $carrier = $this->getRequest()->getPost('carrier'); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/CreateLabel.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/CreateLabel.php index facbc5192d7a0b1ffd95a9f42e88df6f5943837e..faac42d270ff22884de8f49b063f3bc74045440b 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/CreateLabel.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/CreateLabel.php @@ -48,7 +48,7 @@ class CreateLabel extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { $response = new \Magento\Framework\DataObject(); try { diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php index 6d3bb9a49ed17664b2fb11aa85ee2247b88a9fe5..e0ea65f65fdf8c2b6a251823da8d3f20dfea5440 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php @@ -48,7 +48,7 @@ class Email extends \Magento\Backend\App\Action * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/GetShippingItemsGrid.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/GetShippingItemsGrid.php index 26b2df96cb62754894cb1940655339493cff39dd..3c4dc9f49ee78dc50766c3fb4469b027baf0549e 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/GetShippingItemsGrid.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/GetShippingItemsGrid.php @@ -41,7 +41,7 @@ class GetShippingItemsGrid extends \Magento\Backend\App\Action * * @return ResponseInterface */ - public function execute() + public function executeInternal() { $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->shipmentLoader->setShipmentId($this->getRequest()->getParam('shipment_id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/NewAction.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/NewAction.php index a0917b813d1da1d686c10c8a0c95ea8b962bc6e7..06e97644dfde6d72e7fb134b95376e9e59f8a7ae 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/NewAction.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/NewAction.php @@ -40,7 +40,7 @@ class NewAction extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->shipmentLoader->setShipmentId($this->getRequest()->getParam('shipment_id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintLabel.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintLabel.php index 8cf58bc151fd5a1577b53ce8a62dda3ea65fafa7..fb3889761fa731f7635fca24e7d7b1998db07bf9 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintLabel.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintLabel.php @@ -58,7 +58,7 @@ class PrintLabel extends \Magento\Backend\App\Action * * @return ResponseInterface|void */ - public function execute() + public function executeInternal() { try { $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintPackage.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintPackage.php index d931e1e100625bc00e909adce513b18616af610a..db6903544d0f2e639b1944b1b610b681c26702bb 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintPackage.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/PrintPackage.php @@ -50,7 +50,7 @@ class PrintPackage extends \Magento\Backend\App\Action * * @return ResponseInterface|void */ - public function execute() + public function executeInternal() { $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->shipmentLoader->setShipmentId($this->getRequest()->getParam('shipment_id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php index 4b85739acc03de48fe10caf60f894ee4621617df..7ef4f99eef241583226964c75f76003fe2093d46 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php @@ -40,7 +40,7 @@ class RemoveTrack extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { $trackId = $this->getRequest()->getParam('track_id'); /** @var \Magento\Sales\Model\Order\Shipment\Track $track */ diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php index 0704ac04041c34b05fe18e22d6fb300d0e83221c..3e5e9a3ac2d96359c1bf6d51b702336932f55bc4 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php @@ -81,7 +81,7 @@ class Save extends \Magento\Backend\App\Action * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Start.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Start.php index d4c6015870b2006cfe771c1545a8ac07f48d2093..e551117332303654aa299935cc1acfbe05f5c02f 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Start.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Start.php @@ -21,7 +21,7 @@ class Start extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { /** * Clear old values for shipment qty's diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/View.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/View.php index 980486e3bc284602733873bbd845accd56303dd5..ebd8a6b111ea021bcfa909bad448d9a6440499e5 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/View.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/View.php @@ -56,7 +56,7 @@ class View extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); $this->shipmentLoader->setShipmentId($this->getRequest()->getParam('shipment_id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/ShipmentLoader.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/ShipmentLoader.php index 6bbaac5a04d4a34331323019cc7cbd4f03fbf704..c837623ac8ffd99323b1b116bbb8648db83f7433 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/ShipmentLoader.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/ShipmentLoader.php @@ -12,14 +12,14 @@ use Magento\Framework\DataObject; * Class ShipmentLoader * * @package Magento\Shipping\Controller\Adminhtml\Order - * @method ShipmentLoader setOrderId - * @method ShipmentLoader setShipmentId - * @method ShipmentLoader setShipment - * @method ShipmentLoader setTracking - * @method int getOrderId - * @method int getShipmentId - * @method array getShipment - * @method array getTracking + * @method ShipmentLoader setOrderId($id) + * @method ShipmentLoader setShipmentId($id) + * @method ShipmentLoader setShipment($shipment) + * @method ShipmentLoader setTracking($tracking) + * @method int getOrderId() + * @method int getShipmentId() + * @method array getShipment() + * @method array getTracking() */ class ShipmentLoader extends DataObject { diff --git a/app/code/Magento/Shipping/Controller/Tracking/Popup.php b/app/code/Magento/Shipping/Controller/Tracking/Popup.php index 9ae7590bdb44429914809f6cb387274b3ae22a18..d3fb5dbe349b923dca6ddf7e4fee37a783ce2d76 100644 --- a/app/code/Magento/Shipping/Controller/Tracking/Popup.php +++ b/app/code/Magento/Shipping/Controller/Tracking/Popup.php @@ -52,7 +52,7 @@ class Popup extends \Magento\Framework\App\Action\Action * @return void * @throws NotFoundException */ - public function execute() + public function executeInternal() { $shippingInfoModel = $this->_shippingInfoFactory->create()->loadByHash($this->getRequest()->getParam('hash')); $this->_coreRegistry->register('current_shipping_info', $shippingInfoModel); diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddCommentTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddCommentTest.php index 6a60d69bdfe58eb6a6b84bb625f86082c9108820..9ab7b4844e46ad83706f5c832c0952607ed70ded 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddCommentTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddCommentTest.php @@ -223,7 +223,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($resultLayoutMock)); $this->responseMock->expects($this->once())->method('setBody')->with($result); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -261,7 +261,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase ->willThrowException(new \Magento\Framework\Exception\LocalizedException(__('message'))); $this->exceptionResponse(); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -278,7 +278,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase $this->requestMock->expects($this->once())->method('getPost')->with('comment')->will($this->returnValue([])); $this->exceptionResponse(); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -322,6 +322,6 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase $this->shipmentMock->expects($this->once())->method('save')->will($this->throwException(new \Exception())); $this->exceptionResponse(); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddTrackTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddTrackTest.php index 1abeb9d3dacd92695250d7bcdcd1a5dd1b2742b2..d078e5320316016778624da2ab4e22b1ae2ced6c 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddTrackTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/AddTrackTest.php @@ -254,6 +254,6 @@ class AddTrackTest extends \PHPUnit_Framework_TestCase $this->response->expects($this->once()) ->method('setBody') ->with($html); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/CreateLabelTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/CreateLabelTest.php index d96ba6398243760bab56dd6ae20ae6a897c97c23..a8cc7c8a3ac7c092bec8f1c31c014cc50dc5a392 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/CreateLabelTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/CreateLabelTest.php @@ -179,7 +179,7 @@ class CreateLabelTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->once())->method('addSuccess'); $this->responseMock->expects($this->once())->method('representJson'); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -192,7 +192,7 @@ class CreateLabelTest extends \PHPUnit_Framework_TestCase ->willThrowException(new \Magento\Framework\Exception\LocalizedException(__('message'))); $this->responseMock->expects($this->once())->method('representJson'); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -217,7 +217,7 @@ class CreateLabelTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($logerMock)); $this->responseMock->expects($this->once())->method('representJson'); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -236,6 +236,6 @@ class CreateLabelTest extends \PHPUnit_Framework_TestCase ); $this->responseMock->expects($this->once())->method('representJson'); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/EmailTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/EmailTest.php index edcdbd764a1fd2690bbd0e9782ba12aad5fba323..793763607ab90ab6e6191b26e1e0d84ea0c28690 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/EmailTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/EmailTest.php @@ -235,7 +235,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase $arguments = ['shipment_id' => $shipmentId]; $this->prepareRedirect($path, $arguments, 0); - $this->shipmentEmail->execute(); + $this->shipmentEmail->executeInternal(); $this->assertEquals($this->response, $this->shipmentEmail->getResponse()); } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/GetShippingItemsGridTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/GetShippingItemsGridTest.php index c62c9109a26a8bf4d2d17df661db2d132468d3c7..71239d0a1be5b180204e575b401421097ca3547e 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/GetShippingItemsGridTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/GetShippingItemsGridTest.php @@ -152,6 +152,6 @@ class GetShippingItemsGridTest extends \PHPUnit_Framework_TestCase ->method('toHtml') ->will($this->returnValue($result)); - $this->assertNotEmpty('result-html', $this->controller->execute()); + $this->assertNotEmpty('result-html', $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/NewActionTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/NewActionTest.php index df9cc23823b08bb66a10b2af884c7cbf665608bc..6179fb4eac6515d3e5121662efe1d33d7bcbffe6 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/NewActionTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/NewActionTest.php @@ -282,6 +282,6 @@ class NewActionTest extends \PHPUnit_Framework_TestCase ->with('menu') ->will($this->returnValue($menuBlock)); - $this->assertNull($this->newAction->execute()); + $this->assertNull($this->newAction->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintLabelTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintLabelTest.php index 6548503fbee20a6995689a4f370b0ecdcab438d2..1effd8c699b4786cbdeaf63bf4bb3cd101040086 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintLabelTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintLabelTest.php @@ -250,7 +250,7 @@ class PrintLabelTest extends \PHPUnit_Framework_TestCase ->method('getShippingLabel') ->will($this->returnValue($labelContent)); - $this->assertEquals($this->fileCreate(), $this->controller->execute()); + $this->assertEquals($this->fileCreate(), $this->controller->executeInternal()); } /** @@ -291,7 +291,7 @@ class PrintLabelTest extends \PHPUnit_Framework_TestCase ->method('getObject') ->will($this->returnSelf()); - $this->assertEquals($this->fileCreate(), $this->controller->execute()); + $this->assertEquals($this->fileCreate(), $this->controller->executeInternal()); } /** @@ -337,7 +337,7 @@ class PrintLabelTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(1)); $this->redirectSection(); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -351,6 +351,6 @@ class PrintLabelTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->once())->method('addError')->will($this->returnSelf()); $this->redirectSection(); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintPackageTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintPackageTest.php index 4c6b9608d3b2f6f0fe1f6fe7e31e8313ec12d71f..05487808f92b96187749519ea08447bd3cb4db7c 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintPackageTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/PrintPackageTest.php @@ -193,7 +193,7 @@ class PrintPackageTest extends \PHPUnit_Framework_TestCase 'application/pdf' )->will($this->returnValue('result-pdf-content')); - $this->assertEquals('result-pdf-content', $this->controller->execute()); + $this->assertEquals('result-pdf-content', $this->controller->executeInternal()); } /** @@ -215,6 +215,6 @@ class PrintPackageTest extends \PHPUnit_Framework_TestCase ->method('setIsUrlNotice') ->with(true); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php index bb0b1d21202a46c0a6a326e4c83e6893090460a5..37d4634c0da42935113d225b51d92e20ad4a3607 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php @@ -255,7 +255,7 @@ class RemoveTrackTest extends \PHPUnit_Framework_TestCase ->method('setBody') ->with($response); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -275,7 +275,7 @@ class RemoveTrackTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($trackId)); $this->representJson($errors); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -294,7 +294,7 @@ class RemoveTrackTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(null)); $this->representJson($errors); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } /** @@ -313,6 +313,6 @@ class RemoveTrackTest extends \PHPUnit_Framework_TestCase ->will($this->throwException(new \Exception())); $this->representJson($errors); - $this->assertNull($this->controller->execute()); + $this->assertNull($this->controller->executeInternal()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/SaveTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/SaveTest.php index fad9df01c37444630cce0ecec464f66cd5c1f1a8..954714bbd9aa46a2b0dfa552d7cf1a9b57864fa1 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/SaveTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/SaveTest.php @@ -249,7 +249,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->shipmentLoader->expects($this->never()) ->method('load'); - $this->assertEquals($this->resultRedirect, $this->saveAction->execute()); + $this->assertEquals($this->resultRedirect, $this->saveAction->executeInternal()); } else { $shipmentId = 1000012; $orderId = 10003; @@ -345,7 +345,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($orderId)); $this->prepareRedirect($path, $arguments); - $this->saveAction->execute(); + $this->saveAction->executeInternal(); $this->assertEquals($this->response, $this->saveAction->getResponse()); } } diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/ViewTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/ViewTest.php index 1dbf636942246e2480453a2ebb16fcbd07d2828b..0f6aad7610e395bce1fe341ea54a64ce6e7f8b72 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/ViewTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/ViewTest.php @@ -187,7 +187,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase ) ->willReturnSelf(); - $this->assertEquals($this->resultPageMock, $this->controller->execute()); + $this->assertEquals($this->resultPageMock, $this->controller->executeInternal()); } /** @@ -209,7 +209,7 @@ class ViewTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertEquals($this->resultForwardMock, $this->controller->execute()); + $this->assertEquals($this->resultForwardMock, $this->controller->executeInternal()); } protected function loadShipment($orderId, $shipmentId, $shipment, $tracking, $comeFrom, $returnShipment) diff --git a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Delete.php b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Delete.php index 70f12719c16cb5a2cd580b07c9915a9faa1d93b7..bdc70c0f8f88db73d27658a7398ad053ecc21843 100644 --- a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Delete.php +++ b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Delete.php @@ -16,7 +16,7 @@ class Delete extends \Magento\Sitemap\Controller\Adminhtml\Sitemap * * @return void */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Filesystem\Directory\Write $directory */ $directory = $this->_objectManager->get( diff --git a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Edit.php b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Edit.php index 47cf66a319c0e9e0c7d78e521fb0f96078dd2dbc..87441bc158596181863f4da4261e1b0f84f7ffb4 100644 --- a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Edit.php +++ b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Edit.php @@ -31,7 +31,7 @@ class Edit extends \Magento\Sitemap\Controller\Adminhtml\Sitemap * @return void * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { // 1. Get ID and create model $id = $this->getRequest()->getParam('sitemap_id'); diff --git a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Generate.php b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Generate.php index b5a7e40d5a04209251446b758dad4b73fd01ad43..c162942061d0c7de3d3dd03b8d4d404ab929dbc9 100644 --- a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Generate.php +++ b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Generate.php @@ -14,7 +14,7 @@ class Generate extends \Magento\Sitemap\Controller\Adminhtml\Sitemap * * @return void */ - public function execute() + public function executeInternal() { // init and load sitemap model $id = $this->getRequest()->getParam('sitemap_id'); diff --git a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Index.php b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Index.php index 83aeca5ef8f4e75ef5596e44d81f697d10d368b5..11b84772e3297d63f31d7dbeb70cd00ea75c84da 100644 --- a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Index.php +++ b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Index.php @@ -15,7 +15,7 @@ class Index extends \Magento\Sitemap\Controller\Adminhtml\Sitemap * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction(); $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Site Map')); diff --git a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/NewAction.php b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/NewAction.php index abfba8929a0bbfb0498a88949b77b49853feb40b..309c00a840dc50a86a9a27cee4835133984f4c2e 100644 --- a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/NewAction.php +++ b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/NewAction.php @@ -14,7 +14,7 @@ class NewAction extends \Magento\Sitemap\Controller\Adminhtml\Sitemap * * @return void */ - public function execute() + public function executeInternal() { // the same form is used to create and edit $this->_forward('edit'); diff --git a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Save.php b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Save.php index 2f28cf9818308b3e176783004e84ad1b91bd8a83..dd96a60dfceefbd9b6b4e5509235ba2f9dc8e74e 100644 --- a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Save.php +++ b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap/Save.php @@ -133,7 +133,7 @@ class Save extends \Magento\Sitemap\Controller\Adminhtml\Sitemap * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { // check if data sent $data = $this->getRequest()->getPostValue(); diff --git a/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Product.php b/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Product.php index 5a93ef13583fe43c2dc45ad7e19aa294c46c4094..302d9689e1e4e9845f6c452e3d063a76cab3dd9e 100644 --- a/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Product.php +++ b/app/code/Magento/Sitemap/Model/ResourceModel/Catalog/Product.php @@ -234,7 +234,7 @@ class Product extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb 'attribute_id' => $attribute->getId(), 'table' => $attribute->getBackend()->getTable(), 'is_global' => $attribute->getIsGlobal() == - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'backend_type' => $attribute->getBackendType(), ]; } diff --git a/app/code/Magento/Sitemap/Test/Unit/Controller/Adminhtml/Sitemap/SaveTest.php b/app/code/Magento/Sitemap/Test/Unit/Controller/Adminhtml/Sitemap/SaveTest.php index e067bf2059814fdeadbd0719adda36117dfcdac0..c59e5ff66310db8c5389d875d8312596f50c67da 100644 --- a/app/code/Magento/Sitemap/Test/Unit/Controller/Adminhtml/Sitemap/SaveTest.php +++ b/app/code/Magento/Sitemap/Test/Unit/Controller/Adminhtml/Sitemap/SaveTest.php @@ -100,7 +100,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('adminhtml/*/') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->saveController->execute()); + $this->assertSame($this->resultRedirectMock, $this->saveController->executeInternal()); } public function testTryToSaveInvalidDataShouldFailWithErrors() @@ -166,6 +166,6 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('adminhtml/*/edit', ['sitemap_id' => $siteMapId]) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->saveController->execute()); + $this->assertSame($this->resultRedirectMock, $this->saveController->executeInternal()); } } diff --git a/app/code/Magento/Store/App/Action/Plugin/Context.php b/app/code/Magento/Store/App/Action/Plugin/Context.php index 6e3e3f4e4f5510df99451c684e5fb0358c2ea0b1..533104a5689e327ae81be37c0841ac4b04637301 100644 --- a/app/code/Magento/Store/App/Action/Plugin/Context.php +++ b/app/code/Magento/Store/App/Action/Plugin/Context.php @@ -69,7 +69,7 @@ class Context * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundDispatch( + public function aroundExecute( \Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/app/code/Magento/Store/App/Action/Plugin/StoreCheck.php b/app/code/Magento/Store/App/Action/Plugin/StoreCheck.php index 46fa0bc004a134a55b5c53e48cbc9fff2826d487..8519652f11bd6e06ded121789fd19ca50fdcb413 100644 --- a/app/code/Magento/Store/App/Action/Plugin/StoreCheck.php +++ b/app/code/Magento/Store/App/Action/Plugin/StoreCheck.php @@ -31,7 +31,7 @@ class StoreCheck * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @throws \Magento\Framework\Exception\State\InitException */ - public function aroundDispatch( + public function aroundExecute( \Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/app/code/Magento/Store/Controller/Store/SwitchAction.php b/app/code/Magento/Store/Controller/Store/SwitchAction.php index b527b7ad4fe702f5194e115229d0bb4699388ca0..052a8fc25fb2e040d04a6f5c50dad62bb421548a 100644 --- a/app/code/Magento/Store/Controller/Store/SwitchAction.php +++ b/app/code/Magento/Store/Controller/Store/SwitchAction.php @@ -68,7 +68,7 @@ class SwitchAction extends Action /** * @return void */ - public function execute() + public function executeInternal() { $storeCode = $this->_request->getParam( StoreResolver::PARAM_NAME, diff --git a/app/code/Magento/Store/Test/Unit/App/Action/Plugin/ContextTest.php b/app/code/Magento/Store/Test/Unit/App/Action/Plugin/ContextTest.php index e6c679b2dd4d28fa1157b83529ff7a7751012e4a..5614f453839941d57077abcc56cdf72ce3abc162 100644 --- a/app/code/Magento/Store/Test/Unit/App/Action/Plugin/ContextTest.php +++ b/app/code/Magento/Store/Test/Unit/App/Action/Plugin/ContextTest.php @@ -185,7 +185,7 @@ class ContextTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(self::CURRENCY_CURRENT_STORE)); } - public function testAroundDispatchCurrencyFromSession() + public function testAroundExecuteCurrencyFromSession() { $this->sessionMock->expects($this->any()) ->method('getCurrencyCode') @@ -201,11 +201,11 @@ class ContextTest extends \PHPUnit_Framework_TestCase $this->assertEquals( 'ExpectedValue', - $this->plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock) + $this->plugin->aroundExecute($this->subjectMock, $this->closureMock, $this->requestMock) ); } - public function testDispatchCurrentStoreCurrency() + public function testExecuteCurrentStoreCurrency() { $this->httpContextMock->expects($this->at(0)) ->method('setValue') @@ -217,7 +217,7 @@ class ContextTest extends \PHPUnit_Framework_TestCase $this->assertEquals( 'ExpectedValue', - $this->plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock) + $this->plugin->aroundExecute($this->subjectMock, $this->closureMock, $this->requestMock) ); } } diff --git a/app/code/Magento/Store/Test/Unit/App/Action/Plugin/StoreCheckTest.php b/app/code/Magento/Store/Test/Unit/App/Action/Plugin/StoreCheckTest.php index feaca2ad45ebe9972dfdad7d97a37caff6e6eb13..e83d629fb810b55e4288cbde37fff538215557fe 100644 --- a/app/code/Magento/Store/Test/Unit/App/Action/Plugin/StoreCheckTest.php +++ b/app/code/Magento/Store/Test/Unit/App/Action/Plugin/StoreCheckTest.php @@ -64,21 +64,21 @@ class StoreCheckTest extends \PHPUnit_Framework_TestCase * @expectedException \Magento\Framework\Exception\State\InitException * @expectedExceptionMessage Current store is not active. */ - public function testAroundDispatchWhenStoreNotActive() + public function testAroundExecuteWhenStoreNotActive() { $this->_storeMock->expects($this->any())->method('isActive')->will($this->returnValue(false)); $this->assertEquals( 'Expected', - $this->_plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock) + $this->_plugin->aroundExecute($this->subjectMock, $this->closureMock, $this->requestMock) ); } - public function testAroundDispatchWhenStoreIsActive() + public function testAroundExecuteWhenStoreIsActive() { $this->_storeMock->expects($this->any())->method('isActive')->will($this->returnValue(true)); $this->assertEquals( 'Expected', - $this->_plugin->aroundDispatch($this->subjectMock, $this->closureMock, $this->requestMock) + $this->_plugin->aroundExecute($this->subjectMock, $this->closureMock, $this->requestMock) ); } diff --git a/app/code/Magento/Store/i18n/de_DE.csv b/app/code/Magento/Store/i18n/de_DE.csv index e498731b13b2ca4ef3655fbedbdd1abce242bdd7..5cbbe3e5697db62873b9fc7128aaa82510709608 100644 --- a/app/code/Magento/Store/i18n/de_DE.csv +++ b/app/code/Magento/Store/i18n/de_DE.csv @@ -21,3 +21,6 @@ Layouts,Layouts "Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)." "Collections Data","Collections Data" "Collection data files.","Collection data files." +"All Stores","All Stores" +"Other Settings","Other Settings" +Attribute,Attribute diff --git a/app/code/Magento/Store/i18n/en_US.csv b/app/code/Magento/Store/i18n/en_US.csv index e498731b13b2ca4ef3655fbedbdd1abce242bdd7..5cbbe3e5697db62873b9fc7128aaa82510709608 100644 --- a/app/code/Magento/Store/i18n/en_US.csv +++ b/app/code/Magento/Store/i18n/en_US.csv @@ -21,3 +21,6 @@ Layouts,Layouts "Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)." "Collections Data","Collections Data" "Collection data files.","Collection data files." +"All Stores","All Stores" +"Other Settings","Other Settings" +Attribute,Attribute diff --git a/app/code/Magento/Store/i18n/es_ES.csv b/app/code/Magento/Store/i18n/es_ES.csv index e498731b13b2ca4ef3655fbedbdd1abce242bdd7..5cbbe3e5697db62873b9fc7128aaa82510709608 100644 --- a/app/code/Magento/Store/i18n/es_ES.csv +++ b/app/code/Magento/Store/i18n/es_ES.csv @@ -21,3 +21,6 @@ Layouts,Layouts "Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)." "Collections Data","Collections Data" "Collection data files.","Collection data files." +"All Stores","All Stores" +"Other Settings","Other Settings" +Attribute,Attribute diff --git a/app/code/Magento/Store/i18n/fr_FR.csv b/app/code/Magento/Store/i18n/fr_FR.csv index e498731b13b2ca4ef3655fbedbdd1abce242bdd7..5cbbe3e5697db62873b9fc7128aaa82510709608 100644 --- a/app/code/Magento/Store/i18n/fr_FR.csv +++ b/app/code/Magento/Store/i18n/fr_FR.csv @@ -21,3 +21,6 @@ Layouts,Layouts "Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)." "Collections Data","Collections Data" "Collection data files.","Collection data files." +"All Stores","All Stores" +"Other Settings","Other Settings" +Attribute,Attribute diff --git a/app/code/Magento/Store/i18n/nl_NL.csv b/app/code/Magento/Store/i18n/nl_NL.csv index e498731b13b2ca4ef3655fbedbdd1abce242bdd7..5cbbe3e5697db62873b9fc7128aaa82510709608 100644 --- a/app/code/Magento/Store/i18n/nl_NL.csv +++ b/app/code/Magento/Store/i18n/nl_NL.csv @@ -21,3 +21,6 @@ Layouts,Layouts "Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)." "Collections Data","Collections Data" "Collection data files.","Collection data files." +"All Stores","All Stores" +"Other Settings","Other Settings" +Attribute,Attribute diff --git a/app/code/Magento/Store/i18n/pt_BR.csv b/app/code/Magento/Store/i18n/pt_BR.csv index e498731b13b2ca4ef3655fbedbdd1abce242bdd7..5cbbe3e5697db62873b9fc7128aaa82510709608 100644 --- a/app/code/Magento/Store/i18n/pt_BR.csv +++ b/app/code/Magento/Store/i18n/pt_BR.csv @@ -21,3 +21,6 @@ Layouts,Layouts "Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)." "Collections Data","Collections Data" "Collection data files.","Collection data files." +"All Stores","All Stores" +"Other Settings","Other Settings" +Attribute,Attribute diff --git a/app/code/Magento/Store/i18n/zh_Hans_CN.csv b/app/code/Magento/Store/i18n/zh_Hans_CN.csv index e498731b13b2ca4ef3655fbedbdd1abce242bdd7..5cbbe3e5697db62873b9fc7128aaa82510709608 100644 --- a/app/code/Magento/Store/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Store/i18n/zh_Hans_CN.csv @@ -21,3 +21,6 @@ Layouts,Layouts "Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files).","Paths to pre-processed view files (e.g, CSS files with fixed paths or generated from LESS files)." "Collections Data","Collections Data" "Collection data files.","Collection data files." +"All Stores","All Stores" +"Other Settings","Other Settings" +Attribute,Attribute diff --git a/app/code/Magento/Swagger/Controller/Index/Index.php b/app/code/Magento/Swagger/Controller/Index/Index.php index b898836ccf37d59f2b742a7c5b4b14929e2a543d..64cd2888984d1ee98b00256c7bf92f686135096f 100644 --- a/app/code/Magento/Swagger/Controller/Index/Index.php +++ b/app/code/Magento/Swagger/Controller/Index/Index.php @@ -35,7 +35,7 @@ class Index extends \Magento\Framework\App\Action\Action /** * @return \Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { $this->pageConfig->addBodyClass('swagger-section'); return $this->pageFactory->create(); diff --git a/app/code/Magento/Swagger/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Swagger/Test/Unit/Controller/Index/IndexTest.php index 0143601c8995d8f4a4899ebe5f7714e1e84d06d0..015064b2642b901adf018a5ab825529815023bec 100644 --- a/app/code/Magento/Swagger/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Swagger/Test/Unit/Controller/Index/IndexTest.php @@ -8,7 +8,7 @@ namespace Magento\Swagger\Test\Unit\Controller\Index; class IndexTest extends \PHPUnit_Framework_TestCase { - public function testExecute() + public function testExecuteInternal() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -22,6 +22,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase $pageConfigMock->expects($this->once())->method('addBodyClass')->with('swagger-section'); $resultPageFactory->expects($this->once())->method('create'); + /** @var \Magento\Swagger\Controller\Index\Index $model */ $model = $objectManager->getObject( 'Magento\Swagger\Controller\Index\Index', [ @@ -29,6 +30,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase 'pageFactory' => $resultPageFactory ] ); - $model->execute(); + $model->executeInternal(); } } diff --git a/app/code/Magento/Swatches/Controller/Adminhtml/Iframe/Show.php b/app/code/Magento/Swatches/Controller/Adminhtml/Iframe/Show.php index 180a777d1660a5dac87a4a67544d14a524960e62..362e2c7a6c5510b357578943cb3e403bfa423aa5 100644 --- a/app/code/Magento/Swatches/Controller/Adminhtml/Iframe/Show.php +++ b/app/code/Magento/Swatches/Controller/Adminhtml/Iframe/Show.php @@ -68,7 +68,7 @@ class Show extends \Magento\Backend\App\Action * * @return string */ - public function execute() + public function executeInternal() { try { $uploader = $this->uploaderFactory->create(['fileId' => 'datafile']); diff --git a/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php b/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php index e9da825c657cecc7837893af2bf8b459efa3858a..1b9259fb0c61054ec55dc0367ff127a34bd3da29 100644 --- a/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php +++ b/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php @@ -22,7 +22,7 @@ class Save * @return array * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function beforeDispatch(Attribute\Save $subject, RequestInterface $request) + public function beforeExecute(Attribute\Save $subject, RequestInterface $request) { $data = $request->getPostValue(); if (isset($data['frontend_input'])) { diff --git a/app/code/Magento/Swatches/Controller/Ajax/Media.php b/app/code/Magento/Swatches/Controller/Ajax/Media.php index 8827f6f46524ab309dd34255ec1e7d0595e7046b..a487115bbc049499142838fb8276951e29a1575a 100644 --- a/app/code/Magento/Swatches/Controller/Ajax/Media.php +++ b/app/code/Magento/Swatches/Controller/Ajax/Media.php @@ -50,7 +50,7 @@ class Media extends \Magento\Framework\App\Action\Action * * @return string */ - public function execute() + public function executeInternal() { $productMedia = []; if ($productId = (int)$this->getRequest()->getParam('product_id')) { diff --git a/app/code/Magento/Swatches/Setup/InstallData.php b/app/code/Magento/Swatches/Setup/InstallData.php index ac3a90209547164ca3cf9915e4a2d78dd0b2b7df..a97bd81215e37d5e3ca672b80a6b61090ccbec59 100644 --- a/app/code/Magento/Swatches/Setup/InstallData.php +++ b/app/code/Magento/Swatches/Setup/InstallData.php @@ -60,7 +60,7 @@ class InstallData implements InstallDataInterface 'frontend' => 'Magento\Catalog\Model\Product\Attribute\Frontend\Image', 'required' => false, 'sort_order' => 3, - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'used_in_product_listing' => true ] ); diff --git a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Iframe/ShowTest.php b/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Iframe/ShowTest.php index 18ec75cb9664fc3efd7c92fa142e76492377947c..72099cb930faaaec9cccc73dd5bda2384ad74e5e 100644 --- a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Iframe/ShowTest.php +++ b/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Iframe/ShowTest.php @@ -96,7 +96,7 @@ class ShowTest extends \PHPUnit_Framework_TestCase ->expects($this->once()) ->method('create') ->will($this->throwException(new \Exception)); - $this->controller->execute(); + $this->controller->executeInternal(); } /** @@ -132,7 +132,7 @@ class ShowTest extends \PHPUnit_Framework_TestCase $this->responseMock->expects($this->once())->method('setBody')->willReturn(json_encode($expectedResult)); - $this->controller->execute(); + $this->controller->executeInternal(); } public function dataForExecute() diff --git a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php b/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php index c1d0356f66d2dfba9789cda9c598241c9cef4763..ab54e2ceca46f97e657aadf11b78337a2cda1b41 100644 --- a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php +++ b/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php @@ -11,7 +11,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase /** * @dataProvider dataRequest */ - public function testBeforeDispatch($dataRequest, $runTimes) + public function testBeforeExecute($dataRequest, $runTimes) { $subject = $this->getMock('\Magento\Catalog\Controller\Adminhtml\Product\Attribute\Save', [], [], '', false); $request = $this->getMock( @@ -40,7 +40,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $request->expects($this->once())->method('getPostValue')->willReturn($dataRequest); $request->expects($this->exactly($runTimes))->method('setPostValue')->willReturn($this->returnSelf()); - $controller->beforeDispatch($subject, $request); + $controller->beforeExecute($subject, $request); } public function dataRequest() diff --git a/app/code/Magento/Swatches/Test/Unit/Controller/Ajax/MediaTest.php b/app/code/Magento/Swatches/Test/Unit/Controller/Ajax/MediaTest.php index 6358b2d5ccf11cc6850007db480ecba0b85b9c79..83466261a61417063dbe66ccfd50472a6669d0ae 100644 --- a/app/code/Magento/Swatches/Test/Unit/Controller/Ajax/MediaTest.php +++ b/app/code/Magento/Swatches/Test/Unit/Controller/Ajax/MediaTest.php @@ -137,7 +137,7 @@ class MediaTest extends \PHPUnit_Framework_TestCase ->with($this->mediaGallery) ->will($this->returnSelf()); - $result = $this->controller->execute(); + $result = $this->controller->executeInternal(); $this->assertInstanceOf('\Magento\Framework\Controller\Result\Json', $result); } @@ -179,7 +179,7 @@ class MediaTest extends \PHPUnit_Framework_TestCase ->with($this->mediaGallery) ->will($this->returnSelf()); - $result = $this->controller->execute(); + $result = $this->controller->executeInternal(); $this->assertInstanceOf('\Magento\Framework\Controller\Result\Json', $result); } diff --git a/app/code/Magento/Swatches/etc/view.xml b/app/code/Magento/Swatches/etc/view.xml index b880f30786d5d02f127575babf1da0178c567405..dd20b5cec838fdc798fcbc906a48d32a442171a8 100644 --- a/app/code/Magento/Swatches/etc/view.xml +++ b/app/code/Magento/Swatches/etc/view.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Catalog/etc/view.xsd"> +<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/view.xsd"> <media> <images module="Magento_Catalog"> <image id="swatch_image" type="swatch_image"> diff --git a/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/text.phtml b/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/text.phtml index 63af3ebae14bcd7e0610c47b1485aaecd5f5b19f..1cdb50d54a34da6ba0a617a4bd64de64bf10921c 100644 --- a/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/text.phtml +++ b/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/text.phtml @@ -8,7 +8,7 @@ /** @var $block \Magento\Swatches\Block\Adminhtml\Attribute\Edit\Options\Text */ ?> -<fieldset class="fieldset ignore-validate"> +<fieldset class="fieldset"> <legend class="legend"><span><?php /* @escapeNotVerified */ echo __('Manage Swatch (values of your attribute)') ?></span></legend> <div id="swatch-text-options-panel"> <?php //@todo move style to css file ?> @@ -33,16 +33,23 @@ <th class="col-delete"> </th> </tr> </thead> - <tbody data-role="swatch-text-options-container"></tbody> + <tbody data-role="swatch-text-options-container" class="ignore-validate"></tbody> <tfoot> - <th colspan="<?php /* @escapeNotVerified */ echo $storetotal; ?>" class="col-actions-add"> - <?php if (!$block->getReadOnly() && !$block->canManageOptionDefaultOnly()):?> - <button id="add_new_swatch_text_option_button" title="<?php /* @escapeNotVerified */ echo __('Add Swatch'); ?>" - type="button" class="action- scalable add"> - <span><?php /* @escapeNotVerified */ echo __('Add Swatch'); ?></span> - </button> - <?php endif; ?> - </th> + <tr> + <th colspan="<?php /* @escapeNotVerified */ echo $storetotal; ?>"> + <input type="hidden" class="required-swatch-entry"/> + </th> + </tr> + <tr> + <th colspan="<?php /* @escapeNotVerified */ echo $storetotal; ?>" class="col-actions-add"> + <?php if (!$block->getReadOnly() && !$block->canManageOptionDefaultOnly()):?> + <button id="add_new_swatch_text_option_button" title="<?php /* @escapeNotVerified */ echo __('Add Swatch'); ?>" + type="button" class="action- scalable add"> + <span><?php /* @escapeNotVerified */ echo __('Add Swatch'); ?></span> + </button> + <?php endif; ?> + </th> + </tr> </tfoot> </table> <input type="hidden" id="swatch-text-option-count-check" value="" /> diff --git a/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/visual.phtml b/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/visual.phtml index a236cf00dd1ab38353d560feb986ed05001f0a96..3871ccda9a3efeff5c33fb93d60836c6c49de11e 100644 --- a/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/visual.phtml +++ b/app/code/Magento/Swatches/view/adminhtml/templates/catalog/product/attribute/visual.phtml @@ -8,7 +8,7 @@ /** @var $block \Magento\Swatches\Block\Adminhtml\Attribute\Edit\Options\Visual */ ?> -<fieldset class="fieldset ignore-validate"> +<fieldset class="fieldset"> <legend class="legend"><span><?php /* @escapeNotVerified */ echo __('Manage Swatch (values of your attribute)') ?></span></legend> <div id="swatch-visual-options-panel"> <?php //@todo move style to css file ?> @@ -29,16 +29,23 @@ <th class="col-delete"> </th> </tr> </thead> - <tbody data-role="swatch-visual-options-container"></tbody> + <tbody data-role="swatch-visual-options-container" class="ignore-validate"></tbody> <tfoot> - <th colspan="<?php /* @escapeNotVerified */ echo $storetotal; ?>" class="col-actions-add"> - <?php if (!$block->getReadOnly() && !$block->canManageOptionDefaultOnly()):?> - <button id="add_new_swatch_visual_option_button" title="<?php /* @escapeNotVerified */ echo __('Add Swatch'); ?>" - type="button" class="action- scalable add"> - <span><?php /* @escapeNotVerified */ echo __('Add Swatch'); ?></span> - </button> - <?php endif; ?> - </th> + <tr> + <th colspan="<?php /* @escapeNotVerified */ echo $storetotal; ?>"> + <input type="hidden" class="required-swatch-entry"/> + </th> + </tr> + <tr> + <th colspan="<?php /* @escapeNotVerified */ echo $storetotal; ?>" class="col-actions-add"> + <?php if (!$block->getReadOnly() && !$block->canManageOptionDefaultOnly()):?> + <button id="add_new_swatch_visual_option_button" title="<?php /* @escapeNotVerified */ echo __('Add Swatch'); ?>" + type="button" class="action- scalable add"> + <span><?php /* @escapeNotVerified */ echo __('Add Swatch'); ?></span> + </button> + <?php endif; ?> + </th> + </tr> </tfoot> </table> <input type="hidden" id="swatch-visual-option-count-check" value="" /> diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Add.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Add.php index 2fe8a5b1572e38dcf05676653a2fd8d633ca38ed..a7f555a1706538685d07788172a2f427f4e6b39c 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Add.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Add.php @@ -15,7 +15,7 @@ class Add extends \Magento\Tax\Controller\Adminhtml\Rate * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $this->_coreRegistry->register( RegistryConstants::CURRENT_TAX_RATE_FORM_DATA, diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxDelete.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxDelete.php index 5f58a4147aceb7bc992061f49bd8bc3f95e55dae..f8a99e226f73ad42b60a9c33fdc33f8e589bd183 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxDelete.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxDelete.php @@ -15,7 +15,7 @@ class AjaxDelete extends \Magento\Tax\Controller\Adminhtml\Rate * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $rateId = (int)$this->getRequest()->getParam('tax_calculation_rate_id'); try { diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxLoad.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxLoad.php index 673ea280bab25ed504a240bfcddb25d1e2cbadfe..e824a8185ac1207c8d432f1c9317fddccbde8ee6 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxLoad.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxLoad.php @@ -16,7 +16,7 @@ class AjaxLoad extends \Magento\Tax\Controller\Adminhtml\Rate * * @return void */ - public function execute() + public function executeInternal() { $rateId = (int)$this->getRequest()->getParam('id'); try { diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxSave.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxSave.php index 8dd31f2ca5b337de41af933986a6a88f11330737..635d116a31d4c7bfcc2c9d600bd6780c50c9f23d 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxSave.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/AjaxSave.php @@ -15,7 +15,7 @@ class AjaxSave extends \Magento\Tax\Controller\Adminhtml\Rate * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { try { $rateData = $this->_processRateData($this->getRequest()->getPostValue()); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Delete.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Delete.php index c11f420db32e3f972a9f12a340e929520433fb6c..c6794eaf0ab7e3632d48be666dee4efab0fc51af 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Delete.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Delete.php @@ -16,7 +16,7 @@ class Delete extends \Magento\Tax\Controller\Adminhtml\Rate * * @return \Magento\Backend\Model\View\Result\Redirect|void */ - public function execute() + public function executeInternal() { if ($rateId = $this->getRequest()->getParam('rate')) { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Edit.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Edit.php index e13ae2293e6c22bb6ec6e3493b0d6798864decd9..a5e2fbf1a05a855a98709afbf5c1f020b483781c 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Edit.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Edit.php @@ -17,7 +17,7 @@ class Edit extends \Magento\Tax\Controller\Adminhtml\Rate * * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $rateId = (int)$this->getRequest()->getParam('rate'); $this->_coreRegistry->register(RegistryConstants::CURRENT_TAX_RATE_ID, $rateId); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Index.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Index.php index d38d6ddd9af1407a69f268cb085eafcf9d84ad77..145341f4f2035d3cc00e6cb8d11f1054aacab0ba 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Index.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Tax\Controller\Adminhtml\Rate * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->initResultPage(); $resultPage->addBreadcrumb(__('Manage Tax Rates'), __('Manage Tax Rates')); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Save.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Save.php index 442940fdfc5eab10131966b7e5814f76080cd553..85cf89a9e8570928e03b1f14f89adf1b38b1e2b5 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Save.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Save.php @@ -16,7 +16,7 @@ class Save extends \Magento\Tax\Controller\Adminhtml\Rate * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Delete.php b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Delete.php index 9d862df7d5a79494a4f41ebdb68f0b5364645717..7dd9f40e4df3b9a907a2edee1a553017695fe142 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Delete.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Tax\Controller\Adminhtml\Rule /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Edit.php b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Edit.php index ebbabcf833aed5f6eea84d58dfd91ffa35514a08..89b49f16feb43d0477f619b32dcffa857c6c0b82 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Edit.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Tax\Controller\Adminhtml\Rule /** * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $taxRuleId = $this->getRequest()->getParam('rule'); $this->_coreRegistry->register('tax_rule_id', $taxRuleId); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Index.php b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Index.php index b3ea7586cf90bd507139b000ea52e8f3ac414735..e3aab07b459f0f037e566cf13b20bc8bea98911f 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Index.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Index.php @@ -12,7 +12,7 @@ class Index extends \Magento\Tax\Controller\Adminhtml\Rule /** * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->initResultPage(); $resultPage->getConfig()->getTitle()->prepend(__('Tax Rules')); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rule/NewAction.php b/app/code/Magento/Tax/Controller/Adminhtml/Rule/NewAction.php index 79f4fa7d752e72dafcb21e342d5aa95dd3af57fd..74bd5b1c57ab505c752e012788c79581588aaff3 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rule/NewAction.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rule/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\Tax\Controller\Adminhtml\Rule /** * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultFactory->create(ResultFactory::TYPE_FORWARD); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Save.php b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Save.php index 27e75cf819b06027bbe18007d4bea1a53ed06efc..d050cbd6773c1c2aae4cef430e01d0065200aac2 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rule/Save.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rule/Save.php @@ -13,7 +13,7 @@ class Save extends \Magento\Tax\Controller\Adminhtml\Rule /** * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php b/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php index 8e5e003872d7d6e345fd05739f1e3d044c3af0eb..37edd84177d6abc71bb33560e479be12ad5dc6e6 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php @@ -15,7 +15,7 @@ class AjaxDelete extends \Magento\Tax\Controller\Adminhtml\Tax * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $classId = (int)$this->getRequest()->getParam('class_id'); try { diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxSave.php b/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxSave.php index 68527988b903bc916989bc15ef5be97c269cd597..92647155fbedbba60ca444bce6eba58573a5ff1f 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxSave.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxSave.php @@ -15,7 +15,7 @@ class AjaxSave extends \Magento\Tax\Controller\Adminhtml\Tax * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { try { $taxClassId = (int)$this->getRequest()->getPost('class_id') ?: null; diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Tax/IgnoreTaxNotification.php b/app/code/Magento/Tax/Controller/Adminhtml/Tax/IgnoreTaxNotification.php index 89ab88a5965a07d63ce3bdb7374604fe6e3d78cc..18860dd4891d698712df356f4c958e3de46eaa84 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Tax/IgnoreTaxNotification.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Tax/IgnoreTaxNotification.php @@ -37,7 +37,7 @@ class IgnoreTaxNotification extends \Magento\Tax\Controller\Adminhtml\Tax * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $section = $this->getRequest()->getParam('section'); if ($section) { diff --git a/app/code/Magento/Tax/CustomerData/CheckoutTotalsJsLayoutDataProvider.php b/app/code/Magento/Tax/CustomerData/CheckoutTotalsJsLayoutDataProvider.php index 61a94b5a84887f13d8d32767fa0b57a8e82abd3d..35af16ecba53dc6f82b323786fe2f7ecf3a3e14a 100644 --- a/app/code/Magento/Tax/CustomerData/CheckoutTotalsJsLayoutDataProvider.php +++ b/app/code/Magento/Tax/CustomerData/CheckoutTotalsJsLayoutDataProvider.php @@ -61,7 +61,7 @@ class CheckoutTotalsJsLayoutDataProvider implements JsLayoutDataProviderInterfac protected function getTotalsConfig() { return [ - 'display_subtotal_incl_tax' => (int)$this->taxConfig->displayCartSubtotalInclTax(), + 'display_cart_subtotal_incl_tax' => (int)$this->taxConfig->displayCartSubtotalInclTax(), 'display_cart_subtotal_excl_tax' => (int)$this->taxConfig->displayCartSubtotalExclTax(), ]; } diff --git a/app/code/Magento/Tax/Model/App/Action/ContextPlugin.php b/app/code/Magento/Tax/Model/App/Action/ContextPlugin.php index 70c1e60007141d675030aad37c53357494fe7086..408cb5aad84f274d64b4753db76d6cd1b6b7298b 100644 --- a/app/code/Magento/Tax/Model/App/Action/ContextPlugin.php +++ b/app/code/Magento/Tax/Model/App/Action/ContextPlugin.php @@ -79,7 +79,7 @@ class ContextPlugin * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundDispatch( + public function aroundExecute( \Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/app/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php b/app/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php index 05bd7fd103dbf27124974334778fe7cc9b429b8b..488cba181ade7669f1267b9c3566ac4348e7570e 100644 --- a/app/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php +++ b/app/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php @@ -28,7 +28,7 @@ abstract class AbstractAggregateCalculator extends AbstractCalculator $priceInclTax = $this->calculationTool->round($item->getUnitPrice()); $rowTotalInclTax = $priceInclTax * $quantity; if (!$this->isSameRateAsStore($rate, $storeRate)) { - $priceInclTax = $this->calculatePriceInclTax($priceInclTax, $storeRate, $rate); + $priceInclTax = $this->calculatePriceInclTax($priceInclTax, $storeRate, $rate, $round); $rowTotalInclTax = $priceInclTax * $quantity; } $rowTaxExact = $this->calculationTool->calcTaxAmount($rowTotalInclTax, $rate, true, false); diff --git a/app/code/Magento/Tax/Model/Calculation/AbstractCalculator.php b/app/code/Magento/Tax/Model/Calculation/AbstractCalculator.php index d8ab3e259b27960515c7e1f19196132023215349..8f37546c839b79f2c38bf118c636b2ca5a4d32e9 100644 --- a/app/code/Magento/Tax/Model/Calculation/AbstractCalculator.php +++ b/app/code/Magento/Tax/Model/Calculation/AbstractCalculator.php @@ -433,14 +433,18 @@ abstract class AbstractCalculator * @param float $storePriceInclTax * @param float $storeRate * @param float $customerRate + * @param boolean $round * @return float */ - protected function calculatePriceInclTax($storePriceInclTax, $storeRate, $customerRate) + protected function calculatePriceInclTax($storePriceInclTax, $storeRate, $customerRate, $round = true) { $storeTax = $this->calculationTool->calcTaxAmount($storePriceInclTax, $storeRate, true, false); $priceExclTax = $storePriceInclTax - $storeTax; $customerTax = $this->calculationTool->calcTaxAmount($priceExclTax, $customerRate, false, false); - $customerPriceInclTax = $this->calculationTool->round($priceExclTax + $customerTax); + $customerPriceInclTax = $priceExclTax + $customerTax; + if ($round) { + $customerPriceInclTax = $this->calculationTool->round($customerPriceInclTax); + } return $customerPriceInclTax; } } diff --git a/app/code/Magento/Tax/Model/Calculation/UnitBaseCalculator.php b/app/code/Magento/Tax/Model/Calculation/UnitBaseCalculator.php index 37c22cf5e147c4d4c7a01420650dd39a71d3e7da..fa8fa61379295bf6304781cad377f1123471b39e 100644 --- a/app/code/Magento/Tax/Model/Calculation/UnitBaseCalculator.php +++ b/app/code/Magento/Tax/Model/Calculation/UnitBaseCalculator.php @@ -45,7 +45,7 @@ class UnitBaseCalculator extends AbstractCalculator $applyTaxAfterDiscount = $this->config->applyTaxAfterDiscount($this->storeId); $priceInclTax = $this->calculationTool->round($item->getUnitPrice()); if (!$this->isSameRateAsStore($rate, $storeRate)) { - $priceInclTax = $this->calculatePriceInclTax($priceInclTax, $storeRate, $rate); + $priceInclTax = $this->calculatePriceInclTax($priceInclTax, $storeRate, $rate, $round); } $uniTax = $this->calculationTool->calcTaxAmount($priceInclTax, $rate, true, false); $deltaRoundingType = self::KEY_REGULAR_DELTA_ROUNDING; diff --git a/app/code/Magento/Tax/Model/Config/Notification.php b/app/code/Magento/Tax/Model/Config/Notification.php index 1373b4659841916f193f176add390e101e4cb395..7187eb134b1a646f5f079d58232e10203113ec69 100644 --- a/app/code/Magento/Tax/Model/Config/Notification.php +++ b/app/code/Magento/Tax/Model/Config/Notification.php @@ -21,6 +21,7 @@ class Notification extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Config\Model\ResourceModel\Config $resourceConfig * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -30,19 +31,20 @@ class Notification extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Config\Model\ResourceModel\Config $resourceConfig, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->resourceConfig = $resourceConfig; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** * Prepare and store cron settings after save * - * @return \Magento\Tax\Model\Config\Notification + * @return $this */ public function afterSave() { @@ -50,7 +52,7 @@ class Notification extends \Magento\Framework\App\Config\Value $this->_resetNotificationFlag(\Magento\Tax\Model\Config::XML_PATH_TAX_NOTIFICATION_IGNORE_DISCOUNT); $this->_resetNotificationFlag(\Magento\Tax\Model\Config::XML_PATH_TAX_NOTIFICATION_IGNORE_PRICE_DISPLAY); } - return parent::afterSave($this); + return parent::afterSave(); } /** diff --git a/app/code/Magento/Tax/Model/Config/TaxClass.php b/app/code/Magento/Tax/Model/Config/TaxClass.php index 95b643be212841013fcd1e1620e8c5ed6ee138b5..c2993332e4db0b8e044d684c6a0dbfd6c637fdaa 100644 --- a/app/code/Magento/Tax/Model/Config/TaxClass.php +++ b/app/code/Magento/Tax/Model/Config/TaxClass.php @@ -24,6 +24,7 @@ class TaxClass extends \Magento\Framework\App\Config\Value * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Config\Model\ResourceModel\Config $resourceConfig * @param \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource @@ -34,6 +35,7 @@ class TaxClass extends \Magento\Framework\App\Config\Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Config\Model\ResourceModel\Config $resourceConfig, \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, @@ -42,15 +44,15 @@ class TaxClass extends \Magento\Framework\App\Config\Value ) { $this->resourceConfig = $resourceConfig; $this->attributeFactory = $attributeFactory; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** * Update the default product tax class * - * @return \Magento\Tax\Model\Config\TaxClass + * @return $this */ - protected function _afterSave() + public function afterSave() { $attributeCode = "tax_class_id"; @@ -62,6 +64,6 @@ class TaxClass extends \Magento\Framework\App\Config\Value $attribute->setData("default_value", $this->getData('value')); $attribute->save(); - return parent::_afterSave($this); + return parent::afterSave(); } } diff --git a/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php b/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php index c1cd2b9927c2fb1ba0db506fba2bf61a96344c05..34562754e0893aa11164945fc8e837db67c19d1b 100644 --- a/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php +++ b/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php @@ -88,6 +88,7 @@ class Tax extends CommonTaxCollector * @param ShippingAssignmentInterface $shippingAssignment * @param Address\Total $total * @return $this + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function collect( \Magento\Quote\Model\Quote $quote, @@ -291,6 +292,7 @@ class Tax extends CommonTaxCollector * @param Address\Total $total * @return array|null * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ public function fetch(\Magento\Quote\Model\Quote $quote, \Magento\Quote\Model\Quote\Address\Total $total) { @@ -298,6 +300,10 @@ class Tax extends CommonTaxCollector $store = $quote->getStore(); $applied = $total->getAppliedTaxes(); $amount = $total->getTaxAmount(); + if ($amount == null) { + $this->enhanceTotalData($quote, $total); + $amount = $total->getTaxAmount(); + } $taxAmount = $amount + $total->getTotalAmount('discount_tax_compensation'); $area = null; @@ -340,6 +346,44 @@ class Tax extends CommonTaxCollector return $totals; } + /** + * Adds minimal tax information to the "total" data structure + * + * @param \Magento\Quote\Model\Quote $quote + * @param Address\Total $total + * @return null + */ + protected function enhanceTotalData( + \Magento\Quote\Model\Quote $quote, + \Magento\Quote\Model\Quote\Address\Total $total + ) { + $taxAmount = 0; + $shippingTaxAmount = 0; + $discountTaxCompensation = 0; + + $subtotalInclTax = $total->getSubtotalInclTax(); + $computeSubtotalInclTax = true; + if ($total->getSubtotalInclTax() > 0) { + $computeSubtotalInclTax = false; + } + + /** @var \Magento\Quote\Model\Quote\Address $address */ + foreach ($quote->getAllAddresses() as $address) { + $taxAmount += $address->getTaxAmount(); + $shippingTaxAmount += $address->getShippingTaxAmount(); + $discountTaxCompensation += $address->getDiscountTaxCompensationAmount(); + if ($computeSubtotalInclTax) { + $subtotalInclTax += $address->getSubtotalInclTax(); + } + } + + $total->setTaxAmount($taxAmount); + $total->setShippingTaxAmount($shippingTaxAmount); + $total->setDiscountTaxCompensationAmount($discountTaxCompensation); // accessed via 'discount_tax_compensation' + $total->setSubtotalInclTax($subtotalInclTax); + return; + } + /** * Process model configuration array. * This method can be used for changing totals collect sort order diff --git a/app/code/Magento/Tax/Setup/InstallData.php b/app/code/Magento/Tax/Setup/InstallData.php index 75f636abb3ee2fd40e7294499bc6543d6c1d25b8..2400deda8bd4069302733f8682880fa72fa5f3e6 100644 --- a/app/code/Magento/Tax/Setup/InstallData.php +++ b/app/code/Magento/Tax/Setup/InstallData.php @@ -56,7 +56,7 @@ class InstallData implements InstallDataInterface 'input' => 'select', 'class' => '', 'source' => 'Magento\Tax\Model\TaxClass\Source\Product', - 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'visible' => true, 'required' => false, 'user_defined' => false, diff --git a/app/code/Magento/Tax/Test/Unit/App/Action/ContextPluginTest.php b/app/code/Magento/Tax/Test/Unit/App/Action/ContextPluginTest.php index f8ab3eb71e9bc3ecb28705641ce93a335dd997d1..7fc90aa1d649b8d6ba826164b0d2fff9d8536ccb 100644 --- a/app/code/Magento/Tax/Test/Unit/App/Action/ContextPluginTest.php +++ b/app/code/Magento/Tax/Test/Unit/App/Action/ContextPluginTest.php @@ -111,9 +111,9 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase * @param bool $cache * @param bool $taxEnabled * @param bool $loggedIn - * @dataProvider dataProviderAroundDispatch + * @dataProvider dataProviderAroundExecute */ - public function testAroundDispatch($cache, $taxEnabled, $loggedIn) + public function testAroundExecute($cache, $taxEnabled, $loggedIn) { $this->customerSessionMock->expects($this->any()) ->method('isLoggedIn') @@ -164,14 +164,14 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase $proceed = function ($request) use ($expectedResult) { return $expectedResult; }; - $this->contextPlugin->aroundDispatch($action, $proceed, $request); + $this->contextPlugin->aroundExecute($action, $proceed, $request); } } /** * @return array */ - public function dataProviderAroundDispatch() + public function dataProviderAroundExecute() { return [ [false, false, false], diff --git a/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Rate/AjaxLoadTest.php b/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Rate/AjaxLoadTest.php index 6373e5aa514bf11a2d6174c78e64489bd7d558b0..ffc1521938206ca8d57bc80762c0799614ffe7c1 100644 --- a/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Rate/AjaxLoadTest.php +++ b/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Rate/AjaxLoadTest.php @@ -52,7 +52,7 @@ class AjaxLoadTest extends \PHPUnit_Framework_TestCase /** * Executes the controller action and asserts non exception logic */ - public function testExecute() + public function testExecuteInternal() { $taxRateId=1; $returnArray=[ @@ -120,7 +120,8 @@ class AjaxLoadTest extends \PHPUnit_Framework_TestCase ->with(\Magento\Framework\Controller\ResultFactory::TYPE_JSON) ->willReturn($jsonObject); - $notification = $objectManager->getObject( + /** @var \Magento\Tax\Controller\Adminhtml\Rate\AjaxLoad $controller */ + $controller = $objectManager->getObject( 'Magento\Tax\Controller\Adminhtml\Rate\AjaxLoad', [ 'taxRateRepository' => $this->taxRateRepository, @@ -132,14 +133,14 @@ class AjaxLoadTest extends \PHPUnit_Framework_TestCase // No exception thrown - $this->assertSame($jsonObject, $notification->execute()); + $this->assertSame($jsonObject, $controller->executeInternal()); } /** * Check if validation throws a localized catched exception in case of incorrect id */ - public function testExecuteLocalizedException() + public function testExecuteInternalLocalizedException() { $taxRateId=999; $exceptionMessage='No such entity with taxRateId = '.$taxRateId; @@ -173,7 +174,8 @@ class AjaxLoadTest extends \PHPUnit_Framework_TestCase ->with(\Magento\Framework\Controller\ResultFactory::TYPE_JSON) ->willReturn($jsonObject); - $notification = $objectManager->getObject( + /** @var \Magento\Tax\Controller\Adminhtml\Rate\AjaxLoad $controller */ + $controller = $objectManager->getObject( 'Magento\Tax\Controller\Adminhtml\Rate\AjaxLoad', [ 'taxRateRepository' => $this->taxRateRepository, @@ -183,13 +185,13 @@ class AjaxLoadTest extends \PHPUnit_Framework_TestCase ); //exception thrown with catch - $this->assertSame($jsonObject, $notification->execute()); + $this->assertSame($jsonObject, $controller->executeInternal()); } /** * Check if validation throws a localized catched exception in case of incorrect id */ - public function testExecuteException() + public function testExecuteInternalException() { $taxRateId=999; $exceptionMessage=__('An error occurred while loading this tax rate.'); @@ -223,7 +225,8 @@ class AjaxLoadTest extends \PHPUnit_Framework_TestCase ->with(\Magento\Framework\Controller\ResultFactory::TYPE_JSON) ->willReturn($jsonObject); - $notification = $objectManager->getObject( + /** @var \Magento\Tax\Controller\Adminhtml\Rate\AjaxLoad $controller */ + $controller = $objectManager->getObject( 'Magento\Tax\Controller\Adminhtml\Rate\AjaxLoad', [ 'taxRateRepository' => $this->taxRateRepository, @@ -233,6 +236,6 @@ class AjaxLoadTest extends \PHPUnit_Framework_TestCase ); //exception thrown with catch - $this->assertSame($jsonObject, $notification->execute()); + $this->assertSame($jsonObject, $controller->executeInternal()); } } diff --git a/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Tax/IgnoreTaxNotificationTest.php b/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Tax/IgnoreTaxNotificationTest.php index cb3b6df297260c27929ae31110a84d69ade6c41b..88656b9e4da946795e76ad775348f84137d0add8 100644 --- a/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Tax/IgnoreTaxNotificationTest.php +++ b/app/code/Magento/Tax/Test/Unit/Controller/Adminhtml/Tax/IgnoreTaxNotificationTest.php @@ -10,7 +10,7 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class IgnoreTaxNotificationTest extends \PHPUnit_Framework_TestCase { - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManager($this); $cacheTypeList = $this->getMockBuilder('\Magento\Framework\App\Cache\TypeList') @@ -63,7 +63,8 @@ class IgnoreTaxNotificationTest extends \PHPUnit_Framework_TestCase ->method('get') ->willReturn($config); - $notification = $objectManager->getObject( + /** @var \Magento\Tax\Controller\Adminhtml\Tax\IgnoreTaxNotification $controller */ + $controller = $objectManager->getObject( 'Magento\Tax\Controller\Adminhtml\Tax\IgnoreTaxNotification', [ 'objectManager' => $manager, @@ -74,6 +75,6 @@ class IgnoreTaxNotificationTest extends \PHPUnit_Framework_TestCase ); // No exception thrown - $this->assertSame($resultRedirect, $notification->execute()); + $this->assertSame($resultRedirect, $controller->executeInternal()); } } diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php index c4c271aef036101adb3366f5ab3588f7f65b2ed6..da0d9154d19bc7dd4be291a96537fdcde10e983f 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php +++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseAndTotalBaseCalculatorTestCase.php @@ -20,6 +20,9 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase const RATE = 10; const STORE_RATE = 11; + const UNIT_PRICE_INCL_TAX = 495.49549549545; + const UNIT_PRICE_INCL_TAX_ROUNDED = 495.5; + const CODE = 'CODE'; const TYPE = 'TYPE'; @@ -71,7 +74,7 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase { $this->initMockItem($isTaxIncluded); $this->initMockConfig(); - $this->initMockCalculationTool(); + $this->initMockCalculationTool($isTaxIncluded); $this->initMockAppliedTaxDataObjectFactory(); } @@ -93,7 +96,7 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase $this->mockCalculationTool = $this->getMockBuilder('\Magento\Tax\Model\Calculation') ->disableOriginalConstructor() ->setMethods( - ['__wakeup', 'round', 'getRate', 'getStoreRate', 'getRateRequest', 'getAppliedRates', 'calcTaxAmount'] + ['__wakeup', 'round', 'getRate', 'getStoreRate', 'getRateRequest', 'getAppliedRates'] ) ->getMock(); $this->mockConfig = $this->getMockBuilder('\Magento\Tax\Model\Config') @@ -129,11 +132,12 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase /** * @param $calculator RowBaseCalculator|TotalBaseCalculator + * @param boolean $round * @return \Magento\Tax\Api\Data\TaxDetailsItemInterface */ - public function calculate($calculator) + public function calculate($calculator, $round = true) { - return $calculator->calculate($this->mockItem, 1); + return $calculator->calculate($this->mockItem, 1, $round); } /** @@ -147,7 +151,7 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase $this->mockItem, [ [ - self::ONCE => true, + self::ONCE => false, self::MOCK_METHOD_NAME => 'getDiscountAmount', self::MOCK_VALUE => 1, ], @@ -157,17 +161,17 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase self::MOCK_VALUE => self::CODE ], [ - self::ONCE => true, + self::ONCE => false, self::MOCK_METHOD_NAME => 'getType', self::MOCK_VALUE => self::TYPE ], [ - self::ONCE => true, + self::ONCE => false, self::MOCK_METHOD_NAME => 'getUnitPrice', self::MOCK_VALUE => self::UNIT_PRICE ], [ - self::ONCE => true, + self::ONCE => false, self::MOCK_METHOD_NAME => 'getIsTaxIncluded', self::MOCK_VALUE => $isTaxIncluded ] @@ -185,7 +189,7 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase $this->mockConfig, [ [ - self::ONCE => true, + self::ONCE => false, self::MOCK_METHOD_NAME => 'applyTaxAfterDiscount', self::MOCK_VALUE => true, ] @@ -196,47 +200,55 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase /** * init mock calculation model * + * @param boolean $isTaxIncluded */ - protected function initMockCalculationTool() + protected function initMockCalculationTool($isTaxIncluded) { - $this->mockReturnValues( - $this->mockCalculationTool, + $mockValues = [ [ - [ - self::ONCE => false, - self::MOCK_METHOD_NAME => 'calcTaxAmount', - self::MOCK_VALUE => 1.5, - ], - [ - self::ONCE => true, - self::MOCK_METHOD_NAME => 'getRate', - self::MOCK_VALUE => self::RATE - ], - [ - self::ONCE => true, - self::MOCK_METHOD_NAME => 'getAppliedRates', - self::MOCK_VALUE => [ - [ - 'id' => 0, - 'percent' => 1.4, - 'rates' => [ - [ - 'code' => 'sku_1', - 'title' => 'title1', - 'percent' => 1.1, - ], + self::ONCE => false, + self::MOCK_METHOD_NAME => 'getRate', + self::MOCK_VALUE => self::RATE + ], + [ + self::ONCE => false, + self::MOCK_METHOD_NAME => 'getAppliedRates', + self::MOCK_VALUE => [ + [ + 'id' => 0, + 'percent' => 1.4, + 'rates' => [ + [ + 'code' => 'sku_1', + 'title' => 'title1', + 'percent' => 1.1, ], ], - ] - ], - [ - self::ONCE => false, - self::MOCK_METHOD_NAME => 'round', - self::MOCK_VALUE => 1.3 + ], ] - ] + ], + ]; + + if ($isTaxIncluded) { + $mockValues[] = [ + self::ONCE => false, + self::MOCK_METHOD_NAME => 'getStoreRate', + self::MOCK_VALUE => self::STORE_RATE + ]; + } + + $this->mockReturnValues( + $this->mockCalculationTool, + $mockValues ); + $this->mockCalculationTool->expects($this->atLeastOnce()) + ->method('round') + ->willReturnCallback( + function ($price) { + return round($price, 2); + } + ); } /** @@ -249,7 +261,7 @@ class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit_Framework_TestCase $this->appliedTaxDataObjectFactory, [ [ - self::ONCE => true, + self::ONCE => false, self::MOCK_METHOD_NAME => 'create', self::MOCK_VALUE => $this->mockAppliedTax, ] diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseCalculatorTest.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseCalculatorTest.php index 3de3c4b10ea28f0805e3598ad8bd581288339c88..ebf9239463a61ceaa05dde8fd99bb42cee6e62cf 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseCalculatorTest.php +++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/RowBaseCalculatorTest.php @@ -26,8 +26,15 @@ class RowBaseCalculatorTest extends RowBaseAndTotalBaseCalculatorTestCase $this->assertSame( $this->taxDetailsItem, - $this->calculate($this->rowBaseCalculator) + $this->calculate($this->rowBaseCalculator, true) + ); + $this->assertEquals(self::UNIT_PRICE_INCL_TAX_ROUNDED, $this->taxDetailsItem->getPriceInclTax()); + + $this->assertSame( + $this->taxDetailsItem, + $this->calculate($this->rowBaseCalculator, false) ); + $this->assertEquals(self::UNIT_PRICE_INCL_TAX, $this->taxDetailsItem->getPriceInclTax()); } public function testCalculateWithTaxNotInPrice() diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/TotalBaseCalculatorTest.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/TotalBaseCalculatorTest.php index 880b9d57c81b56cc4750fa4da8de4cd6496c0495..d5c0c0ef85c8701778a651540880d8d6f8439dd6 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/TotalBaseCalculatorTest.php +++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/TotalBaseCalculatorTest.php @@ -22,6 +22,21 @@ class TotalBaseCalculatorTest extends RowBaseAndTotalBaseCalculatorTestCase $this->taxDetailsItem, $this->calculate($this->totalBaseCalculator) ); + $this->assertEquals(self::UNIT_PRICE_INCL_TAX_ROUNDED, $this->taxDetailsItem->getPriceInclTax()); + } + + public function testCalculateWithTaxInPriceNoRounding() + { + $this->initTotalBaseCalculator(); + $this->totalBaseCalculator->expects($this->exactly(3)) + ->method('deltaRound')->will($this->returnValue(0)); + $this->initMocks(true); + + $this->assertSame( + $this->taxDetailsItem, + $this->calculate($this->totalBaseCalculator, false) + ); + $this->assertEquals(self::UNIT_PRICE_INCL_TAX, $this->taxDetailsItem->getPriceInclTax()); } public function testCalculateWithTaxNotInPrice() diff --git a/app/code/Magento/Tax/Test/Unit/Model/Calculation/UnitBaseCalculatorTest.php b/app/code/Magento/Tax/Test/Unit/Model/Calculation/UnitBaseCalculatorTest.php index 9f69f1a2035bf1f8bd629490d795f0f64c1007c3..bed813c1f188860769a2316b55ed3665781d6f8f 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/Calculation/UnitBaseCalculatorTest.php +++ b/app/code/Magento/Tax/Test/Unit/Model/Calculation/UnitBaseCalculatorTest.php @@ -18,7 +18,10 @@ class UnitBaseCalculatorTest extends \PHPUnit_Framework_TestCase const CODE = 'CODE'; const TYPE = 'TYPE'; - const ROW_TAX = 44.954136954136; + const ROW_TAX = 44.958682408681; + const ROW_TAX_ROUNDED = 44.95; + const PRICE_INCL_TAX = 495.4954954955; + const PRICE_INCL_TAX_ROUNDED = 495.50; /** @var \PHPUnit_Framework_MockObject_MockObject */ protected $taxDetailsItemDataObjectFactoryMock; @@ -68,7 +71,11 @@ class UnitBaseCalculatorTest extends \PHPUnit_Framework_TestCase $this->mockCalculationTool->expects($this->any()) ->method('round') ->withAnyParameters() - ->will($this->returnArgument(0)); + ->willReturnCallback( + function ($price) { + return round($price, 2); + } + ); $this->mockConfig = $this->getMockBuilder('\Magento\Tax\Model\Config') ->disableOriginalConstructor() ->getMock(); @@ -113,26 +120,26 @@ class UnitBaseCalculatorTest extends \PHPUnit_Framework_TestCase public function testCalculateWithTaxInPrice() { $mockItem = $this->getMockItem(); - $mockItem->expects($this->once()) + $mockItem->expects($this->atLeastOnce()) ->method('getIsTaxIncluded') ->will($this->returnValue(true)); - $this->mockConfig->expects($this->once()) + $this->mockConfig->expects($this->atLeastOnce()) ->method('crossBorderTradeEnabled') ->will($this->returnValue(false)); - $this->mockConfig->expects($this->once()) + $this->mockConfig->expects($this->atLeastOnce()) ->method('applyTaxAfterDiscount') ->will($this->returnValue(true)); - $this->mockCalculationTool->expects($this->once()) + $this->mockCalculationTool->expects($this->atLeastOnce()) ->method('getRate') ->with($this->addressRateRequest) ->will($this->returnValue(self::RATE)); - $this->mockCalculationTool->expects($this->once()) + $this->mockCalculationTool->expects($this->atLeastOnce()) ->method('getStoreRate') ->with($this->addressRateRequest, self::STORE_ID) ->will($this->returnValue(self::STORE_RATE)); - $this->mockCalculationTool->expects($this->once()) + $this->mockCalculationTool->expects($this->atLeastOnce()) ->method('getAppliedRates') ->withAnyParameters() ->will($this->returnValue([])); @@ -140,7 +147,14 @@ class UnitBaseCalculatorTest extends \PHPUnit_Framework_TestCase $this->assertSame($this->taxDetailsItem, $this->model->calculate($mockItem, self::QUANTITY)); $this->assertSame(self::CODE, $this->taxDetailsItem->getCode()); $this->assertSame(self::TYPE, $this->taxDetailsItem->getType()); + $this->assertSame(self::ROW_TAX_ROUNDED, $this->taxDetailsItem->getRowTax()); + $this->assertEquals(self::PRICE_INCL_TAX_ROUNDED, $this->taxDetailsItem->getPriceInclTax()); + + $this->assertSame($this->taxDetailsItem, $this->model->calculate($mockItem, self::QUANTITY, false)); + $this->assertSame(self::CODE, $this->taxDetailsItem->getCode()); + $this->assertSame(self::TYPE, $this->taxDetailsItem->getType()); $this->assertSame(self::ROW_TAX, $this->taxDetailsItem->getRowTax()); + $this->assertEquals(self::PRICE_INCL_TAX, $this->taxDetailsItem->getPriceInclTax()); } public function testCalculateWithTaxNotInPrice() @@ -178,16 +192,16 @@ class UnitBaseCalculatorTest extends \PHPUnit_Framework_TestCase $mockItem = $this->getMockBuilder('Magento\Tax\Api\Data\QuoteDetailsItemInterface') ->disableOriginalConstructor() ->getMock(); - $mockItem->expects($this->once()) + $mockItem->expects($this->atLeastOnce()) ->method('getDiscountAmount') ->will($this->returnValue(1)); $mockItem->expects($this->atLeastOnce()) ->method('getCode') ->will($this->returnValue(self::CODE)); - $mockItem->expects($this->once()) + $mockItem->expects($this->atLeastOnce()) ->method('getType') ->will($this->returnValue(self::TYPE)); - $mockItem->expects($this->once()) + $mockItem->expects($this->atLeastOnce()) ->method('getUnitPrice') ->will($this->returnValue(self::UNIT_PRICE)); diff --git a/app/code/Magento/Tax/Test/Unit/Model/Sales/Total/Quote/TaxTest.php b/app/code/Magento/Tax/Test/Unit/Model/Sales/Total/Quote/TaxTest.php index b5c223f0a6287acf8ad920a7b35cc6391a2a95e7..ee093ee6807bc586dc2ee41a1179d396726afc7a 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/Sales/Total/Quote/TaxTest.php +++ b/app/code/Magento/Tax/Test/Unit/Model/Sales/Total/Quote/TaxTest.php @@ -576,7 +576,7 @@ class TaxTest extends \PHPUnit_Framework_TestCase /** * Tests the specific method * - * @param string $itemData + * @param string $appliedTaxesData * @param array $addressData * * @dataProvider dataProviderFetchArray @@ -584,7 +584,8 @@ class TaxTest extends \PHPUnit_Framework_TestCase */ public function testFetch($appliedTaxesData, $addressData) { - $methods = ['getAppliedTaxes', 'getTaxAmount', 'getTotalAmount', 'getGrandTotal', 'getSubtotalInclTax']; + $taxAmount = 8; + $methods = ['getAppliedTaxes', 'getTotalAmount', 'getGrandTotal', 'getSubtotalInclTax']; $totalsMock = $this->getMock('Magento\Quote\Model\Quote\Address\Total', $methods, [], '', false); $taxConfig = $this->getMockBuilder('\Magento\Tax\Model\Config') ->disableOriginalConstructor() @@ -632,10 +633,6 @@ class TaxTest extends \PHPUnit_Framework_TestCase ->expects($this->once()) ->method('getAppliedTaxes') ->will($this->returnValue($appliedTaxes)); - $address - ->expects($this->any()) - ->method('getQuote') - ->will($this->returnValue($quote)); $totalsMock ->expects($this->any()) ->method('getGrandTotal') @@ -644,10 +641,17 @@ class TaxTest extends \PHPUnit_Framework_TestCase ->expects($this->any()) ->method('getStore') ->will($this->returnValue($store)); + $quote->expects($this->any()) + ->method('getAllAddresses') + ->will($this->returnValue([$address])); + $address + ->expects($this->any()) + ->method('getQuote') + ->will($this->returnValue($quote)); $address ->expects($this->any()) ->method('getTaxAmount') - ->will($this->returnValue(8)); + ->will($this->returnValue($taxAmount)); $address ->expects($this->any()) ->method('getCustomAttributesCodes') @@ -658,7 +662,10 @@ class TaxTest extends \PHPUnit_Framework_TestCase $address->setData($key, $value); } - $taxTotalsCalcModel->fetch($quote, $totalsMock); + $this->assertNull($totalsMock->getTaxAmount()); + $totalsArray = $taxTotalsCalcModel->fetch($quote, $totalsMock); + $this->assertArrayHasKey('value', $totalsArray[0]); + $this->assertEquals($taxAmount, $totalsArray[0]['value']); } /** diff --git a/app/code/Magento/Tax/Test/Unit/Setup/TaxSetupTest.php b/app/code/Magento/Tax/Test/Unit/Setup/TaxSetupTest.php index c42a28490e3442ad20d004b535abfb6994ef3262..151cd1876c40294acb1e7bd0d013b4e8955ae6f4 100644 --- a/app/code/Magento/Tax/Test/Unit/Setup/TaxSetupTest.php +++ b/app/code/Magento/Tax/Test/Unit/Setup/TaxSetupTest.php @@ -19,11 +19,19 @@ class TaxSetupTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->typeConfigMock = $this->getMock('Magento\Catalog\Model\ProductTypes\ConfigInterface'); + + $salesSetup = $this->getMock('\Magento\Sales\Setup\SalesSetup', [], [], '', false); + $salesSetupFactory = $this->getMock('Magento\Sales\Setup\SalesSetupFactory', ['create'], [], '', false); + $salesSetupFactory->expects($this->any())->method('create')->will($this->returnValue($salesSetup)); + + $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->taxSetup = $helper->getObject( 'Magento\Tax\Setup\TaxSetup', - ['productTypeConfig' => $this->typeConfigMock] + [ + 'productTypeConfig' => $this->typeConfigMock, + 'salesSetupFactory' => $salesSetupFactory, + ] ); } diff --git a/app/code/Magento/Tax/i18n/de_DE.csv b/app/code/Magento/Tax/i18n/de_DE.csv index 2365399967075268f0f0216770da3295cb27bba0..4fc035fa2f4a311e7ecfc689c6fb355f336671bb 100644 --- a/app/code/Magento/Tax/i18n/de_DE.csv +++ b/app/code/Magento/Tax/i18n/de_DE.csv @@ -157,3 +157,5 @@ Note:,Note: "Orders, Invoices, Credit Memos Display Settings","Orders, Invoices, Credit Memos Display Settings" State/Region,Bundesstaat/Region "Subtotal Only","Subtotal Only" +Taxes,Taxes +"Import/Export Tax Rates","Import/Export Tax Rates" diff --git a/app/code/Magento/Tax/i18n/en_US.csv b/app/code/Magento/Tax/i18n/en_US.csv index 078cef5d97b22d509be9cefcd6ded7e3abd56629..af228accb3440110e6172e35b33168e274b3deaa 100644 --- a/app/code/Magento/Tax/i18n/en_US.csv +++ b/app/code/Magento/Tax/i18n/en_US.csv @@ -157,3 +157,5 @@ Note:,Note: "Orders, Invoices, Credit Memos Display Settings","Orders, Invoices, Credit Memos Display Settings" State/Region,State/Region "Subtotal Only","Subtotal Only" +Taxes,Taxes +"Import/Export Tax Rates","Import/Export Tax Rates" diff --git a/app/code/Magento/Tax/i18n/es_ES.csv b/app/code/Magento/Tax/i18n/es_ES.csv index 999f3930c262c6cad3e89e6d12601d8e18bbe016..b97d5fe9cb3eec69d81bcaa5aad642f9dad170a8 100644 --- a/app/code/Magento/Tax/i18n/es_ES.csv +++ b/app/code/Magento/Tax/i18n/es_ES.csv @@ -157,3 +157,5 @@ Note:,Note: "Orders, Invoices, Credit Memos Display Settings","Orders, Invoices, Credit Memos Display Settings" State/Region,Estado/Región "Subtotal Only","Subtotal Only" +Taxes,Taxes +"Import/Export Tax Rates","Import/Export Tax Rates" diff --git a/app/code/Magento/Tax/i18n/fr_FR.csv b/app/code/Magento/Tax/i18n/fr_FR.csv index bf297e3d67360cb1c8bd3c8242e46fe96fbc7fb7..2687af941e9b2ee07dc46311a1ff8d0d46a84353 100644 --- a/app/code/Magento/Tax/i18n/fr_FR.csv +++ b/app/code/Magento/Tax/i18n/fr_FR.csv @@ -157,3 +157,5 @@ Note:,Note: "Orders, Invoices, Credit Memos Display Settings","Orders, Invoices, Credit Memos Display Settings" State/Region,État/Région "Subtotal Only","Subtotal Only" +Taxes,Taxes +"Import/Export Tax Rates","Import/Export Tax Rates" diff --git a/app/code/Magento/Tax/i18n/nl_NL.csv b/app/code/Magento/Tax/i18n/nl_NL.csv index ac644e6510cc1478a1b7a9b1b6a780e80cf8888c..212f01a0c4761fe4fd9694798f60fb95ae839db7 100644 --- a/app/code/Magento/Tax/i18n/nl_NL.csv +++ b/app/code/Magento/Tax/i18n/nl_NL.csv @@ -157,3 +157,5 @@ Note:,Note: "Orders, Invoices, Credit Memos Display Settings","Orders, Invoices, Credit Memos Display Settings" State/Region,Provincie "Subtotal Only","Subtotal Only" +Taxes,Taxes +"Import/Export Tax Rates","Import/Export Tax Rates" diff --git a/app/code/Magento/Tax/i18n/pt_BR.csv b/app/code/Magento/Tax/i18n/pt_BR.csv index 2c52eee8e592aaebe71c3cfc598032cf2257c7e1..d22d24f7218e324c1d0c3e3ea4b44361ee91a6af 100644 --- a/app/code/Magento/Tax/i18n/pt_BR.csv +++ b/app/code/Magento/Tax/i18n/pt_BR.csv @@ -157,3 +157,5 @@ Note:,Note: "Orders, Invoices, Credit Memos Display Settings","Orders, Invoices, Credit Memos Display Settings" State/Region,Estado/Região "Subtotal Only","Subtotal Only" +Taxes,Taxes +"Import/Export Tax Rates","Import/Export Tax Rates" diff --git a/app/code/Magento/Tax/i18n/zh_Hans_CN.csv b/app/code/Magento/Tax/i18n/zh_Hans_CN.csv index d47d26b939bd199abc6c46c2e69e7dad6edaff95..2a4d9e43e27e0972cd50eb939f4871c3be2e0644 100644 --- a/app/code/Magento/Tax/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Tax/i18n/zh_Hans_CN.csv @@ -157,3 +157,5 @@ Note:,Note: "Orders, Invoices, Credit Memos Display Settings","Orders, Invoices, Credit Memos Display Settings" State/Region,å·ž/地区 "Subtotal Only","Subtotal Only" +Taxes,Taxes +"Import/Export Tax Rates","Import/Export Tax Rates" diff --git a/app/code/Magento/Tax/view/adminhtml/templates/rule/edit.phtml b/app/code/Magento/Tax/view/adminhtml/templates/rule/edit.phtml index e04ddfeeefeb8028d1d6159558ef2340b8e80c1c..22adf3c427eaad459e2e317e943f984838e8ef5b 100644 --- a/app/code/Magento/Tax/view/adminhtml/templates/rule/edit.phtml +++ b/app/code/Magento/Tax/view/adminhtml/templates/rule/edit.phtml @@ -88,7 +88,7 @@ require([ item.itemElement = that.prev(); $('#tax-rate-form') .dialogRates({itemRate: item}) - .dialogRates('open'); + .dialogRates('openModal'); } else { if (result.error_message) diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/grand-total.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/grand-total.html index f756837bb1e7aa3be01ea1958ec7293ff99fe2bd..31bf3448f2020c312eae0b3667ba5e85f83a89c1 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/grand-total.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/grand-total.html @@ -7,17 +7,17 @@ <!-- ko if: isTaxDisplayedInGrandTotal && isDisplayed() --> <tr class="grand totals incl"> <th class="mark" scope="row"> - <strong data-bind="text: $t(inclTaxLabel)"></strong> + <strong data-bind="text: inclTaxLabel"></strong> </th> - <td data-bind="attr: {'data-th': $t(inclTaxLabel) }" class="amount"> + <td data-bind="attr: {'data-th': inclTaxLabel}" class="amount"> <strong><span class="price" data-bind="text: getValue()"></span></strong> </td> </tr> <tr class="grand totals excl"> <th class="mark" scope="row"> - <strong data-bind="text: $t(exclTaxLabel)"></strong> + <strong data-bind="text: exclTaxLabel"></strong> </th> - <td data-bind="attr: {'data-th': exclTaxLabel }" class="amount"> + <td data-bind="attr: {'data-th': exclTaxLabel}" class="amount"> <strong><span class="price" data-bind="text: getGrandTotalExclTax()"></span></strong> </td> </tr> @@ -25,9 +25,9 @@ <!-- ko if: !isTaxDisplayedInGrandTotal && isDisplayed() --> <tr class="grand totals"> <th class="mark" scope="row"> - <strong data-bind="text: $t(title)"></strong> + <strong data-bind="text: title"></strong> </th> - <td data-bind="attr: {'data-th': $t(title)}" class="amount"> + <td data-bind="attr: {'data-th': title}" class="amount"> <strong><span class="price" data-bind="text: getValue()"></span></strong> </td> </tr> diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/shipping.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/shipping.html index 13fe7f3e716a63b661d5bf96e91dc1320435233e..37a8e82688a83dd963bcbdf07d235807854a26ca 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/shipping.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/shipping.html @@ -8,46 +8,46 @@ <!-- ko if: isBothPricesDisplayed() --> <tr class="totals shipping excl"> <th class="mark" scope="row"> - <span class="label" data-bind="text: $t(title) + ' ' + $t(excludingTaxMessage)"></span> - <span class="value" data-bind="text: $t(getShippingMethodTitle())"></span> + <span class="label" data-bind="text: title + ' ' + excludingTaxMessage"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <span class="price" - data-bind="text: $t(getExcludingValue()), attr: {'data-th': $t(excludingTaxMessage)}"></span> + data-bind="text: getExcludingValue(), attr: {'data-th': excludingTaxMessage}"></span> </td> </tr> <tr class="totals shipping incl"> <th class="mark" scope="row"> - <span class="label" data-bind="text: $t(title) + ' ' + $t(includingTaxMessage)"></span> - <span class="value" data-bind="text: $t(getShippingMethodTitle())"></span> + <span class="label" data-bind="text: title + ' ' + includingTaxMessage"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <span class="price" - data-bind="text: $t(getIncludingValue()), attr: {'data-th': $t(title) + ' ' + $t(excludingTaxMessage)}"></span> + data-bind="text: getIncludingValue(), attr: {'data-th': title + ' ' + excludingTaxMessage}"></span> </td> </tr> <!-- /ko --> <!-- ko if: isIncludingDisplayed() --> <tr class="totals shipping incl"> <th class="mark" scope="row"> - <span class="label" data-bind="text: $t(title)"></span> - <span class="value" data-bind="text: $t(getShippingMethodTitle())"></span> + <span class="label" data-bind="text: title"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <span class="price" - data-bind="text: $t(getIncludingValue()), attr: {'data-th': $t(title)}"></span> + data-bind="text: getIncludingValue(), attr: {'data-th': title}"></span> </td> </tr> <!-- /ko --> <!-- ko if: isExcludingDisplayed() --> <tr class="totals shipping excl"> <th class="mark" scope="row"> - <span class="label" data-bind="text: $t(title)"></span> - <span class="value" data-bind="text: $t(getShippingMethodTitle())"></span> + <span class="label" data-bind="text: title"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <span class="price" - data-bind="text: $t(getValue()), attr: {'data-th': $t(title)}"></span> + data-bind="text: getValue(), attr: {'data-th': title}"></span> </td> </tr> <!-- /ko --> diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/tax.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/tax.html index c6f4c7833e0c0f346d70d1e350b82ad5522fb5c5..8d70052ddc2288568187cd9b041937a0c65e7ddb 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/tax.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/cart/totals/tax.html @@ -7,9 +7,9 @@ <!-- ko if: ifShowValue() && !ifShowDetails() --> <tr class="totals-tax"> - <th data-bind="text: $t(title)" class="mark" colspan="1" scope="row"></th> - <td data-bind="attr: {'data-th': $t(title) }" class="amount"> - <span class="price" data-bind="text: $t(getValue())"></span> + <th data-bind="text: title" class="mark" colspan="1" scope="row"></th> + <td data-bind="attr: {'data-th': title}" class="amount"> + <span class="price" data-bind="text: getValue()"></span> </td> </tr> <!-- /ko --> @@ -17,10 +17,10 @@ <tr class="totals-tax-summary" data-bind="mageInit: {'toggleAdvanced':{'selectorsToggleClass': 'shown', 'baseToggleClass': 'expanded', 'toggleContainers': '.totals-tax-details'}}"> <th class="mark" scope="row" colspan="1"> - <span class="detailed" data-bind="text: $t(title)"></span> + <span class="detailed" data-bind="text: title"></span> </th> - <td data-bind="attr: {'data-th': $t(title) }" class="amount"> - <span class="price" data-bind="text: $t(getValue())"></span> + <td data-bind="attr: {'data-th': title}" class="amount"> + <span class="price" data-bind="text: getValue()"></span> </td> </tr> <!-- ko foreach: getDetails() --> diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/minicart/subtotal/totals.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/minicart/subtotal/totals.html index c3c28a58138221e7031bc00c463df46c62a9a416..5b04ee8298480f1c9910f94d1f9897d44c91dcb7 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/minicart/subtotal/totals.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/minicart/subtotal/totals.html @@ -10,11 +10,11 @@ <span class="price-wrapper" data-bind="html: cart().subtotal_excl_tax"></span> <!-- /ko --> - <!-- ko if: !display_cart_subtotal_excl_tax && display_subtotal_incl_tax --> + <!-- ko if: !display_cart_subtotal_excl_tax && display_cart_subtotal_incl_tax --> <span class="price-wrapper" data-bind="html: cart().subtotal_incl_tax"></span> <!-- /ko --> - <!-- ko if: !display_cart_subtotal_excl_tax && !display_subtotal_incl_tax --> + <!-- ko if: !display_cart_subtotal_excl_tax && !display_cart_subtotal_incl_tax --> <span class="price-wrapper price-including-tax" data-bind="attr: { 'data-label': $t('Incl. Tax') }, html: cart().subtotal_incl_tax"> </span> diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/grand-total.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/grand-total.html index 4451adbf528d64dc6330e734e48389057062a710..9d2072b1bf99840ed11401c277a8c0362d2e493b 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/grand-total.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/grand-total.html @@ -7,17 +7,17 @@ <!-- ko if: isTaxDisplayedInGrandTotal && isDisplayed() --> <tr class="grand totals incl"> <th class="mark" scope="row"> - <strong data-bind="i18n: inclTaxLabel"></strong> + <strong data-bind="text: inclTaxLabel"></strong> </th> - <td data-bind="attr: {'data-th': $t(inclTaxLabel) }" class="amount"> + <td data-bind="attr: {'data-th': inclTaxLabel}" class="amount"> <strong><span class="price" data-bind="text: getValue()"></span></strong> </td> </tr> <tr class="grand totals excl"> <th class="mark" scope="row"> - <strong data-bind="i18n: exclTaxLabel"></strong> + <strong data-bind="text: exclTaxLabel"></strong> </th> - <td data-bind="attr: {'data-th': exclTaxLabel }" class="amount"> + <td data-bind="attr: {'data-th': exclTaxLabel}" class="amount"> <strong><span class="price" data-bind="text: getGrandTotalExclTax()"></span></strong> </td> </tr> @@ -25,18 +25,18 @@ <!-- ko if: !isTaxDisplayedInGrandTotal && isDisplayed() --> <tr class="grand totals"> <th class="mark" scope="row"> - <strong data-bind="i18n: title"></strong> + <strong data-bind="text: title"></strong> </th> - <td data-bind="attr: {'data-th': $t(title)}" class="amount"> + <td data-bind="attr: {'data-th': title}" class="amount"> <strong><span class="price" data-bind="text: getValue()"></span></strong> </td> </tr> <!-- /ko --> <!-- ko if: isBaseGrandTotalDisplayNeeded() && isDisplayed() --> <tr class="totals charge"> - <th class="mark" data-bind="i18n: basicCurrencyMessage" scope="row"></th> + <th class="mark" data-bind="text: basicCurrencyMessage" scope="row"></th> <td class="amount"> - <span class="price" data-bind="text: getBaseValue(), attr: {'data-th': $t(basicCurrencyMessage)}"></span> + <span class="price" data-bind="text: getBaseValue(), attr: {'data-th': basicCurrencyMessage}"></span> </td> </tr> <!-- /ko --> diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/shipping.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/shipping.html index 1608f78ad1c91708b66d777eb472ba331562f479..3bcd9bccd15ea60ddd7718044417537f409f53fc 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/shipping.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/shipping.html @@ -8,33 +8,33 @@ <!-- ko if: isBothPricesDisplayed() --> <tr class="totals shipping excl"> <th class="mark" scope="row"> - <span class="label" data-bind="text: $t(title)+ ' ' + $t(excludingTaxMessage)"></span> - <span class="value" data-bind="i18n: getShippingMethodTitle()"></span> + <span class="label" data-bind="text: title+ ' ' + excludingTaxMessage"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <!-- ko if: isCalculated() --> <span class="price" - data-bind="i18n: getExcludingValue(), attr: {'data-th': $t(excludingTaxMessage)}"></span> + data-bind="text: getExcludingValue(), attr: {'data-th': excludingTaxMessage}"></span> <!-- /ko --> <!-- ko ifnot: isCalculated() --> <span class="not-calculated" - data-bind="i18n: getExcludingValue(), attr: {'data-th': $t(excludingTaxMessage)}"></span> + data-bind="text: getExcludingValue(), attr: {'data-th': excludingTaxMessage}"></span> <!-- /ko --> </td> </tr> <tr class="totals shipping incl"> <th class="mark" scope="row"> - <span class="label" data-bind="text: $t(title) + ' ' + $t(includingTaxMessage)"></span> - <span class="value" data-bind="i18n: getShippingMethodTitle()"></span> + <span class="label" data-bind="text: title + ' ' + includingTaxMessage"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <!-- ko if: isCalculated() --> <span class="price" - data-bind="i18n: getIncludingValue(), attr: {'data-th': $t(title) + ' ' + $t(excludingTaxMessage)}"></span> + data-bind="text: getIncludingValue(), attr: {'data-th': title + ' ' + excludingTaxMessage}"></span> <!-- /ko --> <!-- ko ifnot: isCalculated() --> <span class="not-calculated" - data-bind="i18n: getIncludingValue(), attr: {'data-th': $t(title) + ' ' + $t(excludingTaxMessage)}"></span> + data-bind="text: getIncludingValue(), attr: {'data-th': title + ' ' + excludingTaxMessage}"></span> <!-- /ko --> </td> </tr> @@ -42,17 +42,17 @@ <!-- ko if: isIncludingDisplayed() --> <tr class="totals shipping incl"> <th class="mark" scope="row"> - <span class="label" data-bind="i18n: title"></span> - <span class="value" data-bind="i18n: getShippingMethodTitle()"></span> + <span class="label" data-bind="text: title"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <!-- ko if: isCalculated() --> <span class="price" - data-bind="i18n: getIncludingValue(), attr: {'data-th': $t(title)}"></span> + data-bind="text: getIncludingValue(), attr: {'data-th': title}"></span> <!-- /ko --> <!-- ko ifnot: isCalculated() --> <span class="not-calculated" - data-bind="i18n: getIncludingValue(), attr: {'data-th': $t(title)}"></span> + data-bind="text: getIncludingValue(), attr: {'data-th': title}"></span> <!-- /ko --> </td> </tr> @@ -60,17 +60,17 @@ <!-- ko if: isExcludingDisplayed() --> <tr class="totals shipping excl"> <th class="mark" scope="row"> - <span class="label" data-bind="i18n: title"></span> - <span class="value" data-bind="i18n: getShippingMethodTitle()"></span> + <span class="label" data-bind="text: title"></span> + <span class="value" data-bind="text: getShippingMethodTitle()"></span> </th> <td class="amount"> <!-- ko if: isCalculated() --> <span class="price" - data-bind="i18n: getValue(), attr: {'data-th': $t(title)}"></span> + data-bind="text: getValue(), attr: {'data-th': title}"></span> <!-- /ko --> <!-- ko ifnot: isCalculated() --> <span class="not-calculated" - data-bind="i18n: getValue(), attr: {'data-th': $t(title)}"></span> + data-bind="text: getValue(), attr: {'data-th': title}"></span> <!-- /ko --> </td> </tr> diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/subtotal.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/subtotal.html index a51407475cbfc66ad2f11a4c50166362efe2ef4d..618bb6fd3281fc280206cb809d8233ed489169b3 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/subtotal.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/subtotal.html @@ -7,36 +7,36 @@ <!-- ko if: isBothPricesDisplayed() --> <tr class="totals sub excl"> <th class="mark" scope="row"> - <span data-bind="i18n: title"></span> - <span data-bind="i18n: excludingTaxMessage"></span> + <span data-bind="text: title"></span> + <span data-bind="text: excludingTaxMessage"></span> </th> <td class="amount"> - <span class="price" data-bind="text: getValue(), attr: {'data-th': $t(excludingTaxMessage) }"></span> + <span class="price" data-bind="text: getValue(), attr: {'data-th': excludingTaxMessage}"></span> </td> </tr> <tr class="totals sub incl"> <th class="mark" scope="row"> - <span data-bind="i18n: title"></span> - <span data-bind="i18n: includingTaxMessage"></span> + <span data-bind="text: title"></span> + <span data-bind="text: includingTaxMessage"></span> </th> <td class="amount"> - <span class="price" data-bind="text: getValueInclTax(), attr: {'data-th': $t(includingTaxMessage) }"></span> + <span class="price" data-bind="text: getValueInclTax(), attr: {'data-th': includingTaxMessage}"></span> </td> </tr> <!-- /ko --> <!-- ko if: !isBothPricesDisplayed() && isIncludingTaxDisplayed() --> <tr class="totals sub"> - <th data-bind="i18n: title" class="mark" scope="row"></th> + <th data-bind="text: title" class="mark" scope="row"></th> <td class="amount"> - <span class="price" data-bind="text: getValueInclTax(), attr: {'data-th': $t(title)}"></span> + <span class="price" data-bind="text: getValueInclTax(), attr: {'data-th': title}"></span> </td> </tr> <!-- /ko --> <!-- ko if: !isBothPricesDisplayed() && !isIncludingTaxDisplayed() --> <tr class="totals sub"> - <th data-bind="i18n: title" class="mark" scope="row"></th> + <th data-bind="text: title" class="mark" scope="row"></th> <td class="amount"> - <span class="price" data-bind="text: getValue(), attr: {'data-th': $t(title)}"></span> + <span class="price" data-bind="text: getValue(), attr: {'data-th': title}"></span> </td> </tr> <!-- /ko --> diff --git a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/tax.html b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/tax.html index 5aa8b53e7fd082c0a477903db60a01cbdf24a347..3305b6956b8c74bfed641e1517cf04c9259bf9b2 100644 --- a/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/tax.html +++ b/app/code/Magento/Tax/view/frontend/web/template/checkout/summary/tax.html @@ -6,15 +6,15 @@ --> <!-- ko if: ifShowValue() && !ifShowDetails() --> <tr class="totals-tax"> - <th data-bind="i18n: title" class="mark" scope="row"></th> - <td data-bind="attr: {'data-th': $t(title) }" class="amount"> + <th data-bind="text: title" class="mark" scope="row"></th> + <td data-bind="attr: {'data-th': title}" class="amount"> <!-- ko if: isCalculated() --> <span class="price" - data-bind="i18n: getValue()"></span> + data-bind="text: getValue()"></span> <!-- /ko --> <!-- ko ifnot: isCalculated() --> <span class="not-calculated" - data-bind="i18n: getValue()"></span> + data-bind="text: getValue()"></span> <!-- /ko --> </td> </tr> @@ -22,15 +22,15 @@ <!-- ko if: ifShowValue() && ifShowDetails() --> <tr class="totals-tax-summary" data-bind="mageInit: {'toggleAdvanced':{'selectorsToggleClass': 'shown', 'baseToggleClass': 'expanded', 'toggleContainers': '.totals-tax-details'}}"> - <th data-bind="i18n: title" class="mark" scope="row"></th> - <td data-bind="attr: {'data-th': $t(title) }" class="amount"> + <th data-bind="text: title" class="mark" scope="row"></th> + <td data-bind="attr: {'data-th': title }" class="amount"> <!-- ko if: isCalculated() --> <span class="price" - data-bind="i18n: getValue()"></span> + data-bind="text: getValue()"></span> <!-- /ko --> <!-- ko ifnot: isCalculated() --> <span class="not-calculated" - data-bind="i18n: getValue()"></span> + data-bind="text: getValue()"></span> <!-- /ko --> </td> </tr> diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportCsv.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportCsv.php index 9f6f1cb8e6beeb2f860b824759c3a019cb1612eb..2b23bd51aa6d7f49d8c5b45989d62914c2e37d13 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportCsv.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportCsv.php @@ -16,7 +16,7 @@ class ExportCsv extends \Magento\TaxImportExport\Controller\Adminhtml\Rate * * @return ResponseInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Layout $resultLayout */ $resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT); diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php index dc4e8987adc107d94a815e8765c3bf6aa58fe7d1..7685d61ee95f0aa04bc856f718a146e8d2727588 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php @@ -15,7 +15,7 @@ class ExportPost extends \Magento\TaxImportExport\Controller\Adminhtml\Rate * * @return ResponseInterface */ - public function execute() + public function executeInternal() { /** start csv content and set template */ $headers = new \Magento\Framework\DataObject( diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportXml.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportXml.php index 38fc277576cc673254f8a0fc2dfe8d47439fa7a6..546980d126fa0ea222cd5dc4bc4bbf85a0fffa1e 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportXml.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportXml.php @@ -16,7 +16,7 @@ class ExportXml extends \Magento\TaxImportExport\Controller\Adminhtml\Rate * * @return ResponseInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\View\Result\Layout $resultLayout */ $resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT); diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php index b37520a99f870106a31e6e6ee93b7e1ae9f82345..56d479a43cf14bd3291e142651173d0d6de55760 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php @@ -14,7 +14,7 @@ class ImportExport extends \Magento\TaxImportExport\Controller\Adminhtml\Rate * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php index eb5efff3d5e9be912e0d5f50129187dec9646ba2..db37d19fa264128bc07416515ae339cbe94a42b2 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php @@ -14,7 +14,7 @@ class ImportPost extends \Magento\TaxImportExport\Controller\Adminhtml\Rate * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { if ($this->getRequest()->isPost() && !empty($_FILES['import_rates_file']['tmp_name'])) { try { diff --git a/app/code/Magento/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Files.php b/app/code/Magento/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Files.php index 9b11f465787d75ba95c8349733e76ad6d7668790..1af3ea8e4bc986b49e0c718e0a3e9b4bb9006ead 100644 --- a/app/code/Magento/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Files.php +++ b/app/code/Magento/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Files.php @@ -9,7 +9,7 @@ * * @method * \Magento\Theme\Block\Adminhtml\Wysiwyg\Files\Content\Files setStorage(\Magento\Theme\Model\Wysiwyg\Storage $storage) - * @method \Magento\Theme\Model\Wysiwyg\Storage getStorage + * @method \Magento\Theme\Model\Wysiwyg\Storage getStorage() */ namespace Magento\Theme\Block\Adminhtml\Wysiwyg\Files\Content; diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Delete.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Delete.php index 12fbe2225fa2f6593fd44dd72746293a79015717..7f29bfb70161aebde080706af969a3e21981bbdc 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Delete.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Delete.php @@ -15,7 +15,7 @@ class Delete extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $themeId = $this->getRequest()->getParam('id'); try { diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCss.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCss.php index 0113c1c59a4ad38059635553711141b2bb4e0d8c..badb051def8f2e46f8422f06405899e89bf0cb2a 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCss.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCss.php @@ -16,7 +16,7 @@ class DownloadCss extends \Magento\Theme\Controller\Adminhtml\System\Design\Them * * @return ResponseInterface|void */ - public function execute() + public function executeInternal() { $themeId = $this->getRequest()->getParam('theme_id'); $file = $this->getRequest()->getParam('file'); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCustomCss.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCustomCss.php index 8653fa797f160550c170442b1abd799464a114b6..6432c23db6d78e84b44b1203fc4db0beb60569f0 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCustomCss.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/DownloadCustomCss.php @@ -16,7 +16,7 @@ class DownloadCustomCss extends \Magento\Theme\Controller\Adminhtml\System\Desig * * @return ResponseInterface|void */ - public function execute() + public function executeInternal() { $themeId = $this->getRequest()->getParam('theme_id'); try { diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Edit.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Edit.php index 367958d22fb13201fdc56a3b4c64dd6914d42a7d..2b8f9853de79a043c81e0eec80945b1d057c377e 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Edit.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * * @return void */ - public function execute() + public function executeInternal() { $themeId = (int)$this->getRequest()->getParam('id'); /** @var $theme \Magento\Framework\View\Design\ThemeInterface */ diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Grid.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Grid.php index e49cdb3e88320c8f597fb1774828e21a5e6ce4f3..8a8fb29abc4e09a11071e5531b572a34ccd65198 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Grid.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Grid.php @@ -13,7 +13,7 @@ class Grid extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Index.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Index.php index 8216660eab1a5006ef375013090308120ef8ef9d..599b01273022e2213dda01d51a6a40e5f3eca39c 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Index.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_Theme::system_design_theme'); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/NewAction.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/NewAction.php index 8e930a8c55d46b52c00c1373049ef5e9f78f8f6d..f699769c615751c9da835e22c64777689ba3beeb 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/NewAction.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Save.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Save.php index c3fabcb4d0232c84e02bc8d47e47e54e65b5a4c2..6bb049c8be3bb57be05908b81f6c1fbcabd655b6 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Save.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/Save.php @@ -14,7 +14,7 @@ class Save extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function execute() + public function executeInternal() { $redirectBack = (bool)$this->getRequest()->getParam('back', false); $themeData = $this->getRequest()->getParam('theme'); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadCss.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadCss.php index c201adf38e9186767b17819517d693b61a249d8b..d576899f2dcb60b4e6194095e5e5c0251d5413fe 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadCss.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadCss.php @@ -13,7 +13,7 @@ class UploadCss extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * * @return void */ - public function execute() + public function executeInternal() { /** @var $serviceModel \Magento\Theme\Model\Uploader\Service */ $serviceModel = $this->_objectManager->get('Magento\Theme\Model\Uploader\Service'); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadJs.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadJs.php index 58cf189c86f0bdb5a63491384a92d9bc398370d3..84800872fc31528f6334ee1205336c135b719935 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadJs.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme/UploadJs.php @@ -14,7 +14,7 @@ class UploadJs extends \Magento\Theme\Controller\Adminhtml\System\Design\Theme * @return void * @throws \Magento\Framework\Exception\LocalizedException */ - public function execute() + public function executeInternal() { $themeId = $this->getRequest()->getParam('id'); /** @var $serviceModel \Magento\Theme\Model\Uploader\Service */ diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Contents.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Contents.php index abc3ebd705a61e09558acdbd20032c6617fc7ece..21fbd7eaa2b6fbce97b413742e09e75c7f24456f 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Contents.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Contents.php @@ -13,7 +13,7 @@ class Contents extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg * * @return void */ - public function execute() + public function executeInternal() { try { $this->_view->loadLayout('empty'); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFiles.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFiles.php index 2b59d4bba3b8eb81b31b983eb7c5f592b354077f..4f3a4fda4ac82ff28f49e3c427e9d714a3770f7a 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFiles.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFiles.php @@ -14,7 +14,7 @@ class DeleteFiles extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysi * @return void * @throws \Exception */ - public function execute() + public function executeInternal() { try { if (!$this->getRequest()->isPost()) { diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolder.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolder.php index 4958a6b3909e7b5af227aa722f84f304dc25f37a..6c6258e7f52317fd1794158d2a7e94cb6dcda7b8 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolder.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolder.php @@ -13,7 +13,7 @@ class DeleteFolder extends \Magento\Theme\Controller\Adminhtml\System\Design\Wys * * @return void */ - public function execute() + public function executeInternal() { try { $path = $this->storage->getCurrentPath(); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Index.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Index.php index 7abdd3ee5eccf66327a22129a3a920db2bfe55ad..7584377ecce9602b1e1d06a2ad4531889801303d 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Index.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Fi * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout('overlay_popup'); $this->_view->renderLayout(); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php index 018e8194f37a204647e967debe5b6d6849372d49..119a5b8b9ca6c30ec0e04216cccda44a497993f3 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php @@ -13,7 +13,7 @@ class NewFolder extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwy * * @return void */ - public function execute() + public function executeInternal() { $name = $this->getRequest()->getPost('name'); try { diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsert.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsert.php index 92ef5e7bdc533351555d6c8614f8ca764b2047d6..32ff7003905ad20ecc76f4b5dfd5123b3ed5586c 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsert.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsert.php @@ -13,7 +13,7 @@ class OnInsert extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg * * @return void */ - public function execute() + public function executeInternal() { /** @var $helperStorage \Magento\Theme\Helper\Storage */ $helperStorage = $this->_objectManager->get('Magento\Theme\Helper\Storage'); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/PreviewImage.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/PreviewImage.php index d8f050d8d3f3d2fd676e3e0fadd5f8eee05da182..cab5e4b78d65a5b6b4ab6c3355ed6876fbc1a93b 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/PreviewImage.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/PreviewImage.php @@ -16,7 +16,7 @@ class PreviewImage extends \Magento\Theme\Controller\Adminhtml\System\Design\Wys * * @return ResponseInterface|void */ - public function execute() + public function executeInternal() { $file = $this->getRequest()->getParam('file'); /** @var $helper \Magento\Theme\Helper\Storage */ diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/TreeJson.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/TreeJson.php index d3d8a244e73d567d861c21e90600f5fec901fbe2..3e789134e26d68e69e86980315f38515a8d8ee7c 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/TreeJson.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/TreeJson.php @@ -13,7 +13,7 @@ class TreeJson extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg * * @return void */ - public function execute() + public function executeInternal() { try { $this->getResponse()->representJson( diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Upload.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Upload.php index 877b0fc83d9e82b41ada6d33c027e53353ffaf00..420083086ed9b479dfc1535592e4e4ba478404a0 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Upload.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/Upload.php @@ -13,7 +13,7 @@ class Upload extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\F * * @return void */ - public function execute() + public function executeInternal() { try { $path = $this->storage->getCurrentPath(); diff --git a/app/code/Magento/Theme/Model/Design/Backend/Exceptions.php b/app/code/Magento/Theme/Model/Design/Backend/Exceptions.php index e2fe1ac8f19d780acc688ab42497d16535f6351f..cfe040099ac98c8295c7f1aafabdde2d390cbfe2 100644 --- a/app/code/Magento/Theme/Model/Design/Backend/Exceptions.php +++ b/app/code/Magento/Theme/Model/Design/Backend/Exceptions.php @@ -22,6 +22,7 @@ class Exceptions extends ArraySerialized * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\View\DesignInterface $design * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -31,13 +32,14 @@ class Exceptions extends ArraySerialized \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_design = $design; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Theme/Model/Design/Backend/Theme.php b/app/code/Magento/Theme/Model/Design/Backend/Theme.php index ae2af06192c8b673198edebc41c945d84b988adf..4917dd31b07ecadbac3e3689900b7126fe9bdf2b 100644 --- a/app/code/Magento/Theme/Model/Design/Backend/Theme.php +++ b/app/code/Magento/Theme/Model/Design/Backend/Theme.php @@ -16,12 +16,20 @@ class Theme extends Value */ protected $_design = null; + /** + * Path to config node with list of caches + * + * @var string + */ + const XML_PATH_INVALID_CACHES = 'design/invalid_caches'; + /** * Initialize dependencies * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\App\Config\ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList * @param \Magento\Framework\View\DesignInterface $design * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection @@ -31,13 +39,14 @@ class Theme extends Value \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_design = $design; - parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data); + parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data); } /** @@ -53,4 +62,26 @@ class Theme extends Value } return parent::beforeSave(); } + + /** + * {@inheritdoc} + * + * {@inheritdoc}. In addition, it sets status 'invalidate' for blocks and other output caches + * + * @return $this + */ + public function afterSave() + { + $types = array_keys( + $this->_config->getValue( + self::XML_PATH_INVALID_CACHES, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ); + if ($this->isValueChanged()) { + $this->cacheTypeList->invalidate($types); + } + + return parent::afterSave(); + } } diff --git a/app/code/Magento/Theme/Model/Theme/Plugin/Registration.php b/app/code/Magento/Theme/Model/Theme/Plugin/Registration.php index 0f469442c15de841768198fc6b51fb5b023a6f71..1e0f900a6ecb647e1b5d8ac83b76325d80885296 100644 --- a/app/code/Magento/Theme/Model/Theme/Plugin/Registration.php +++ b/app/code/Magento/Theme/Model/Theme/Plugin/Registration.php @@ -47,7 +47,7 @@ class Registration * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function beforeDispatch( + public function beforeExecute( AbstractAction $subject, RequestInterface $request ) { diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DeleteTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DeleteTest.php index 4323967aa478ed045634b887e7bf48c71f2a6e19..86f88c71aee839650a78e86e6eba660cb946f422 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DeleteTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DeleteTest.php @@ -147,7 +147,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase ->with($path) ->willReturnSelf(); - $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->controller->execute()); + $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->controller->executeInternal()); } /** @@ -218,7 +218,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase $logger->expects($this->once()) ->method('critical'); - $this->controller->execute(); + $this->controller->executeInternal(); } /** @@ -255,6 +255,6 @@ class DeleteTest extends \PHPUnit_Framework_TestCase $this->messageManager->expects($this->once()) ->method('addError'); - $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->controller->execute()); + $this->assertInstanceOf('Magento\Framework\Controller\Result\Redirect', $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCssTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCssTest.php index 5beef00b2aed512bf4f009fa05158946059c6bc3..e9b058c7bdf09577b6fa15649a97b6cd28988cac 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCssTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCssTest.php @@ -186,7 +186,7 @@ class DownloadCssTest extends \PHPUnit_Framework_TestCase ->with($relPath, ['type' => 'filename', 'value' => $relPath], DirectoryList::ROOT) ->willReturn($this->getMockBuilder('Magento\Framework\App\ResponseInterface')->getMock()); - $this->assertInstanceOf('Magento\Framework\App\ResponseInterface', $this->controller->execute()); + $this->assertInstanceOf('Magento\Framework\App\ResponseInterface', $this->controller->executeInternal()); } public function testExecuteInvalidArgument() @@ -243,6 +243,6 @@ class DownloadCssTest extends \PHPUnit_Framework_TestCase ->method('setRedirect') ->with($refererUrl); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCustomCssTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCustomCssTest.php index 891f455ee1dd741851f8c99ca4c77f28496f05e5..04f013fb5e3d5035e86b97b81e6b6357aa2c6e7a 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCustomCssTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/DownloadCustomCssTest.php @@ -173,7 +173,7 @@ class DownloadCustomCssTest extends \PHPUnit_Framework_TestCase ->with($fileName, ['type' => 'filename', 'value' => $fullPath], DirectoryList::ROOT) ->willReturn($this->getMockBuilder('Magento\Framework\App\ResponseInterface')->getMock()); - $this->assertInstanceOf('Magento\Framework\App\ResponseInterface', $this->controller->execute()); + $this->assertInstanceOf('Magento\Framework\App\ResponseInterface', $this->controller->executeInternal()); } public function testExecuteInvalidArgument() @@ -213,6 +213,6 @@ class DownloadCustomCssTest extends \PHPUnit_Framework_TestCase ->method('setRedirect') ->with($refererUrl); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/EditTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/EditTest.php index eac3f24f2fec706843e56b61a6b7ea88d2522b57..d9481c4ccc2940a1166fc9324eecf22d70ed4e80 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/EditTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/EditTest.php @@ -59,7 +59,7 @@ class EditTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\Desi ->method('getUrl') ->willReturn('http://return.url'); - $this->_model->execute(); + $this->_model->executeInternal(); } public function testExecuteWithException() @@ -125,7 +125,7 @@ class EditTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\Desi ->method('getUrl') ->willReturn('http://return.url'); - $this->_model->execute(); + $this->_model->executeInternal(); } /** @@ -245,6 +245,6 @@ class EditTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\Desi $this->view->expects($this->once()) ->method('renderLayout'); - $this->_model->execute(); + $this->_model->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/GridTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/GridTest.php index 850e4d09d11cbda8f71620a1e9a3b383d3a7d017..e15f4b66d8e057721e6a9b1d3f886ea98ab62610 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/GridTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/GridTest.php @@ -35,7 +35,7 @@ class GridTest extends \PHPUnit_Framework_TestCase protected $view; /** - * @var Delete + * @var Grid */ protected $controller; @@ -70,13 +70,13 @@ class GridTest extends \PHPUnit_Framework_TestCase ); } - public function testExecute() + public function testExecuteInternal() { $this->view->expects($this->once()) ->method('loadLayout') ->with(false); $this->view->expects($this->once()) ->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/IndexTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/IndexTest.php index d504277d57f14f808410c10ede68d5522d630c16..a3cf13f6fd49420aa0a55c8548b3f1f5d4a28dce 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/IndexTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/IndexTest.php @@ -40,6 +40,6 @@ class IndexTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\Des ->method('getLayout') ->will($this->returnValue($layout)); - $this->_model->execute(); + $this->_model->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/SaveTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/SaveTest.php index 524dad54b8cb2f8b6821091a3556d8a804d58868..c260a330d23937fd2e8c23bc4c95c5f0584046a9 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/SaveTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/SaveTest.php @@ -85,6 +85,6 @@ class SaveTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\Desi ->with('Magento\Theme\Model\Theme\SingleFile') ->will($this->returnValue(null)); - $this->_model->execute(); + $this->_model->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadCssTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadCssTest.php index 1529c56175fd4e44c2df4a8a491aa393837cb0c2..a90289e90626bdc3a568c3e7b847ff39278d0f62 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadCssTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadCssTest.php @@ -39,7 +39,7 @@ class UploadCssTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System ->method('representJson') ->with('{"filename":"filename","content":"content"}'); - $this->_model->execute(); + $this->_model->executeInternal(); } public function testExecuteWithLocalizedException() @@ -67,7 +67,7 @@ class UploadCssTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System ->with('Magento\Framework\Json\Helper\Data') ->willReturn($jsonData); - $this->_model->execute(); + $this->_model->executeInternal(); } public function testExecuteWithException() @@ -103,6 +103,6 @@ class UploadCssTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System ->with('Magento\Framework\Json\Helper\Data') ->willReturn($jsonData); - $this->_model->execute(); + $this->_model->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadJsTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadJsTest.php index 6dbfdd62e0c54d5d732fd17e1a2a50abbe4785b6..271b084f5f6808cbbbfc93592d89be69c8f34577 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadJsTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Theme/UploadJsTest.php @@ -99,7 +99,7 @@ class UploadJsTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\ ->method('representJson') ->with('{"error":"true","message":"We cannot find a theme with id "' . $themeId . '"."}'); - $this->_model->execute(); + $this->_model->executeInternal(); } public function testExecuteWithException() @@ -149,7 +149,7 @@ class UploadJsTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\ ->method('representJson') ->with('{"error":"true","message":"We can\'t upload the JS file right now."}'); - $this->_model->execute(); + $this->_model->executeInternal(); } public function testExecute() @@ -244,6 +244,6 @@ class UploadJsTest extends \Magento\Theme\Test\Unit\Controller\Adminhtml\System\ ->method('representJson') ->with('{"error":false,"files":{"fileOne":{"name":"name"}}}'); - $this->_model->execute(); + $this->_model->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/ContentsTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/ContentsTest.php index 42292699b7d88bd30e7b52170e5f08fce1bf704e..5251dcc759eb9ec0c64e864514f377b15b7175c2 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/ContentsTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/ContentsTest.php @@ -96,6 +96,6 @@ class ContentsTest extends \PHPUnit_Framework_TestCase $this->response->expects($this->once()) ->method('representJson'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php index 2a69f64be343ee3f155b2862cc2f227b5ad3b1b5..3a34f63df2ccfb6c2d535e6e44eee677c6dc8d69 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php @@ -69,7 +69,7 @@ class DeleteFilesTest extends \PHPUnit_Framework_TestCase ->method('representJson') ->with('{"error":"true","message":"Wrong request"}'); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecute() @@ -99,6 +99,6 @@ class DeleteFilesTest extends \PHPUnit_Framework_TestCase ->method('deleteFile') ->with('file'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php index 9bd042cfe2e5864a6f86e5afa848ad63b9ca1a79..2c6b5f2e642a702c96bec83ceda3f627f705b582 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php @@ -66,6 +66,6 @@ class DeleteFolderTest extends \PHPUnit_Framework_TestCase ->with('Magento\Framework\Json\Helper\Data') ->willReturn($jsonData); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php index 63884649f39f4baf66a5886619757abb381a529a..cf913494623f217b4e866b7c53b079f30d5276a0 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php @@ -34,6 +34,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase $this->view ->expects($this->once()) ->method('renderLayout'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php index 0061013ed728c00cc216b889f9dcd4ec2b4e28c4..48c23d765c22412c40114eca014a1e3ca0feaae6 100644 --- a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php @@ -54,6 +54,6 @@ class OnInsertTest extends \PHPUnit_Framework_TestCase ->method('setBody') ->with('http://relative.url/'); - $this->controller->execute(); + $this->controller->executeInternal(); } } diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ExceptionsTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ExceptionsTest.php index 47a9acad4ee79d277eba30c29be79a8030242dbe..74760ac7a77a0e1d68a4e45d794b41f23065157e 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ExceptionsTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ExceptionsTest.php @@ -5,6 +5,7 @@ */ namespace Magento\Theme\Test\Unit\Model\Design\Backend; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Theme\Model\Design\Backend\Exceptions; use Magento\Framework\App\Area; @@ -18,60 +19,29 @@ class ExceptionsTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\Model\Context|\PHPUnit_Framework_MockObject_MockObject */ - protected $context; - - /** - * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject - */ - protected $registry; - - /** - * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $config; + protected $contextMock; /** * @var \Magento\Framework\View\DesignInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $design; - - /** - * @var \Magento\Theme\Model\ResourceModel\Design|\PHPUnit_Framework_MockObject_MockObject - */ - protected $resource; - - /** - * @var \Magento\Theme\Model\ResourceModel\Design\Collection|\PHPUnit_Framework_MockObject_MockObject - */ - protected $resourceCollection; + protected $designMock; protected function setUp() { - $this->context = $this->getMockBuilder('Magento\Framework\Model\Context') - ->disableOriginalConstructor() - ->getMock(); - $this->registry = $this->getMockBuilder('Magento\Framework\Registry') - ->disableOriginalConstructor() - ->getMock(); - $this->config = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface')->getMock(); - $this->design = $this->getMockBuilder('Magento\Framework\View\DesignInterface')->getMock(); - $this->resource = $this->getMockBuilder('Magento\Theme\Model\ResourceModel\Design') - ->disableOriginalConstructor() - ->getMock(); - $this->resourceCollection = $this->getMockBuilder('Magento\Theme\Model\ResourceModel\Design\Collection') + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Context') ->disableOriginalConstructor() ->getMock(); - $this->context->expects($this->once()) + $this->designMock = $this->getMockBuilder('Magento\Framework\View\DesignInterface')->getMock(); + $this->contextMock->expects($this->once()) ->method('getEventDispatcher') ->willReturn($this->getMockBuilder('Magento\Framework\Event\ManagerInterface')->getMock()); - $this->model = new Exceptions( - $this->context, - $this->registry, - $this->config, - $this->design, - $this->resource, - $this->resourceCollection + $this->model = (new ObjectManager($this))->getObject( + 'Magento\Theme\Model\Design\Backend\Exceptions', + [ + 'context' => $this->contextMock, + 'design' => $this->designMock, + ] ); } @@ -86,7 +56,7 @@ class ExceptionsTest extends \PHPUnit_Framework_TestCase public function testBeforeSave() { $value = ['__empty' => '', 'test' => ['search' => '1qwe', 'value' => '#val#', 'regexp' => '[a-zA-Z0-9]*']]; - $this->design->expects($this->once()) + $this->designMock->expects($this->once()) ->method('setDesignTheme') ->with('#val#', Area::AREA_FRONTEND); $this->model->setValue($value); diff --git a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ThemeTest.php b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ThemeTest.php index f6ac670502a89c420cd46b8df19b5a6242daeae7..e83a4e4ca30ebf25296cc1a1a94f5ee6d3e92614 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ThemeTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/Design/Backend/ThemeTest.php @@ -7,6 +7,7 @@ namespace Magento\Theme\Test\Unit\Model\Design\Backend; use Magento\Framework\App\Area; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Theme\Model\Design\Backend\Theme; class ThemeTest extends \PHPUnit_Framework_TestCase @@ -19,60 +20,45 @@ class ThemeTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\Model\Context|\PHPUnit_Framework_MockObject_MockObject */ - protected $context; - - /** - * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject - */ - protected $registry; - - /** - * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $config; + protected $contextMock; /** * @var \Magento\Framework\View\DesignInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $design; + protected $designMock; /** - * @var \Magento\Theme\Model\ResourceModel\Design|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Cache\TypeListInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $resource; + protected $cacheTypeListMock; /** - * @var \Magento\Theme\Model\ResourceModel\Design\Collection|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $resourceCollection; + protected $configMock; protected function setUp() { - $this->context = $this->getMockBuilder('Magento\Framework\Model\Context') - ->disableOriginalConstructor() - ->getMock(); - $this->registry = $this->getMockBuilder('Magento\Framework\Registry') - ->disableOriginalConstructor() - ->getMock(); - $this->config = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface')->getMock(); - $this->design = $this->getMockBuilder('Magento\Framework\View\DesignInterface')->getMock(); - $this->resource = $this->getMockBuilder('Magento\Theme\Model\ResourceModel\Design') + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Context') ->disableOriginalConstructor() ->getMock(); - $this->resourceCollection = $this->getMockBuilder('Magento\Theme\Model\ResourceModel\Design\Collection') + $this->designMock = $this->getMockBuilder('Magento\Framework\View\DesignInterface')->getMock(); + $this->cacheTypeListMock = $this->getMockBuilder('Magento\Framework\App\Cache\TypeListInterface') ->disableOriginalConstructor() ->getMock(); - $this->context->expects($this->once()) + $this->contextMock->expects($this->once()) ->method('getEventDispatcher') ->willReturn($this->getMockBuilder('Magento\Framework\Event\ManagerInterface')->getMock()); + $this->configMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface')->getMock(); - $this->model = new Theme( - $this->context, - $this->registry, - $this->config, - $this->design, - $this->resource, - $this->resourceCollection + $this->model = (new ObjectManager($this))->getObject( + 'Magento\Theme\Model\Design\Backend\Theme', + [ + 'design' => $this->designMock, + 'context' => $this->contextMock, + 'cacheTypeList' => $this->cacheTypeListMock, + 'config' => $this->configMock, + ] ); } @@ -84,10 +70,50 @@ class ThemeTest extends \PHPUnit_Framework_TestCase */ public function testBeforeSave() { - $this->design->expects($this->once()) + $this->designMock->expects($this->once()) ->method('setDesignTheme') ->with('some_value', Area::AREA_FRONTEND); $this->model->setValue('some_value'); $this->assertInstanceOf(get_class($this->model), $this->model->beforeSave()); } + + /** + * @param int $callNumber + * @param string $oldValue + * @dataProvider afterSaveDataProvider + */ + public function testAfterSave($callNumber, $oldValue) + { + $this->cacheTypeListMock->expects($this->exactly($callNumber)) + ->method('invalidate'); + $this->configMock->expects($this->any()) + ->method('getValue') + ->willReturnMap( + [ + [ + Theme::XML_PATH_INVALID_CACHES, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE, + null, + ['block_html' => 1, 'layout' => 1, 'translate' => 1] + ], + [ + null, + \Magento\Framework\App\Config\ScopeConfigInterface::SCOPE_TYPE_DEFAULT, + null, + $oldValue + ], + + ] + ); + $this->model->setValue('some_value'); + $this->assertInstanceOf(get_class($this->model), $this->model->afterSave()); + } + + public function afterSaveDataProvider() + { + return [ + [0, 'some_value'], + [2, 'other_value'], + ]; + } } diff --git a/app/code/Magento/Theme/Test/Unit/Model/Theme/Plugin/RegistrationTest.php b/app/code/Magento/Theme/Test/Unit/Model/Theme/Plugin/RegistrationTest.php index faf0bdf9838718adfcefa7cf7b24398fbaf8fea4..d9ac94ddbe7189fdf5992a291de23c0c21f0b45d 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/Theme/Plugin/RegistrationTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/Theme/Plugin/RegistrationTest.php @@ -35,30 +35,30 @@ class RegistrationTest extends \PHPUnit_Framework_TestCase $this->appState = $this->getMock('Magento\Framework\App\State', [], [], '', false); } - public function testBeforeDispatch() + public function testBeforeExecute() { $this->appState->expects($this->once())->method('getMode')->willReturn('default'); $this->themeRegistration->expects($this->once())->method('register'); $this->logger->expects($this->never())->method('critical'); $object = new Registration($this->themeRegistration, $this->logger, $this->appState); - $object->beforeDispatch($this->abstractAction, $this->request); + $object->beforeExecute($this->abstractAction, $this->request); } - public function testBeforeDispatchWithProductionMode() + public function testBeforeExecuteWithProductionMode() { $this->appState->expects($this->once())->method('getMode')->willReturn('production'); $this->themeRegistration->expects($this->never())->method('register'); $this->logger->expects($this->never())->method('critical'); $object = new Registration($this->themeRegistration, $this->logger, $this->appState); - $object->beforeDispatch($this->abstractAction, $this->request); + $object->beforeExecute($this->abstractAction, $this->request); } - public function testBeforeDispatchWithException() + public function testBeforeExecuteWithException() { $exception = new LocalizedException(new Phrase('Phrase')); $this->themeRegistration->expects($this->once())->method('register')->willThrowException($exception); $this->logger->expects($this->once())->method('critical'); $object = new Registration($this->themeRegistration, $this->logger, $this->appState); - $object->beforeDispatch($this->abstractAction, $this->request); + $object->beforeExecute($this->abstractAction, $this->request); } } diff --git a/app/code/Magento/Theme/etc/config.xml b/app/code/Magento/Theme/etc/config.xml index 332043e56df8729c080d1e849df05b786e8b4cff..4f25cd7e2abf9382bef439a8ba3b95c6ded3274e 100644 --- a/app/code/Magento/Theme/etc/config.xml +++ b/app/code/Magento/Theme/etc/config.xml @@ -8,6 +8,11 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <design> + <invalid_caches> + <block_html /> + <layout /> + <translate /> + </invalid_caches> <head translate="default_description"> <default_title>Magento Commerce</default_title> <default_description>Default Description</default_description> diff --git a/app/code/Magento/Theme/view/base/page_layout/empty.xml b/app/code/Magento/Theme/view/base/page_layout/empty.xml index 09d5658a86c4b9e38d7d2b8c83646555b2a97c10..d69d34f79e64a5407baddca36d65d3455099cc5e 100644 --- a/app/code/Magento/Theme/view/base/page_layout/empty.xml +++ b/app/code/Magento/Theme/view/base/page_layout/empty.xml @@ -16,7 +16,7 @@ <container name="main" label="Main Content Container" htmlTag="div" htmlClass="column main"/> </container> </container> - <container name="page.bottom" as="page_bottom" label="Before Page Footer Container" after="main.content" htmlTag="div" htmlClass="page-bottom"/> + <container name="page.bottom.container" as="page_bottom_container" label="Before Page Footer Container" after="main.content" htmlTag="div" htmlClass="page-bottom"/> <container name="before.body.end" as="before_body_end" after="-" label="Page Bottom"/> </container> </container> diff --git a/app/code/Magento/Theme/view/frontend/templates/html/pager.phtml b/app/code/Magento/Theme/view/frontend/templates/html/pager.phtml index e7835bee90cc63bb03928e2f24edeccd8cb17987..331903c8ced116e52835c475c43e26559f25e55e 100644 --- a/app/code/Magento/Theme/view/frontend/templates/html/pager.phtml +++ b/app/code/Magento/Theme/view/frontend/templates/html/pager.phtml @@ -116,7 +116,7 @@ <?php if ($block->isShowPerPage()): ?> <div class="limiter"> <strong class="limiter-label"><?php /* @escapeNotVerified */ echo __('Show') ?></strong> - <select id="limiter" data-mage-redirect="{'event':'change'}" class="limiter-options"> + <select id="limiter" data-mage-init='{"redirectUrl": {"event":"change"}}' class="limiter-options"> <?php foreach ($block->getAvailableLimit() as $_key => $_limit): ?> <option value="<?php /* @escapeNotVerified */ echo $block->getLimitUrl($_key) ?>"<?php if ($block->isLimitCurrent($_key)): ?> selected="selected"<?php endif ?>> diff --git a/app/code/Magento/Translation/Controller/Ajax/Index.php b/app/code/Magento/Translation/Controller/Ajax/Index.php index 190b4046b465ccd2fc4aed14c6170f1bb735aa4c..08c1fc1bce190ff38398f11cc0c6625fcb5c91c4 100644 --- a/app/code/Magento/Translation/Controller/Ajax/Index.php +++ b/app/code/Magento/Translation/Controller/Ajax/Index.php @@ -31,7 +31,7 @@ class Index extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $translate = (array)$this->getRequest()->getPost('translate'); diff --git a/app/code/Magento/Translation/Model/Js/DataProvider.php b/app/code/Magento/Translation/Model/Js/DataProvider.php index ee6d8b3f5df193ae8444ba3c4e1ca9a87d61f617..a12859fe254d109a8a50a2dcb3ce1108327f2167 100644 --- a/app/code/Magento/Translation/Model/Js/DataProvider.php +++ b/app/code/Magento/Translation/Model/Js/DataProvider.php @@ -129,7 +129,7 @@ class DataProvider implements DataProviderInterface if ($result) { if (isset($matches[2])) { foreach ($matches[2] as $match) { - $phrases[] = $match; + $phrases[] = str_replace('\\\'', '\'', $match); } } } diff --git a/app/code/Magento/Translation/etc/di.xml b/app/code/Magento/Translation/etc/di.xml index 05c7f766a452e694c648138db45d7835b9721dd2..7d2ec64b604d8bb2f24ecd51bc0e03391584dbde 100644 --- a/app/code/Magento/Translation/etc/di.xml +++ b/app/code/Magento/Translation/etc/di.xml @@ -64,7 +64,7 @@ </arguments> </type> - <type name="Magento\Framework\View\Asset\PreProcessor\Pool"> + <virtualType name="AssetPreProcessorPool"> <arguments> <argument name="preprocessors" xsi:type="array"> <item name="js" xsi:type="array"> @@ -79,7 +79,7 @@ </item> </argument> </arguments> - </type> + </virtualType> <type name="Magento\Framework\Console\CommandList"> <arguments> diff --git a/app/code/Magento/Ui/Component/Filters.php b/app/code/Magento/Ui/Component/Filters.php index dadcdc2f09535bb7b8275eedea8f52f8dfc1b55f..3859f777f3e46d52b8799d4af5c9bc297bf75228 100644 --- a/app/code/Magento/Ui/Component/Filters.php +++ b/app/code/Magento/Ui/Component/Filters.php @@ -73,6 +73,11 @@ class Filters extends AbstractComponent implements ObserverInterface { if ($component instanceof ColumnInterface) { $filterType = $component->getData('config/filter'); + + if (is_array($filterType)) { + $filterType = $filterType['filterType']; + } + if (!$filterType) { return; } diff --git a/app/code/Magento/Ui/Controller/Adminhtml/AbstractAction.php b/app/code/Magento/Ui/Controller/Adminhtml/AbstractAction.php index f6ab7eed8e13d8e2f24f6796743e00c209f93589..442f875e23af4d0f1a82da686da5e794bca59261 100644 --- a/app/code/Magento/Ui/Controller/Adminhtml/AbstractAction.php +++ b/app/code/Magento/Ui/Controller/Adminhtml/AbstractAction.php @@ -57,7 +57,7 @@ abstract class AbstractAction extends Action implements UiActionInterface */ public function executeAjaxRequest() { - $this->execute(); + $this->executeInternal(); } /** diff --git a/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Delete.php b/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Delete.php index 6a2bdccd51030dd00a44c95ac8ac75d5029f9445..a4192d50134955ca13983df1549ee876cf17f92c 100644 --- a/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Delete.php +++ b/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Delete.php @@ -48,7 +48,7 @@ class Delete extends AbstractAction * * @return void */ - protected function execute() + protected function executeInternal() { $viewIds = explode('.', $this->_request->getParam('data')); $bookmark = $this->bookmarkManagement->getByIdentifierNamespace( diff --git a/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php b/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php index bde48047b773fac859768450caeb8fdd4c6c1ae8..55568937e97276336b18bef07b41e9f33a60704f 100644 --- a/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php +++ b/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php @@ -87,7 +87,7 @@ class Save extends AbstractAction * * @return void */ - protected function execute() + protected function executeInternal() { $bookmark = $this->bookmarkFactory->create(); $jsonData = $this->_request->getParam('data'); diff --git a/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToCsv.php b/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToCsv.php index 158f90512c6a195bcca90c28b36a83e22b48e7c6..2c0b22699f77d23b4ac503a088a0f04cd42c60aa 100644 --- a/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToCsv.php +++ b/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToCsv.php @@ -46,7 +46,7 @@ class GridToCsv extends Action * @throws \Magento\Framework\Exception\LocalizedException * @return \Magento\Framework\App\ResponseInterface */ - public function execute() + public function executeInternal() { return $this->fileFactory->create('export.csv', $this->converter->getCsvFile(), 'var'); } diff --git a/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToXml.php b/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToXml.php index f4de9d2da2b875fa5d45caf2a7f017dafe3c72b2..c999f3f8fcd9b0c2c23adf2f28c1e6bf7aa73f0b 100644 --- a/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToXml.php +++ b/app/code/Magento/Ui/Controller/Adminhtml/Export/GridToXml.php @@ -46,7 +46,7 @@ class GridToXml extends Action * @throws \Magento\Framework\Exception\LocalizedException * @return \Magento\Framework\App\ResponseInterface */ - public function execute() + public function executeInternal() { return $this->fileFactory->create('export.xml', $this->converter->getXmlFile(), 'var'); } diff --git a/app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php b/app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php index bd431cf33f4fece3291527e972cb3149f8336239..f43135b162e34fcc8e65094c5bfb9f2e60c9af9b 100644 --- a/app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php +++ b/app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php @@ -20,7 +20,7 @@ class Render extends AbstractAction * * @return void */ - protected function execute() + protected function executeInternal() { $component = $this->factory->create($this->_request->getParam('namespace')); $this->prepareComponent($component); diff --git a/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToCsvTest.php b/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToCsvTest.php index ad295672a6cad88dc5ab4bf3c3c0c918a28c467d..daf5ba76d67ea8084e6c969762b2a1e880826802 100644 --- a/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToCsvTest.php +++ b/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToCsvTest.php @@ -66,6 +66,6 @@ class GridToCsvTest extends \PHPUnit_Framework_TestCase ->with('export.csv', $content, 'var') ->willReturn($content); - $this->assertEquals($content, $this->controller->execute()); + $this->assertEquals($content, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToXmlTest.php b/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToXmlTest.php index 427a14e42dd40a12b50d211f991a00751290f8d3..c0314e99c13e2e235ab372d49d476517fba253d9 100644 --- a/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToXmlTest.php +++ b/app/code/Magento/Ui/Test/Unit/Controller/Adminhtml/Export/GridToXmlTest.php @@ -66,6 +66,6 @@ class GridToXmlTest extends \PHPUnit_Framework_TestCase ->with('export.xml', $content, 'var') ->willReturn($content); - $this->assertEquals($content, $this->controller->execute()); + $this->assertEquals($content, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js b/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js index 6c5de791d1e87337876b2919c7b1c6180729ff1a..1260a366cc07a2434cc1b5306f8d6dc2711a4f20 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js @@ -20,8 +20,10 @@ define([ * * @returns {Array} */ - normalizeData: function () { - var value = this._super(); + normalizeData: function (value) { + if (utils.isEmpty(value)) { + value = []; + } return _.isString(value) ? value.split(',') : value; }, diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/ui-select.js b/app/code/Magento/Ui/view/base/web/js/form/element/ui-select.js index 5547e3ad9dba80b8a4573e5ea08c6fc2107e710a..6fe8c40c4d8094513fa55070f6173e36cea5345d 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/ui-select.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/ui-select.js @@ -57,19 +57,6 @@ define([ } }, - /** - * Extends instance with defaults, extends config with formatted values - * and options, and invokes initialize method of AbstractElement class. - * - * @returns {Object} Chainable - */ - initialize: function () { - this._super() - .initOptions(); - - return this; - }, - /** * Parses options and merges the result with instance * diff --git a/app/code/Magento/Ui/view/base/web/js/lib/registry/events.js b/app/code/Magento/Ui/view/base/web/js/lib/registry/events.js index 69fcebf547ef5fa076440a736fece570373fc629..87d566a7ebc2cb34b89391b6175b589554586fcd 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/registry/events.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/registry/events.js @@ -2,6 +2,7 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ + define([ 'underscore', 'mageUtils', @@ -13,11 +14,11 @@ define([ * @constructor */ function Events(storage) { - this.id = 0, + this.id = 0; - this.requests = new Map(); - this.map = {}; - this.storage = storage; + this.requests = new Map(); + this.map = {}; + this.storage = storage; _.bindAll(this, '_resolve', '_clear'); } @@ -28,7 +29,7 @@ define([ /** * Tries to resolve dependencies affected by the scpecified element. * @param {String} elem - Elements' name. - * @returns {events} Chainable. + * @returns {Object} Chainable. */ resolve: function (elem) { var pending = this.map[elem]; @@ -44,17 +45,16 @@ define([ /** * Creates a new request for the specified set - of elements in case some of them wasn't registered yeat. - Otherwise triggers callback immediately. + * of elements in case some of them wasn't registered yeat. + * Otherwise triggers callback immediately. * @param {Array} elems - Requested elements. - * @param {Function} callback - - Callback that will be triggered as soon as - all of the elements will be registered. + * @param {Object} callback - that will be triggered as soon as + * all of the elements will be registered. * @returns {events} Chainable. */ wait: function (elems, callback) { var storage = this.storage, - map = this.map; + map = this.map; if (storage.has(elems)) { return callback.apply(null, storage.get(elems)); @@ -79,9 +79,9 @@ define([ * @returns {Boolean} Whether specified request was successfully resolved. */ _resolve: function (id) { - var request = this.requests.get(id), - elems = request.deps, - storage = this.storage, + var request = this.requests.get(id), + elems = request.deps, + storage = this.storage, isResolved; isResolved = storage.has(elems); @@ -99,8 +99,8 @@ define([ * @param {Number} id - Id of request. */ _clear: function (id) { - var map = this.map, - elems = this.requests.get(id).deps; + var map = this.map, + elems = this.requests.get(id).deps; elems.forEach(function (elem) { utils.remove(map[elem], id); diff --git a/app/code/Magento/Ui/view/base/web/js/modal/confirm.js b/app/code/Magento/Ui/view/base/web/js/modal/confirm.js index 098cb8669741e15eedb8fb0df607a0658cec98f8..1a27b96413c173a9b126d0996e232eb684d7e262 100644 --- a/app/code/Magento/Ui/view/base/web/js/modal/confirm.js +++ b/app/code/Magento/Ui/view/base/web/js/modal/confirm.js @@ -40,8 +40,8 @@ define([ /** * Click handler. */ - click: function () { - this.closeModal(); + click: function (event) { + this.closeModal(event); } }, { text: $.mage.__('OK'), @@ -50,8 +50,8 @@ define([ /** * Click handler. */ - click: function () { - this.closeModal(true); + click: function (event) { + this.closeModal(event, true); } }] }, @@ -82,15 +82,15 @@ define([ /** * Close modal window. */ - closeModal: function (result) { + closeModal: function (event, result) { result = result || false; if (result) { - this.options.actions.confirm(); + this.options.actions.confirm(event); } else { - this.options.actions.cancel(); + this.options.actions.cancel(event); } - this.options.actions.always(); + this.options.actions.always(event); this.element.bind('confirmclosed', _.bind(this._remove, this)); return this._super(); diff --git a/app/code/Magento/Ui/view/base/web/js/modal/modal.js b/app/code/Magento/Ui/view/base/web/js/modal/modal.js index b6dd6da1651a64bb521d938291867e90c6a8a1cd..23011d607cdadc301ee6cf4cebeb148b400c0260 100644 --- a/app/code/Magento/Ui/view/base/web/js/modal/modal.js +++ b/app/code/Magento/Ui/view/base/web/js/modal/modal.js @@ -78,8 +78,8 @@ define([ /** * Default action on button click */ - click: function () { - this.closeModal(); + click: function (event) { + this.closeModal(event); } }] }, diff --git a/app/code/Magento/Ups/view/adminhtml/templates/system/shipping/carrier_config.phtml b/app/code/Magento/Ups/view/adminhtml/templates/system/shipping/carrier_config.phtml index c3ca415c7c2869ffad51232487b894c7599a2f9f..7cffb845b9387b55dbb5d51eb89e8d332ee9b3bb 100644 --- a/app/code/Magento/Ups/view/adminhtml/templates/system/shipping/carrier_config.phtml +++ b/app/code/Magento/Ups/view/adminhtml/templates/system/shipping/carrier_config.phtml @@ -20,19 +20,19 @@ if (!$storeCode && $websiteCode) { /** @var $web \Magento\Store\Model\Website */ $web = $block->getWebsiteModel()->load($websiteCode); $storedAllowedMethods = explode(',', $web->getConfig('carriers/ups/allowed_methods')); - $storedOriginShipment = $web->getConfig('carriers/ups/origin_shipment'); - $storedFreeShipment = $web->getConfig('carriers/ups/free_method'); - $storedUpsType = $web->getConfig('carriers/ups/type'); + $storedOriginShipment = $block->escapeHtml($web->getConfig('carriers/ups/origin_shipment')); + $storedFreeShipment = $block->escapeHtml($web->getConfig('carriers/ups/free_method')); + $storedUpsType = $block->escapeHtml($web->getConfig('carriers/ups/type')); } elseif ($storeCode) { $storedAllowedMethods = explode(',', $block->getConfig('carriers/ups/allowed_methods', $storeCode)); - $storedOriginShipment = $block->getConfig('carriers/ups/origin_shipment', $storeCode); - $storedFreeShipment = $block->getConfig('carriers/ups/free_method', $storeCode); - $storedUpsType = $block->getConfig('carriers/ups/type', $storeCode); + $storedOriginShipment = $block->escapeHtml($block->getConfig('carriers/ups/origin_shipment', $storeCode)); + $storedFreeShipment = $block->escapeHtml($block->getConfig('carriers/ups/free_method', $storeCode)); + $storedUpsType = $block->escapeHtml($block->getConfig('carriers/ups/type', $storeCode)); } else { $storedAllowedMethods = explode(',', $block->getConfig('carriers/ups/allowed_methods')); - $storedOriginShipment = $block->getConfig('carriers/ups/origin_shipment'); - $storedFreeShipment = $block->getConfig('carriers/ups/free_method'); - $storedUpsType = $block->getConfig('carriers/ups/type'); + $storedOriginShipment = $block->escapeHtml($block->getConfig('carriers/ups/origin_shipment')); + $storedFreeShipment = $block->escapeHtml($block->getConfig('carriers/ups/free_method')); + $storedUpsType = $block->escapeHtml($block->getConfig('carriers/ups/type')); } ?> <script> diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CategoriesJson.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CategoriesJson.php index 2bc1ea519da5cd4d36b1a6d65ea089b24000da4f..891ee3a1bbd396c16fc7ae941531d415877384d8 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CategoriesJson.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CategoriesJson.php @@ -13,7 +13,7 @@ class CategoriesJson extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrit * * @return void */ - public function execute() + public function executeInternal() { $categoryId = $this->getRequest()->getParam('id', null); $this->getResponse()->setBody( diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CmsPageGrid.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CmsPageGrid.php index d277c5781bd077a5db3401356358c6037fa8d345..9d7668e61a0ef5b869ea4e56cb66439a5f962259 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CmsPageGrid.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/CmsPageGrid.php @@ -13,7 +13,7 @@ class CmsPageGrid extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite * * @return void */ - public function execute() + public function executeInternal() { $this->getResponse()->setBody( $this->_view->getLayout()->createBlock('Magento\UrlRewrite\Block\Cms\Page\Grid')->toHtml() diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php index a0ed60907fd0d715e343032951c9aa12e87169ce..f916999158de1b7d8bc6a2a025498a11856af52a 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite * * @return void */ - public function execute() + public function executeInternal() { if ($this->_getUrlRewrite()->getId()) { try { diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Edit.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Edit.php index 3d172de74021d86d0231ef9ecb06319bbbb36575..1a84bdb99d3e5028cca9abbdb9e4b5c245683865 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Edit.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Edit.php @@ -43,7 +43,7 @@ class Edit extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_UrlRewrite::urlrewrite'); diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Index.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Index.php index 13c87edc4edc24baddf400be305a91f7284d72ac..55c42bec9dfb79bd64470040d54b23e7e70aaa52 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Index.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_UrlRewrite::urlrewrite'); diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/ProductGrid.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/ProductGrid.php index 42c14184066b4419d5320afadca4a3cffc10ad9d..e6c7258493724a4908209a8d5d178e585677523b 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/ProductGrid.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/ProductGrid.php @@ -13,7 +13,7 @@ class ProductGrid extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite * * @return void */ - public function execute() + public function executeInternal() { $this->getResponse()->setBody( $this->_view->getLayout()->createBlock('Magento\UrlRewrite\Block\Catalog\Product\Grid')->toHtml() diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php index 951b0885f72fb283fb44ffb0771055d76edd35a4..a8da825fc502e50e659a662ced8de3de834912c3 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php @@ -136,7 +136,7 @@ class Save extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite /** * @return void */ - public function execute() + public function executeInternal() { $data = $this->getRequest()->getPostValue(); if ($data) { diff --git a/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php b/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php index ca30b16916e6590e2d7f14e647904a0be54b7810..82519182fdabc3a56d992db7a373a9b79e4ef54c 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php +++ b/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php @@ -13,7 +13,7 @@ class Forgotpassword extends \Magento\User\Controller\Adminhtml\Auth * * @return void */ - public function execute() + public function executeInternal() { $email = (string)$this->getRequest()->getParam('email'); $params = $this->getRequest()->getParams(); diff --git a/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPassword.php b/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPassword.php index b39d7c8400770f1eb9ec08ea273db5c0552cde76..b3d5e52303f18d779468923d91c067b61c0c5363 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPassword.php +++ b/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPassword.php @@ -15,7 +15,7 @@ class ResetPassword extends \Magento\User\Controller\Adminhtml\Auth * * @return void */ - public function execute() + public function executeInternal() { $passwordResetToken = (string)$this->getRequest()->getQuery('token'); $userId = (int)$this->getRequest()->getQuery('id'); diff --git a/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php b/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php index bae69c2415f3cb6578f41b558285864b12653840..5e65f6103035ec37261c0e8ff6ab2a00f49728d2 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php +++ b/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php @@ -15,7 +15,7 @@ class ResetPasswordPost extends \Magento\User\Controller\Adminhtml\Auth * * @return void */ - public function execute() + public function executeInternal() { $passwordResetToken = (string)$this->getRequest()->getQuery('token'); $userId = (int)$this->getRequest()->getQuery('id'); diff --git a/app/code/Magento/User/Controller/Adminhtml/Locks/Grid.php b/app/code/Magento/User/Controller/Adminhtml/Locks/Grid.php index 971b87791f613db9eb5c6f869cd8a04ae93e8a33..1eaa4e05d5a5872a4f71c544c8045a9ad9983db3 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Locks/Grid.php +++ b/app/code/Magento/User/Controller/Adminhtml/Locks/Grid.php @@ -16,7 +16,7 @@ class Grid extends \Magento\User\Controller\Adminhtml\Locks * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/User/Controller/Adminhtml/Locks/Index.php b/app/code/Magento/User/Controller/Adminhtml/Locks/Index.php index b3e9f092fd1b157a3f56fbf1cbe88c1a837c6f95..f3ce5beda6069b6bf23cd4530104a9a646a4d9d2 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Locks/Index.php +++ b/app/code/Magento/User/Controller/Adminhtml/Locks/Index.php @@ -16,7 +16,7 @@ class Index extends \Magento\User\Controller\Adminhtml\Locks * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_setActiveMenu('Magento_User::system_acl_locks'); diff --git a/app/code/Magento/User/Controller/Adminhtml/Locks/MassUnlock.php b/app/code/Magento/User/Controller/Adminhtml/Locks/MassUnlock.php index bf515568539639fd8ecc99a38524e9679d310328..ba0621b1d70b436f48fe61ee97ed7f4aeef0c5fe 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Locks/MassUnlock.php +++ b/app/code/Magento/User/Controller/Adminhtml/Locks/MassUnlock.php @@ -18,7 +18,7 @@ class MassUnlock extends \Magento\User\Controller\Adminhtml\Locks * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { try { // unlock users diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Delete.php b/app/code/Magento/User/Controller/Adminhtml/User/Delete.php index 748e44e4fc2890cd7bb32bfa04dd0b64772357e7..576138df5cf4666ff3f0b40114997fd6235f4b9c 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Delete.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Delete.php @@ -11,7 +11,7 @@ class Delete extends \Magento\User\Controller\Adminhtml\User /** * @return void */ - public function execute() + public function executeInternal() { $currentUser = $this->_objectManager->get('Magento\Backend\Model\Auth\Session')->getUser(); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Edit.php b/app/code/Magento/User/Controller/Adminhtml/User/Edit.php index 39ac43d55391ba02f47089b28233a7f13e791d86..c74f350c79f366e64cb15f600dccc71ebe106fa4 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Edit.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\User\Controller\Adminhtml\User /** * @return void */ - public function execute() + public function executeInternal() { $userId = $this->getRequest()->getParam('user_id'); /** @var \Magento\User\Model\User $model */ diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Index.php b/app/code/Magento/User/Controller/Adminhtml/User/Index.php index 875b26fcaf20f3ce2b2e1d6c21cd4d5e328a04c3..214b634c06fa8a719ce4ba99999e0c303590fccb 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Index.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\User\Controller\Adminhtml\User /** * @return void */ - public function execute() + public function executeInternal() { $this->_initAction(); $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Users')); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/InvalidateToken.php b/app/code/Magento/User/Controller/Adminhtml/User/InvalidateToken.php index adc326644ef6af19c571dd3d3a459fd7c3d55648..611b2a42890822b81a2e4336ddf8236005d563f7 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/InvalidateToken.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/InvalidateToken.php @@ -40,7 +40,7 @@ class InvalidateToken extends \Magento\User\Controller\Adminhtml\User /** * @return void */ - public function execute() + public function executeInternal() { if ($userId = $this->getRequest()->getParam('user_id')) { try { diff --git a/app/code/Magento/User/Controller/Adminhtml/User/NewAction.php b/app/code/Magento/User/Controller/Adminhtml/User/NewAction.php index 38cb07dae87eabad536e05355efd516c803d9f25..598d3b5c3d365bcf77d7edfdd20de9b58c2c8a40 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/NewAction.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/NewAction.php @@ -11,7 +11,7 @@ class NewAction extends \Magento\User\Controller\Adminhtml\User /** * @return void */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role/Delete.php b/app/code/Magento/User/Controller/Adminhtml/User/Role/Delete.php index 1a8060e1e23db801168bcb38eaf48cee7a3121fb..fefed2867c467bb7d73f48867962338289b1a3ac 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Role/Delete.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Role/Delete.php @@ -15,7 +15,7 @@ class Delete extends \Magento\User\Controller\Adminhtml\User\Role * * @return \Magento\Backend\Model\View\Result\Redirect|void */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role/EditRole.php b/app/code/Magento/User/Controller/Adminhtml/User/Role/EditRole.php index 21aef671de98c831b9eaa37408a8e9428fbdc357..a8950a9d711b9772436fb30e588c5e17316b50ad 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Role/EditRole.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Role/EditRole.php @@ -13,7 +13,7 @@ class EditRole extends \Magento\User\Controller\Adminhtml\User\Role * * @return void */ - public function execute() + public function executeInternal() { $role = $this->_initRole(); $this->_initAction(); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role/Editrolegrid.php b/app/code/Magento/User/Controller/Adminhtml/User/Role/Editrolegrid.php index ac6cf5350bdf90ae46540430eb19b3e1366bf765..053c65a4dca240ea097956a7ab320c011e870f0c 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Role/Editrolegrid.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Role/Editrolegrid.php @@ -13,7 +13,7 @@ class Editrolegrid extends \Magento\User\Controller\Adminhtml\User\Role * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(); $this->_view->renderLayout(); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role/Index.php b/app/code/Magento/User/Controller/Adminhtml/User/Role/Index.php index fe9c5c613822274b942ecd8fdacc7f330c0e27b2..ce8f462264e6bca2e7a9fe96254cdc8322f0b3c4 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Role/Index.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Role/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\User\Controller\Adminhtml\User\Role * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction(); $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Roles')); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role/RoleGrid.php b/app/code/Magento/User/Controller/Adminhtml/User/Role/RoleGrid.php index 32d360659bd64a808f0cac7dee2af0fccec23fa6..e771d3dd87b5b396c0e8382c186a0cea899d526d 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Role/RoleGrid.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Role/RoleGrid.php @@ -13,7 +13,7 @@ class RoleGrid extends \Magento\User\Controller\Adminhtml\User\Role * * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php b/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php index e45c6b110db78b490dc3f184000b94648963db1f..83aa7ed1f34763a41da89628e33c4493d8cad16b 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php @@ -55,7 +55,7 @@ class SaveRole extends \Magento\User\Controller\Adminhtml\User\Role * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/RoleGrid.php b/app/code/Magento/User/Controller/Adminhtml/User/RoleGrid.php index 03f19129f6bdc7dcf7a53f9e435dd8f99d5bbd13..5f405efca0fdcbb24d35efeefcf91c97b6ddc058 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/RoleGrid.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/RoleGrid.php @@ -11,7 +11,7 @@ class RoleGrid extends \Magento\User\Controller\Adminhtml\User /** * @return void */ - public function execute() + public function executeInternal() { $this->_view->loadLayout(false); $this->_view->renderLayout(); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/RolesGrid.php b/app/code/Magento/User/Controller/Adminhtml/User/RolesGrid.php index 11b1569e9d77dc4ebc34a13248f1360ceeb31a12..2689f3c9d77a926cefffd541be02e312f4816272 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/RolesGrid.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/RolesGrid.php @@ -11,7 +11,7 @@ class RolesGrid extends \Magento\User\Controller\Adminhtml\User /** * @return void */ - public function execute() + public function executeInternal() { $userId = $this->getRequest()->getParam('user_id'); /** @var \Magento\User\Model\User $model */ diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Save.php b/app/code/Magento/User/Controller/Adminhtml/User/Save.php index e9e5cad33207304d57a19e5714e6d37d299b74ff..f50ebcacb2714d23323083a5d73ccff7a425219a 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Save.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Save.php @@ -14,7 +14,7 @@ class Save extends \Magento\User\Controller\Adminhtml\User * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $userId = (int)$this->getRequest()->getParam('user_id'); $data = $this->getRequest()->getPostValue(); diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Validate.php b/app/code/Magento/User/Controller/Adminhtml/User/Validate.php index 25b49ff3999c532c5c797469b135e8af28bd1036..11262b0898cb089650cbb6019dbd8a37ff7e0269 100644 --- a/app/code/Magento/User/Controller/Adminhtml/User/Validate.php +++ b/app/code/Magento/User/Controller/Adminhtml/User/Validate.php @@ -13,7 +13,7 @@ class Validate extends \Magento\User\Controller\Adminhtml\User * * @return void */ - public function execute() + public function executeInternal() { $response = new \Magento\Framework\DataObject(); $response->setError(0); diff --git a/app/code/Magento/User/i18n/de_DE.csv b/app/code/Magento/User/i18n/de_DE.csv index 63367a6ff3a321b4002fff23db3184b217fb90bf..eb4689a2501f93ea2407b2e12ff0b33c8ce21f0c 100644 --- a/app/code/Magento/User/i18n/de_DE.csv +++ b/app/code/Magento/User/i18n/de_DE.csv @@ -118,3 +118,5 @@ Unlock,Entsperren "Last login","Letzter Login" Failures,Fehler Unlocked,"Gesperrt bis" +"All Users","All Users" +"User Roles","User Roles" diff --git a/app/code/Magento/User/i18n/en_US.csv b/app/code/Magento/User/i18n/en_US.csv index 1f56f067006fcfc049f895c82d4be8e59d1eaa7f..7c85088044d4270d9274aeaa4c2b37c768122401 100644 --- a/app/code/Magento/User/i18n/en_US.csv +++ b/app/code/Magento/User/i18n/en_US.csv @@ -118,3 +118,5 @@ Unlock,Unlock "Last login","Last login" Failures,Failures Unlocked,Unlocked +"All Users","All Users" +"User Roles","User Roles" diff --git a/app/code/Magento/User/i18n/es_ES.csv b/app/code/Magento/User/i18n/es_ES.csv index 4dd4f371b4af5b3f4d91980e708cf2a166194117..1e9397fee14cac86e26df285f382fb8575296752 100644 --- a/app/code/Magento/User/i18n/es_ES.csv +++ b/app/code/Magento/User/i18n/es_ES.csv @@ -119,3 +119,5 @@ Unlock,Desbloquear "Last login","Ultimo acceso" Failures,Fallos Unlocked,"Bloqueado hasta" +"All Users","All Users" +"User Roles","User Roles" diff --git a/app/code/Magento/User/i18n/fr_FR.csv b/app/code/Magento/User/i18n/fr_FR.csv index bbe1e63a96cbdd9c48e1695577d071fd5c69648e..42116af645b085fc8f38a176a0805f6c90c35591 100644 --- a/app/code/Magento/User/i18n/fr_FR.csv +++ b/app/code/Magento/User/i18n/fr_FR.csv @@ -119,3 +119,5 @@ Unlock,Déverrouiller "Last login","Dernière connexion" Failures,Echecs Unlocked,"Verrouillé jusqu'" +"All Users","All Users" +"User Roles","User Roles" diff --git a/app/code/Magento/User/i18n/nl_NL.csv b/app/code/Magento/User/i18n/nl_NL.csv index 91813e3a13311cf7eef604e490e8290319e62f56..3745ad043022040dac213c07f7c699a6feff89a9 100644 --- a/app/code/Magento/User/i18n/nl_NL.csv +++ b/app/code/Magento/User/i18n/nl_NL.csv @@ -119,3 +119,5 @@ Unlock,Openen "Last login","Laatste login" Failures,Mislukkingen Unlocked,"Gesloten tot" +"All Users","All Users" +"User Roles","User Roles" diff --git a/app/code/Magento/User/i18n/pt_BR.csv b/app/code/Magento/User/i18n/pt_BR.csv index d8d16b8cd04f7e50e2301b010a834f019803e0f9..0edca55b30ea62af431ef96ad0f68a9fdccbcce3 100644 --- a/app/code/Magento/User/i18n/pt_BR.csv +++ b/app/code/Magento/User/i18n/pt_BR.csv @@ -119,3 +119,5 @@ Unlock,Desbloquear "Last login","Último login" Failures,Falhas Unlocked,"Bloqueado até" +"All Users","All Users" +"User Roles","User Roles" diff --git a/app/code/Magento/User/i18n/zh_Hans_CN.csv b/app/code/Magento/User/i18n/zh_Hans_CN.csv index 1c10afb0b649b2bbf78b617f2768563ba2dc382e..1c0292bf2db046eaef74958a6fb6f6ca40caa784 100644 --- a/app/code/Magento/User/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/User/i18n/zh_Hans_CN.csv @@ -119,3 +119,5 @@ Unlock,è§£é” "Last login",上一次登录 Failures,失败 Unlocked,é”定直到 +"All Users","All Users" +"User Roles","User Roles" diff --git a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Delete.php b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Delete.php index 03190d55cac69351ca6a810d92f7a5acb241af23..10b0c13383e23bd38f22a2988ec3968173009d68 100644 --- a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Delete.php +++ b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Variable\Controller\Adminhtml\System\Variable * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $variable = $this->_initVariable(); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Edit.php b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Edit.php index adb7eaa317570570f70e40ab8928cc419be43d79..bd6db1b8f378cffaa54766bf9cc06e9e933877d6 100644 --- a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Edit.php +++ b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Variable\Controller\Adminhtml\System\Variable * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $variable = $this->_initVariable(); diff --git a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Index.php b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Index.php index 521834f094df9fec00e669afa6ba30f7283ec142..1dc0676e2e5f706219d5c62fed224a46179f9a9a 100644 --- a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Index.php +++ b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Variable\Controller\Adminhtml\System\Variable * * @return \Magento\Backend\Model\View\Result\Page */ - public function execute() + public function executeInternal() { $resultPage = $this->createPage(); $resultPage->getConfig()->getTitle()->prepend(__('Custom Variables')); diff --git a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/NewAction.php b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/NewAction.php index efbcf4c062b7f44dba3215a3a67c536451aaf107..465b50bfe448cdd96453659ab58f903c5ec9a5fb 100644 --- a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/NewAction.php +++ b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\Variable\Controller\Adminhtml\System\Variable * * @return \Magento\Backend\Model\View\Result\Forward */ - public function execute() + public function executeInternal() { /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */ $resultForward = $this->resultForwardFactory->create(); diff --git a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Save.php b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Save.php index f3640c3918e2b4935f5158cfcc4bfacd0a48ea51..6353e576707009da8cd3bcd9fa4593e4f71ef804 100644 --- a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Save.php +++ b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Save.php @@ -13,7 +13,7 @@ class Save extends \Magento\Variable\Controller\Adminhtml\System\Variable * * @return \Magento\Backend\Model\View\Result\Redirect */ - public function execute() + public function executeInternal() { $variable = $this->_initVariable(); $data = $this->getRequest()->getPost('variable'); diff --git a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Validate.php b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Validate.php index 75876b96cfe2cc8deb88f719ef8e38bbb9be69ed..7867af4006845898f0db6443dc70108488b1f141 100644 --- a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Validate.php +++ b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/Validate.php @@ -13,7 +13,7 @@ class Validate extends \Magento\Variable\Controller\Adminhtml\System\Variable * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $response = new \Magento\Framework\DataObject(['error' => false]); $variable = $this->_initVariable(); diff --git a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/WysiwygPlugin.php b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/WysiwygPlugin.php index 04b1514cfab7f3b8b6ce4b19ac4f0b7e8da517f9..42e801f50a4617e195956be35dd4d29e9117bdb4 100644 --- a/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/WysiwygPlugin.php +++ b/app/code/Magento/Variable/Controller/Adminhtml/System/Variable/WysiwygPlugin.php @@ -13,7 +13,7 @@ class WysiwygPlugin extends \Magento\Variable\Controller\Adminhtml\System\Variab * * @return \Magento\Framework\Controller\Result\Json */ - public function execute() + public function executeInternal() { $customVariables = $this->_objectManager->create('Magento\Variable\Model\Variable') ->getVariablesOptionArray(true); diff --git a/app/code/Magento/Variable/Test/Unit/Controller/Adminhtml/System/Variable/ValidateTest.php b/app/code/Magento/Variable/Test/Unit/Controller/Adminhtml/System/Variable/ValidateTest.php index cb653d6499d29ab007791427a95412f1e2b59bff..8da36180eb75edb515ee26fcb432546ab964cbe2 100644 --- a/app/code/Magento/Variable/Test/Unit/Controller/Adminhtml/System/Variable/ValidateTest.php +++ b/app/code/Magento/Variable/Test/Unit/Controller/Adminhtml/System/Variable/ValidateTest.php @@ -152,7 +152,7 @@ class ValidateTest extends \PHPUnit_Framework_TestCase ->method('setData') ->with($responseArray); - $this->validateMock->execute(); + $this->validateMock->executeInternal(); } /** diff --git a/app/code/Magento/Version/Controller/Index/Index.php b/app/code/Magento/Version/Controller/Index/Index.php index 0fe6235bc6ca091e830b184ffa73b3be57875e58..48feb6eb4236bd46922d913e544eb7cd39526fab 100644 --- a/app/code/Magento/Version/Controller/Index/Index.php +++ b/app/code/Magento/Version/Controller/Index/Index.php @@ -37,7 +37,7 @@ class Index extends Action * * @return void */ - public function execute() + public function executeInternal() { $versionParts = explode('.', $this->productMetadata->getVersion()); if (!isset($versionParts[0]) || !isset($versionParts[1])) { diff --git a/app/code/Magento/Weee/Helper/Data.php b/app/code/Magento/Weee/Helper/Data.php index 55db9791896ecb8307b01bee407fb1bf1a84eaa9..138ae26986b5aaf112780ed64e2c8ecd5f08cb0c 100644 --- a/app/code/Magento/Weee/Helper/Data.php +++ b/app/code/Magento/Weee/Helper/Data.php @@ -739,12 +739,12 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper } /** - * get FPT DISPLAY_INCL setting + * Get FPT DISPLAY_INCL setting * * @param int|null $storeId * @return bool */ - public function geDisplayIncl($storeId = null) + public function isDisplayIncl($storeId = null) { return $this->typeOfDisplay( WeeeDisplayConfig::DISPLAY_INCL, @@ -754,12 +754,27 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper } /** - * get FPT DISPLAY_EXCL_DESCR_INCL setting + * Get FPT DISPLAY_INCL_DESCR setting * * @param int|null $storeId * @return bool */ - public function geDisplayExlDescIncl($storeId = null) + public function isDisplayInclDesc($storeId = null) + { + return $this->typeOfDisplay( + WeeeDisplayConfig::DISPLAY_INCL_DESCR, + \Magento\Framework\Pricing\Render::ZONE_ITEM_VIEW, + $storeId + ); + } + + /** + * Get FPT DISPLAY_EXCL_DESCR_INCL setting + * + * @param int|null $storeId + * @return bool + */ + public function isDisplayExclDescIncl($storeId = null) { return $this->typeOfDisplay( WeeeDisplayConfig::DISPLAY_EXCL_DESCR_INCL, @@ -769,12 +784,12 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper } /** - * get FPT DISPLAY_EXCL setting + * Get FPT DISPLAY_EXCL setting * * @param int|null $storeId * @return bool */ - public function geDisplayExcl($storeId = null) + public function isDisplayExcl($storeId = null) { return $this->typeOfDisplay( WeeeDisplayConfig::DISPLAY_EXCL, diff --git a/app/code/Magento/Weee/Model/App/Action/ContextPlugin.php b/app/code/Magento/Weee/Model/App/Action/ContextPlugin.php index 19502e3d794c4a220e8d8c7f878255638236a182..052e4679027f46d323c68de50cc806b416998ff5 100644 --- a/app/code/Magento/Weee/Model/App/Action/ContextPlugin.php +++ b/app/code/Magento/Weee/Model/App/Action/ContextPlugin.php @@ -100,7 +100,7 @@ class ContextPlugin * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function aroundDispatch( + public function aroundExecute( \Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/app/code/Magento/Weee/Model/Config/Source/Display.php b/app/code/Magento/Weee/Model/Config/Source/Display.php index c5408a0489f491686df9c2765677ec76f43754f3..6782463857870196fdf75b7e46bc6dd487df1889 100644 --- a/app/code/Magento/Weee/Model/Config/Source/Display.php +++ b/app/code/Magento/Weee/Model/Config/Source/Display.php @@ -15,16 +15,22 @@ class Display implements \Magento\Framework\Option\ArrayInterface public function toOptionArray() { return [ - ['value' => \Magento\Weee\Model\Tax::DISPLAY_INCL, 'label' => __('Including FPT only')], + [ + 'value' => \Magento\Weee\Model\Tax::DISPLAY_INCL, + 'label' => __('Including FPT only') + ], [ 'value' => \Magento\Weee\Model\Tax::DISPLAY_INCL_DESCR, 'label' => __('Including FPT and FPT description') ], [ 'value' => \Magento\Weee\Model\Tax::DISPLAY_EXCL_DESCR_INCL, - 'label' => __('Excluding FPT, FPT description, final price') + 'label' => __('Excluding FPT. Including FPT description and final price') ], - ['value' => \Magento\Weee\Model\Tax::DISPLAY_EXCL, 'label' => __('Excluding FPT')] + [ + 'value' => \Magento\Weee\Model\Tax::DISPLAY_EXCL, + 'label' => __('Excluding FPT') + ] ]; } } diff --git a/app/code/Magento/Weee/Model/Tax.php b/app/code/Magento/Weee/Model/Tax.php index 8550915d5a21d2c56d86c019e04c3361418e1ac0..a21bc4a163ff30332cc9c7b10d0bcb2506591f92 100644 --- a/app/code/Magento/Weee/Model/Tax.php +++ b/app/code/Magento/Weee/Model/Tax.php @@ -27,7 +27,7 @@ class Tax extends \Magento\Framework\Model\AbstractModel const DISPLAY_INCL_DESCR = 1; /** - * Excluding FPT, FPT description, final price + * Excluding FPT. Including FPT description and final price */ const DISPLAY_EXCL_DESCR_INCL = 2; diff --git a/app/code/Magento/Weee/Observer/GetPriceConfigurationObserver.php b/app/code/Magento/Weee/Observer/GetPriceConfigurationObserver.php index 96effbb8545bfb5b54ec2fffa3e15481afd871c8..264bd13de6138459f94b6194240634b1e0bc88d5 100644 --- a/app/code/Magento/Weee/Observer/GetPriceConfigurationObserver.php +++ b/app/code/Magento/Weee/Observer/GetPriceConfigurationObserver.php @@ -142,8 +142,8 @@ class GetPriceConfigurationObserver implements ObserverInterface protected function getWhichCalcPriceToUse($storeId = null) { $calcPrice = 'finalPrice'; - if ($this->weeeData->geDisplayExcl($storeId) || - $this->weeeData->geDisplayExlDescIncl($storeId) || + if ($this->weeeData->isDisplayExcl($storeId) || + $this->weeeData->isDisplayExclDescIncl($storeId) || ($this->taxData->priceIncludesTax() && $this->taxData->displayPriceExcludingTax()) ) { $calcPrice = 'basePrice'; diff --git a/app/code/Magento/Weee/Observer/UpdateProductOptionsObserver.php b/app/code/Magento/Weee/Observer/UpdateProductOptionsObserver.php index 77d022811702a4fb2ab58bb76dc1a4fe760a79dd..3619e9ae9e643b9782c1747016846b78cd125018 100644 --- a/app/code/Magento/Weee/Observer/UpdateProductOptionsObserver.php +++ b/app/code/Magento/Weee/Observer/UpdateProductOptionsObserver.php @@ -59,23 +59,28 @@ class UpdateProductOptionsObserver implements ObserverInterface return $this; } - if ($this->weeeData->isEnabled() && - !$this->weeeData->geDisplayIncl($product->getStoreId()) && - !$this->weeeData->geDisplayExcl($product->getStoreId()) - ) { - // only do processing on bundle product - if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) { - if (!array_key_exists('optionTemplate', $options)) { - $calcPrice = $this->getWhichCalcPriceToUse($product->getStoreId()); - $options['optionTemplate'] = '<%- data.label %>' - . '<% if (data.' . $calcPrice . '.value) { %>' - . ' +<%- data.' . $calcPrice . '.formatted %>' - . '<% } %>'; - } + // if the Weee module is enabled, then only do processing on bundle products + if ($this->weeeData->isEnabled() && $product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) { + + if ($this->taxData->priceIncludesTax() && $this->taxData->displayPriceExcludingTax()) { + // the Tax module might have set up a default, but we will re-decide which calcPrice field to use + unset($options['optionTemplate']); + } + + if (!array_key_exists('optionTemplate', $options)) { + $calcPrice = $this->getWhichCalcPriceToUse($product->getStoreId()); + $options['optionTemplate'] = '<%- data.label %>' + . '<% if (data.' . $calcPrice . '.value) { %>' + . ' +<%- data.' . $calcPrice . '.formatted %>' + . '<% } %>'; + } + if (!$this->weeeData->isDisplayIncl($product->getStoreId()) && + !$this->weeeData->isDisplayExcl($product->getStoreId())) { + // we need to display the individual Weee amounts foreach ($this->weeeData->getWeeeAttributesForBundle($product) as $weeeAttributes) { foreach ($weeeAttributes as $weeeAttribute) { - if (!preg_match('/'.$weeeAttribute->getCode().'/', $options['optionTemplate'])) { + if (!preg_match('/' . $weeeAttribute->getCode() . '/', $options['optionTemplate'])) { $options['optionTemplate'] .= sprintf( ' <%% if (data.weeePrice' . $weeeAttribute->getCode() . ') { %%>' . ' (' . $weeeAttribute->getName() @@ -86,15 +91,14 @@ class UpdateProductOptionsObserver implements ObserverInterface } } } + } - if ($this->weeeData->geDisplayExlDescIncl($product->getStoreId())) { - $options['optionTemplate'] .= sprintf( - ' <%% if (data.weeePrice) { %%>' - . '<%%- data.weeePrice.formatted %%>' - . '<%% } %%>' - ); - } - + if ($this->weeeData->isDisplayExclDescIncl($product->getStoreId())) { + $options['optionTemplate'] .= sprintf( + ' <%% if (data.weeePrice) { %%>' + . '<%%- data.weeePrice.formatted %%>' + . '<%% } %%>' + ); } } $response->setAdditionalOptions($options); @@ -102,7 +106,7 @@ class UpdateProductOptionsObserver implements ObserverInterface } /** - * Returns which product price to use as a basis for the Weee's final price + * Returns which product price to show (before listing the individual Weee amounts, if applicable) * * @param int|null $storeId * @return string @@ -110,10 +114,9 @@ class UpdateProductOptionsObserver implements ObserverInterface protected function getWhichCalcPriceToUse($storeId = null) { $calcPrice = 'finalPrice'; - if ($this->weeeData->geDisplayExcl($storeId) || - $this->weeeData->geDisplayExlDescIncl($storeId) || - ($this->taxData->priceIncludesTax() && $this->taxData->displayPriceExcludingTax()) - ) { + + if ($this->weeeData->isDisplayExclDescIncl($storeId) || + ($this->weeeData->isDisplayExcl($storeId) && $this->taxData->displayPriceExcludingTax())) { $calcPrice = 'basePrice'; } return $calcPrice; diff --git a/app/code/Magento/Weee/README.md b/app/code/Magento/Weee/README.md index 3fda5bbc12bb038acf560c52d48571ecfd587b4d..0218dcd85ed9cb433e21a52a44e856be287f8aaa 100644 --- a/app/code/Magento/Weee/README.md +++ b/app/code/Magento/Weee/README.md @@ -18,7 +18,7 @@ Magento_Weee module can be installed automatically (using native Magento install Magento installation with existing products with FPT: * Disable FPT on the backend * Remove all products with FPT -* Remove all FPT attributes from product templates +* Remove all FPT attributes from attribute sets * Delete all FPT attributes * Remove module directory from the code base * New Magento installation: diff --git a/app/code/Magento/Weee/Test/Unit/App/Action/ContextPluginTest.php b/app/code/Magento/Weee/Test/Unit/App/Action/ContextPluginTest.php index d910384f79e717839334ab670c255aa5777177a6..5f771f2748e3268ef93797118d35dae21d423095 100644 --- a/app/code/Magento/Weee/Test/Unit/App/Action/ContextPluginTest.php +++ b/app/code/Magento/Weee/Test/Unit/App/Action/ContextPluginTest.php @@ -123,7 +123,7 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase ); } - public function testAroundDispatchBasedOnDefault() + public function testAroundExecuteBasedOnDefault() { $this->customerSessionMock->expects($this->once()) ->method('isLoggedIn') @@ -191,10 +191,10 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase $proceed = function ($request) use ($expectedResult) { return $expectedResult; }; - $this->contextPlugin->aroundDispatch($action, $proceed, $request); + $this->contextPlugin->aroundExecute($action, $proceed, $request); } - public function testAroundDispatchBasedOnOrigin() + public function testAroundExecuteBasedOnOrigin() { $this->customerSessionMock->expects($this->once()) ->method('isLoggedIn') @@ -223,10 +223,10 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase $proceed = function ($request) use ($expectedResult) { return $expectedResult; }; - $this->contextPlugin->aroundDispatch($action, $proceed, $request); + $this->contextPlugin->aroundExecute($action, $proceed, $request); } - public function testAroundDispatchBasedOnBilling() + public function testAroundExecuteBasedOnBilling() { $this->customerSessionMock->expects($this->once()) ->method('isLoggedIn') @@ -298,10 +298,10 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase $proceed = function ($request) use ($expectedResult) { return $expectedResult; }; - $this->contextPlugin->aroundDispatch($action, $proceed, $request); + $this->contextPlugin->aroundExecute($action, $proceed, $request); } - public function testAroundDispatchBasedOnShipping() + public function testAroundExecuteBasedOnShipping() { $this->customerSessionMock->expects($this->once()) ->method('isLoggedIn') @@ -373,6 +373,6 @@ class ContextPluginTest extends \PHPUnit_Framework_TestCase $proceed = function ($request) use ($expectedResult) { return $expectedResult; }; - $this->contextPlugin->aroundDispatch($action, $proceed, $request); + $this->contextPlugin->aroundExecute($action, $proceed, $request); } } diff --git a/app/code/Magento/Weee/Test/Unit/Observer/UpdateProductOptionsObserverTest.php b/app/code/Magento/Weee/Test/Unit/Observer/UpdateProductOptionsObserverTest.php index 8725a62d837be15e68989b1fb1eab050ab0f4968..9fa6c897807a78a8025e6cba387dcaba4eb728f4 100644 --- a/app/code/Magento/Weee/Test/Unit/Observer/UpdateProductOptionsObserverTest.php +++ b/app/code/Magento/Weee/Test/Unit/Observer/UpdateProductOptionsObserverTest.php @@ -6,25 +6,28 @@ namespace Magento\Weee\Test\Unit\Observer; -use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Weee\Model\Tax as WeeeDisplayConfig; +use Magento\Tax\Model\Config as TaxConfig; class UpdateProductOptionsObserverTest extends \PHPUnit_Framework_TestCase { /** * Tests the methods that rely on the ScopeConfigInterface object to provide their return values * - * @param array $testArray The initial array that specifies the set of additional options + * @param array $initialArray The initial array that specifies the set of additional options * @param bool $weeeEnabled Whether the Weee module is assumed to be enabled - * @param bool $weeeDisplayExclDescIncl Is this Weee display setting assumed to be set + * @param int $weeeDisplay Which Weee display is configured + * @param int $priceDisplay Values are: including tax, excluding tax, or both including and excluding tax * @param array $expectedArray The revised array of the additional options * * @dataProvider updateProductOptionsProvider */ - public function testUpdateProductOptions($testArray, $weeeEnabled, $weeeDisplayExclDescIncl, $expectedArray) + public function testUpdateProductOptions($initialArray, $weeeEnabled, $weeeDisplay, $priceDisplay, $expectedArray) { $configObj = new \Magento\Framework\DataObject( [ - 'additional_options' => $testArray, + 'additional_options' => $initialArray, ] ); @@ -47,12 +50,26 @@ class UpdateProductOptionsObserverTest extends \PHPUnit_Framework_TestCase ->method('isEnabled') ->will($this->returnValue($weeeEnabled)); $weeeHelper->expects($this->any()) - ->method('geDisplayExlDescIncl') - ->will($this->returnValue($weeeDisplayExclDescIncl)); + ->method('isDisplayIncl') + ->will($this->returnValue($weeeDisplay == WeeeDisplayConfig::DISPLAY_INCL)); + $weeeHelper->expects($this->any()) + ->method('isDisplayExclDescIncl') + ->will($this->returnValue($weeeDisplay == WeeeDisplayConfig::DISPLAY_EXCL_DESCR_INCL)); + $weeeHelper->expects($this->any()) + ->method('isDisplayExcl') + ->will($this->returnValue($weeeDisplay == WeeeDisplayConfig::DISPLAY_EXCL)); $weeeHelper->expects($this->any()) ->method('getWeeeAttributesForBundle') ->will($this->returnValue([['fpt1' => $weeeObject1], ['fpt1'=>$weeeObject1, 'fpt2'=>$weeeObject2]])); + $taxHelper=$this->getMock('Magento\Tax\Helper\Data', [], [], '', false); + $taxHelper->expects($this->any()) + ->method('displayPriceExcludingTax') + ->will($this->returnValue($priceDisplay == TaxConfig::DISPLAY_TYPE_EXCLUDING_TAX)); + $taxHelper->expects($this->any()) + ->method('priceIncludesTax') + ->will($this->returnValue(true)); + $responseObject=$this->getMock('Magento\Framework\Event\Observer', ['getResponseObject'], [], '', false); $responseObject->expects($this->any()) ->method('getResponseObject') @@ -83,6 +100,7 @@ class UpdateProductOptionsObserverTest extends \PHPUnit_Framework_TestCase 'Magento\Weee\Observer\UpdateProductOptionsObserver', [ 'weeeData' => $weeeHelper, + 'taxData' => $taxHelper, 'registry' => $registry, ] ); @@ -99,13 +117,30 @@ class UpdateProductOptionsObserverTest extends \PHPUnit_Framework_TestCase { return [ 'weee not enabled' => [ - 'testArray' => [ + 'initialArray' => [ + 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', + 'optionTemplate' => '<%= data.label %><% if (data.finalPrice.value) ' + . '{ %> +<%- data.finalPrice.formatted %><% } %>', + ], + 'weeeEnabled' => false, + 'weeeDisplay' => WeeeDisplayConfig::DISPLAY_INCL, // has no effect for this scenario + 'priceDisplay' => TaxConfig::DISPLAY_TYPE_EXCLUDING_TAX, // has no effect for this scenario + 'expectedArray' => [ + 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', + 'optionTemplate' => '<%= data.label %><% if (data.finalPrice.value) ' + . '{ %> +<%- data.finalPrice.formatted %><% } %>', + ], + ], + + 'weee enabled, and display with Weee included in the price' => [ + 'initialArray' => [ 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', 'optionTemplate' => '<%= data.label %><% if (data.basePrice.value) ' . '{ %> +<%- data.basePrice.formatted %><% } %>', ], - 'weeeEnabled' => false, - 'weeeDisplayExclDescIncl' => true, + 'weeeEnabled' => true, + 'weeeDisplay' => WeeeDisplayConfig::DISPLAY_INCL, + 'priceDisplay' => TaxConfig::DISPLAY_TYPE_INCLUDING_TAX, 'expectedArray' => [ 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', 'optionTemplate' => '<%= data.label %><% if (data.basePrice.value) ' @@ -113,31 +148,33 @@ class UpdateProductOptionsObserverTest extends \PHPUnit_Framework_TestCase ], ], - 'weee enabled, but not displaying ExclDescIncl' => [ - 'testArray' => [ + 'weee enabled, and display with Weee included in the price, and include the Weee descriptions' => [ + 'initialArray' => [ 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', 'optionTemplate' => '<%= data.label %><% if (data.basePrice.value) ' . '{ %> +<%- data.basePrice.formatted %><% } %>', ], 'weeeEnabled' => true, - 'weeeDisplayExclDescIncl' => false, + 'weeeDisplay' => WeeeDisplayConfig::DISPLAY_INCL_DESCR, + 'priceDisplay' => TaxConfig::DISPLAY_TYPE_INCLUDING_TAX, 'expectedArray' => [ 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', 'optionTemplate' => '<%= data.label %><% if (data.basePrice.value) ' . '{ %> +<%- data.basePrice.formatted %><% } %> <% if (data.weeePricefpt1) ' - . '{ %> (: <%- data.weeePricefpt1.formatted %>)<% } %>' - . ' <% if (data.weeePricefpt2) { %> (: <%- data.weeePricefpt2.formatted %>)<% } %>', + . '{ %> (: <%- data.weeePricefpt1.formatted %>)<% } %> ' + . '<% if (data.weeePricefpt2) { %> (: <%- data.weeePricefpt2.formatted %>)<% } %>', ], ], 'weee enabled, and display with ExclDescIncl' => [ - 'testArray' => [ + 'initialArray' => [ 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', 'optionTemplate' => '<%= data.label %><% if (data.basePrice.value) ' . '{ %> +<%- data.basePrice.formatted %><% } %>', ], 'weeeEnabled' => true, - 'weeeDisplayExclDescIncl' => true, + 'weeeDisplay' => WeeeDisplayConfig::DISPLAY_EXCL_DESCR_INCL, + 'priceDisplay' => TaxConfig::DISPLAY_TYPE_INCLUDING_TAX, 'expectedArray' => [ 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', 'optionTemplate' => '<%= data.label %><% if (data.basePrice.value) ' @@ -147,6 +184,34 @@ class UpdateProductOptionsObserverTest extends \PHPUnit_Framework_TestCase . '<% if (data.weeePrice) { %><%- data.weeePrice.formatted %><% } %>', ], ], + + 'weee enabled, and display prices including tax but without Weee' => [ + 'initialArray' => [ + 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', + ], + 'weeeEnabled' => true, + 'weeeDisplay' => WeeeDisplayConfig::DISPLAY_EXCL, + 'priceDisplay' => TaxConfig::DISPLAY_TYPE_INCLUDING_TAX, + 'expectedArray' => [ + 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', + 'optionTemplate' => '<%- data.label %><% if (data.finalPrice.value) ' + . '{ %> +<%- data.finalPrice.formatted %><% } %>', + ], + ], + + 'weee enabled, and display prices excluding tax but without Weee' => [ + 'initialArray' => [ + 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', + ], + 'weeeEnabled' => true, + 'weeeDisplay' => WeeeDisplayConfig::DISPLAY_EXCL, + 'priceDisplay' => TaxConfig::DISPLAY_TYPE_EXCLUDING_TAX, + 'expectedArray' => [ + 'TOTAL_BASE_CALCULATION' => 'TOTAL_BASE_CALCULATION', + 'optionTemplate' => '<%- data.label %><% if (data.basePrice.value) ' + . '{ %> +<%- data.basePrice.formatted %><% } %>', + ], + ], ]; } } diff --git a/app/code/Magento/Weee/i18n/de_DE.csv b/app/code/Magento/Weee/i18n/de_DE.csv index 7ec820d9eb205f5c9f27ebef7b290e9a4e9d3ca9..5c64ff992a1fafd049616625934bd2feb3b6ba77 100644 --- a/app/code/Magento/Weee/i18n/de_DE.csv +++ b/app/code/Magento/Weee/i18n/de_DE.csv @@ -7,7 +7,7 @@ Website,Website "We found a duplicate of website, country and state fields for a fixed product tax","We found a duplicate of website, country and state fields for a fixed product tax" "Including FPT only","Lediglich einschließlich FPT" "Including FPT and FPT description","Einschließlich FPT und FPT-Beschreibung" -"Excluding FPT, FPT description, final price","Ausschließlich FPT, FPT-Beschreibung, Endpreis" +"Excluding FPT. Including FPT description and final price","Excluding FPT. Including FPT description and final price" "Excluding FPT","Ausschließlich FPT" "Fixed Product Tax","Feste Produktsteuer" Country/State,Country/State diff --git a/app/code/Magento/Weee/i18n/en_US.csv b/app/code/Magento/Weee/i18n/en_US.csv index e0989690885440cf7da81d32be361a8b2814234e..668926b681505716a6eb73ed537d715559a0cf41 100644 --- a/app/code/Magento/Weee/i18n/en_US.csv +++ b/app/code/Magento/Weee/i18n/en_US.csv @@ -7,7 +7,7 @@ Website,Website "We found a duplicate of website, country and state fields for a fixed product tax","We found a duplicate of website, country and state fields for a fixed product tax" "Including FPT only","Including FPT only" "Including FPT and FPT description","Including FPT and FPT description" -"Excluding FPT, FPT description, final price","Excluding FPT, FPT description, final price" +"Excluding FPT. Including FPT description and final price","Excluding FPT. Including FPT description and final price" "Excluding FPT","Excluding FPT" "Fixed Product Tax","Fixed Product Tax" Country/State,Country/State diff --git a/app/code/Magento/Weee/i18n/es_ES.csv b/app/code/Magento/Weee/i18n/es_ES.csv index 75afe15b65ecdf9ebdd74e2c5623116e493d9a8a..967e9d55c1650a2482c4b46460dc62581d408bfc 100644 --- a/app/code/Magento/Weee/i18n/es_ES.csv +++ b/app/code/Magento/Weee/i18n/es_ES.csv @@ -7,7 +7,7 @@ Website,Website "We found a duplicate of website, country and state fields for a fixed product tax","We found a duplicate of website, country and state fields for a fixed product tax" "Including FPT only","Incluir sólo FPT" "Including FPT and FPT description","Inlcuir impuestos y descripción de los impuestos" -"Excluding FPT, FPT description, final price","Excluido FPT, descripción FPT, precio final" +"Excluding FPT. Including FPT description and final price","Excluding FPT. Including FPT description and final price" "Excluding FPT","FPT no incluido" "Fixed Product Tax","Impuesto fijo del producto" Country/State,Country/State diff --git a/app/code/Magento/Weee/i18n/fr_FR.csv b/app/code/Magento/Weee/i18n/fr_FR.csv index 7570f61e26c2639aa9e0a7ed5406f320cf9a2527..3361b7bc238a1a7fa451350672cf9b3cc363eb0b 100644 --- a/app/code/Magento/Weee/i18n/fr_FR.csv +++ b/app/code/Magento/Weee/i18n/fr_FR.csv @@ -7,7 +7,7 @@ Website,Website "We found a duplicate of website, country and state fields for a fixed product tax","We found a duplicate of website, country and state fields for a fixed product tax" "Including FPT only","Inclure uniquement les taxes sur les produits fixes" "Including FPT and FPT description","Inclure les taxes sur les produits fixes et leur description" -"Excluding FPT, FPT description, final price","Exclure les taxes sur les produits fixes, les descriptions, et le prix final" +"Excluding FPT. Including FPT description and final price","Excluding FPT. Including FPT description and final price" "Excluding FPT","Exclure les taxes sur les produits fixes" "Fixed Product Tax","Taxe sur le produit fixe" Country/State,Country/State diff --git a/app/code/Magento/Weee/i18n/nl_NL.csv b/app/code/Magento/Weee/i18n/nl_NL.csv index b86bb1920067043ab369c9e056293be0601982c1..b21a8574d6dd2e3b192d79a47700df287dc41391 100644 --- a/app/code/Magento/Weee/i18n/nl_NL.csv +++ b/app/code/Magento/Weee/i18n/nl_NL.csv @@ -7,7 +7,7 @@ Website,Website "We found a duplicate of website, country and state fields for a fixed product tax","We found a duplicate of website, country and state fields for a fixed product tax" "Including FPT only","Inclusief alleen FPT" "Including FPT and FPT description","Inclusief FPT en FPT omschrijving" -"Excluding FPT, FPT description, final price","Met uitzondering van FPT, FPT omschrijving, definitieve prijs" +"Excluding FPT. Including FPT description and final price","Excluding FPT. Including FPT description and final price" "Excluding FPT","Met uitzondering van FPT" "Fixed Product Tax","Vaste Product Belasting" Country/State,Country/State diff --git a/app/code/Magento/Weee/i18n/pt_BR.csv b/app/code/Magento/Weee/i18n/pt_BR.csv index 7f2a0e7632ad9ef4553e6225c06ba2aa31ab0d32..881b6fe4a60aff57b39dbae4619549883f392348 100644 --- a/app/code/Magento/Weee/i18n/pt_BR.csv +++ b/app/code/Magento/Weee/i18n/pt_BR.csv @@ -7,7 +7,7 @@ Website,Website "We found a duplicate of website, country and state fields for a fixed product tax","We found a duplicate of website, country and state fields for a fixed product tax" "Including FPT only","Incluindo somente FPT" "Including FPT and FPT description","Incluindo FPT e descrição de FPT" -"Excluding FPT, FPT description, final price","Excluindo FPT, descrição de FPT, preço final" +"Excluding FPT. Including FPT description and final price","Excluding FPT. Including FPT description and final price" "Excluding FPT","Excluindo FPT" "Fixed Product Tax","Imposto fixo do produto" Country/State,Country/State diff --git a/app/code/Magento/Weee/i18n/zh_Hans_CN.csv b/app/code/Magento/Weee/i18n/zh_Hans_CN.csv index a2c88c879992e63a8e090089d07671e0b3bc6773..55878a66c3ffbe5e528693b31e9f78ae00ed8939 100644 --- a/app/code/Magento/Weee/i18n/zh_Hans_CN.csv +++ b/app/code/Magento/Weee/i18n/zh_Hans_CN.csv @@ -7,7 +7,7 @@ Website,Website "We found a duplicate of website, country and state fields for a fixed product tax","We found a duplicate of website, country and state fields for a fixed product tax" "Including FPT only","ä»…åŒ…å« FPT" "Including FPT and FPT description","åŒ…å« FPT å’Œ FPT æè¿°" -"Excluding FPT, FPT description, final price","ä¸åŒ…å« FPT,FPT æè¿°ï¼Œæœ€ç»ˆä»·æ ¼" +"Excluding FPT. Including FPT description and final price","Excluding FPT. Including FPT description and final price" "Excluding FPT","ä¸åŒ…å« FPT" "Fixed Product Tax",固定产å“税费 Country/State,Country/State diff --git a/app/code/Magento/Weee/view/frontend/templates/checkout/cart/item/price/sidebar.phtml b/app/code/Magento/Weee/view/frontend/templates/checkout/cart/item/price/sidebar.phtml index 0f71192ce3985097bb36583c0f7be9463ee1d00e..2da14c7d14b5e96b7e87c2972d035324704071ee 100644 --- a/app/code/Magento/Weee/view/frontend/templates/checkout/cart/item/price/sidebar.phtml +++ b/app/code/Magento/Weee/view/frontend/templates/checkout/cart/item/price/sidebar.phtml @@ -9,24 +9,30 @@ /** @var $block \Magento\Weee\Block\Item\Price\Renderer */ $item = $block->getItem(); + +// ensure we use the zone for the shopping cart / minicart +$originalZone = $block->getZone(); +$block->setZone(\Magento\Framework\Pricing\Render::ZONE_CART); ?> + <?php if ($block->displayPriceInclTax() || $block->displayBothPrices()): ?> -<span class="price-including-tax" data-label="<?php echo $block->escapeHtml(__('Incl. Tax')); ?>"> - <?php if ($block->displayPriceWithWeeeDetails()): ?> - <span class="minicart-tax-total"> - <?php else: ?> + <span class="price-including-tax" data-label="<?php echo $block->escapeHtml(__('Incl. Tax')); ?>"> + <?php if ($block->displayPriceWithWeeeDetails()): ?> + <span class="minicart-tax-total"> + <?php else: ?> <span class="minicart-price"> - <?php endif; ?> + <?php endif; ?> <?php /* @escapeNotVerified */ echo $block->formatPrice($block->getUnitDisplayPriceInclTax()); ?> - </span> + </span> + <?php if ($block->displayPriceWithWeeeDetails()): ?> <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($item)): ?> - <span class="minicart-tax-info" style="display: none"> - <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($item) as $tax): ?> - <span class="weee" data-label="<?php /* @escapeNotVerified */ echo $tax['title']; ?>"> - <?php /* @escapeNotVerified */ echo $block->formatPrice($tax['amount_incl_tax'], true, true); ?> - </span> - <?php endforeach; ?> + <span class="minicart-tax-info"> + <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($item) as $tax): ?> + <span class="weee" data-label="<?php /* @escapeNotVerified */ echo $tax['title']; ?>"> + <?php /* @escapeNotVerified */ echo $block->formatPrice($tax['amount_incl_tax'], true, true); ?> + </span> + <?php endforeach; ?> </span> <?php if ($block->displayFinalPrice()): ?> @@ -37,35 +43,39 @@ $item = $block->getItem(); </span> <?php endif; ?> <?php endif; ?> - </span> <?php endif; ?> + </span> +<?php endif; ?> - <?php if ($block->displayPriceExclTax() || $block->displayBothPrices()): ?> +<?php if ($block->displayPriceExclTax() || $block->displayBothPrices()): ?> <span class="price-excluding-tax" data-label="<?php echo $block->escapeHtml(__('Excl. Tax')); ?>"> - <?php if ($block->displayPriceWithWeeeDetails()): ?> + <?php if ($block->displayPriceWithWeeeDetails()): ?> <span class="minicart-tax-total"> - <?php else: ?> - <span class="minicart-price"> - <?php endif; ?> + <?php else: ?> + <span class="minicart-price"> + <?php endif; ?> <?php /* @escapeNotVerified */ echo $block->formatPrice($block->getUnitDisplayPriceExclTax()); ?> - </span> + </span> - <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($item)): ?> - <span class="minicart-tax-info"> - <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($item) as $tax): ?> - <span class="weee" data-label="<?php /* @escapeNotVerified */ echo $tax['title']; ?>"> - <?php /* @escapeNotVerified */ echo $block->formatPrice($tax['amount'], true, true); ?> - </span> - <?php endforeach; ?> + <?php if ($block->displayPriceWithWeeeDetails()): ?> + <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($item)): ?> + <span class="minicart-tax-info"> + <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($item) as $tax): ?> + <span class="weee" data-label="<?php /* @escapeNotVerified */ echo $tax['title']; ?>"> + <?php /* @escapeNotVerified */ echo $block->formatPrice($tax['amount'], true, true); ?> + </span> + <?php endforeach; ?> </span> <?php if ($block->displayFinalPrice()): ?> - <span class="minicart-tax-total"> + <span class="minicart-tax-total"> <span class="weee" data-label="<?php echo $block->escapeHtml(__('Total')); ?>"> <?php /* @escapeNotVerified */ echo $block->formatPrice($block->getFinalUnitDisplayPriceExclTax()); ?> </span> </span> - <?php endif; ?> <?php endif; ?> - </span> <?php endif; ?> + <?php endif; ?> + </span> +<?php endif; ?> +<?php $block->setZone($originalZone); ?> diff --git a/app/code/Magento/Weee/view/frontend/web/template/checkout/summary/weee.html b/app/code/Magento/Weee/view/frontend/web/template/checkout/summary/weee.html index 886e2443918e634c70676bc8218f9e3a66e41bcb..c8d5d922f95677df77c0e5d16d27abcf1d80ec44 100644 --- a/app/code/Magento/Weee/view/frontend/web/template/checkout/summary/weee.html +++ b/app/code/Magento/Weee/view/frontend/web/template/checkout/summary/weee.html @@ -7,7 +7,7 @@ <!-- ko if: isDisplayed() --> <tr class="totals"> <th data-bind="text: title" class="mark" scope="row"></th> - <td class="amount" data-bind="attr: {'data-th': $t(title) }"> + <td class="amount" data-bind="attr: {'data-th': title}"> <span class="price" data-bind="text: getValue()"></span> </td> </tr> diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/BuildWidget.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/BuildWidget.php index 9a3459f897f3e0427a3ac4f8d709da7974fed24c..e29a01447ca072d48f35fc20c818d373b1f2560f 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/BuildWidget.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/BuildWidget.php @@ -30,7 +30,7 @@ class BuildWidget extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { $type = $this->getRequest()->getPost('widget_type'); $params = $this->getRequest()->getPost('parameters', []); diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Index.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Index.php index a30ce4a2a84ce9f9f0105478560e1c3adffe7698..3b0d39820dc7c7a75ef1428819cb857ab7cd2788 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Index.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Index.php @@ -40,7 +40,7 @@ class Index extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { // save extra params for widgets insertion form $skipped = $this->getRequest()->getParam('skip_widgets'); diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Blocks.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Blocks.php index c97ab7250fec097654389a7766917a84cf3b0059..2783889979cb1367c4518fa4918011481ca10409 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Blocks.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Blocks.php @@ -40,7 +40,7 @@ class Blocks extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $this->_objectManager->get( 'Magento\Framework\App\State' diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Categories.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Categories.php index 468a5d1b7de41c0f2716804ff96380ca0999268e..76f624e2f48fb34c83bd4e166efd5bc69cc93e16 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Categories.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Categories.php @@ -40,7 +40,7 @@ class Categories extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return \Magento\Framework\Controller\Result\Raw */ - public function execute() + public function executeInternal() { $selected = $this->getRequest()->getParam('selected', ''); $isAnchorOnly = $this->getRequest()->getParam('is_anchor_only', 0); diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Delete.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Delete.php index 0866ba1fb2e1e0b5d90f47f3e2c809f6e222a367..14e0a85abbda7b9730dfd5a21423ed87b33c8b28 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Delete.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Delete.php @@ -13,7 +13,7 @@ class Delete extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $widgetInstance = $this->_initWidgetInstance(); if ($widgetInstance) { diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Edit.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Edit.php index 978680baa01c24c481043aa1aa458315160bd723..8dfd2a8bc667bc13870dee00d2f02934e089af70 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Edit.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Edit.php @@ -13,7 +13,7 @@ class Edit extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $widgetInstance = $this->_initWidgetInstance(); if (!$widgetInstance) { diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Index.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Index.php index 704730f02c5afeb5c171d28a11d13445da771151..5b6d34743340d022037d15dedccaebb91712affd 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Index.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $this->_initAction(); $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Widgets')); diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/NewAction.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/NewAction.php index 3beb19c5d1dbe0feea77abf3209d5a384cbd88dc..289ec1ee1d03f20d4fd66b1a12ba0ddd95ee7a99 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/NewAction.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/NewAction.php @@ -13,7 +13,7 @@ class NewAction extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $this->_forward('edit'); } diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Products.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Products.php index e750e1f88e583cebab4d37ad5609051bf775e47c..a651f040b54391d373bdfb6488369082fbe065d0 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Products.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Products.php @@ -13,7 +13,7 @@ class Products extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $selected = $this->getRequest()->getParam('selected', ''); $productTypeId = $this->getRequest()->getParam('product_type_id', ''); diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Save.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Save.php index 5435ef423cb224e83fabbc5e9216e3176037c01e..14657be5478e6564d2698d450efda0c488a03ba3 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Save.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Save.php @@ -13,7 +13,7 @@ class Save extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $widgetInstance = $this->_initWidgetInstance(); if (!$widgetInstance) { diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Template.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Template.php index 4dea5a9f972d0f807967dcd3f3de7c1aaa7fc9c9..e7ad7a9e31be0ae897bc3730d925090c74e717a5 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Template.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Template.php @@ -13,7 +13,7 @@ class Template extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { /* @var $widgetInstance \Magento\Widget\Model\Widget\Instance */ $widgetInstance = $this->_initWidgetInstance(); diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Validate.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Validate.php index fe2bb5aaf694c3d91aca6b29c3b6f3206648fc00..e37a93e5e61e6b21f70539d355a7646131a9e2b1 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Validate.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance/Validate.php @@ -13,7 +13,7 @@ class Validate extends \Magento\Widget\Controller\Adminhtml\Widget\Instance * * @return void */ - public function execute() + public function executeInternal() { $response = new \Magento\Framework\DataObject(); $response->setError(false); diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/LoadOptions.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/LoadOptions.php index 769b2d587cdd81b91764e9b92ecae9eec0750599..10fccc4c7246ce30b6c85ed44882ab240956fee8 100644 --- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/LoadOptions.php +++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/LoadOptions.php @@ -13,7 +13,7 @@ class LoadOptions extends \Magento\Backend\App\Action * * @return void */ - public function execute() + public function executeInternal() { try { $this->_view->loadLayout(); diff --git a/app/code/Magento/Widget/Test/Unit/Controller/Adminhtml/Widget/Instance/CategoriesTest.php b/app/code/Magento/Widget/Test/Unit/Controller/Adminhtml/Widget/Instance/CategoriesTest.php index 5a03ca570269871e81da22280dfc25da5bfbd65d..0def0e1383369e938a9642444428edc75e50be8f 100644 --- a/app/code/Magento/Widget/Test/Unit/Controller/Adminhtml/Widget/Instance/CategoriesTest.php +++ b/app/code/Magento/Widget/Test/Unit/Controller/Adminhtml/Widget/Instance/CategoriesTest.php @@ -120,6 +120,6 @@ class CategoriesTest extends \PHPUnit_Framework_TestCase 'layout' => $this->layout ] ); - $this->assertSame($this->resultRaw, $this->controller->execute()); + $this->assertSame($this->resultRaw, $this->controller->executeInternal()); } } diff --git a/app/code/Magento/Widget/view/adminhtml/templates/catalog/category/widget/tree.phtml b/app/code/Magento/Widget/view/adminhtml/templates/catalog/category/widget/tree.phtml index e114d5ade56fe7584a4ded49e4cf8b67335abafc..135880f5f314214efdc4d95540f489a5fc7bd8fe 100644 --- a/app/code/Magento/Widget/view/adminhtml/templates/catalog/category/widget/tree.phtml +++ b/app/code/Magento/Widget/view/adminhtml/templates/catalog/category/widget/tree.phtml @@ -10,9 +10,7 @@ <?php $_divId = 'tree' . $block->getId() ?> <div id="<?php /* @escapeNotVerified */ echo $_divId ?>" class="tree"></div> -<!--[if IE]> <script id="ie-deferred-loader" defer="defer" src=""></script> -<![endif]--> <script> require(['jquery', "prototype", "extjs/ext-tree-checkbox"], function(jQuery){ diff --git a/app/code/Magento/Widget/view/adminhtml/templates/instance/edit/layout.phtml b/app/code/Magento/Widget/view/adminhtml/templates/instance/edit/layout.phtml index 94a3eb7145be0c27125f3adfbddd11b998bade3e..6831ca32a007b1c5abe9f67b322e76fe5ee38749 100644 --- a/app/code/Magento/Widget/view/adminhtml/templates/instance/edit/layout.phtml +++ b/app/code/Magento/Widget/view/adminhtml/templates/instance/edit/layout.phtml @@ -15,9 +15,7 @@ <div class="actions"><?php echo $block->getAddLayoutButtonHtml() ?></div> </div> </fieldset> -<!--[if IE]> <script id="ie-deferred-loader" defer="defer" src=""></script> -<![endif]--> <script> require([ 'jquery', diff --git a/app/code/Magento/Wishlist/Controller/Index/Add.php b/app/code/Magento/Wishlist/Controller/Index/Add.php index 19b893de9f8a7ba164c68458477e44b946a5df99..36c24b6176f2dac037307b26f5ecff8090db1d30 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Add.php +++ b/app/code/Magento/Wishlist/Controller/Index/Add.php @@ -59,7 +59,7 @@ class Add extends Action\Action implements IndexInterface * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ - public function execute() + public function executeInternal() { $wishlist = $this->wishlistProvider->getWishlist(); if (!$wishlist) { diff --git a/app/code/Magento/Wishlist/Controller/Index/Allcart.php b/app/code/Magento/Wishlist/Controller/Index/Allcart.php index 7cf5a187a5687bace697d03101e9ad7e78c8b8c3..e8892270a799138afe5006dc8feb8f8670a56411 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Allcart.php +++ b/app/code/Magento/Wishlist/Controller/Index/Allcart.php @@ -53,7 +53,7 @@ class Allcart extends Action\Action implements IndexInterface * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Forward $resultForward */ $resultForward = $this->resultFactory->create(ResultFactory::TYPE_FORWARD); diff --git a/app/code/Magento/Wishlist/Controller/Index/Cart.php b/app/code/Magento/Wishlist/Controller/Index/Cart.php index 8075c8e6b6ea86ed68622412637f51b6645d946c..ca39fbb782b91fad92be43df1d62ba11573ce0f3 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Cart.php +++ b/app/code/Magento/Wishlist/Controller/Index/Cart.php @@ -107,7 +107,7 @@ class Cart extends Action\Action implements IndexInterface * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { $itemId = (int)$this->getRequest()->getParam('item'); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Wishlist/Controller/Index/Configure.php b/app/code/Magento/Wishlist/Controller/Index/Configure.php index bc8e001e2505530efae83aa1607f374ad8cea31b..3d1077464d9a7ebb6b1d4377995bf8658598d57e 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Configure.php +++ b/app/code/Magento/Wishlist/Controller/Index/Configure.php @@ -53,7 +53,7 @@ class Configure extends Action\Action implements IndexInterface * @return \Magento\Framework\Controller\ResultInterface * @throws NotFoundException */ - public function execute() + public function executeInternal() { $id = (int)$this->getRequest()->getParam('id'); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Wishlist/Controller/Index/DownloadCustomOption.php b/app/code/Magento/Wishlist/Controller/Index/DownloadCustomOption.php index 1edd5e4426ee0343e25a9ab270674e72c74a4b79..5dd0ff2c27867112be932f511c13a35afab394f7 100644 --- a/app/code/Magento/Wishlist/Controller/Index/DownloadCustomOption.php +++ b/app/code/Magento/Wishlist/Controller/Index/DownloadCustomOption.php @@ -36,7 +36,7 @@ class DownloadCustomOption extends Action\Action implements IndexInterface * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExitExpression) */ - public function execute() + public function executeInternal() { $option = $this->_objectManager->create( 'Magento\Wishlist\Model\Item\Option' diff --git a/app/code/Magento/Wishlist/Controller/Index/Fromcart.php b/app/code/Magento/Wishlist/Controller/Index/Fromcart.php index 8ee09cc1d33b71d068ae3c15f6a4346bf272e2ee..443d46f103dc1ed1542924c0001a01d5f1cbdbd5 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Fromcart.php +++ b/app/code/Magento/Wishlist/Controller/Index/Fromcart.php @@ -78,7 +78,7 @@ class Fromcart extends Action\Action implements IndexInterface * @throws NotFoundException * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ - public function execute() + public function executeInternal() { $wishlist = $this->wishlistProvider->getWishlist(); if (!$wishlist) { diff --git a/app/code/Magento/Wishlist/Controller/Index/Index.php b/app/code/Magento/Wishlist/Controller/Index/Index.php index dc0c7fcb96544f87987ef10ab64119033c9767d8..821df44186a442433be8e1653bc2aca225706cb0 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Index.php +++ b/app/code/Magento/Wishlist/Controller/Index/Index.php @@ -35,7 +35,7 @@ class Index extends Action\Action implements IndexInterface * @return \Magento\Framework\View\Result\Page * @throws NotFoundException */ - public function execute() + public function executeInternal() { if (!$this->wishlistProvider->getWishlist()) { throw new NotFoundException(__('Page not found.')); diff --git a/app/code/Magento/Wishlist/Controller/Index/Plugin.php b/app/code/Magento/Wishlist/Controller/Index/Plugin.php index 3f179a2e9a67b895a7b1dfffd1a6caf85b67ec57..10e6cdd0b0c423dde2efd735b57508957c523d5d 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Plugin.php +++ b/app/code/Magento/Wishlist/Controller/Index/Plugin.php @@ -60,7 +60,7 @@ class Plugin * @return void * @throws \Magento\Framework\Exception\NotFoundException */ - public function beforeDispatch(\Magento\Framework\App\ActionInterface $subject, RequestInterface $request) + public function beforeExecute(\Magento\Framework\App\ActionInterface $subject, RequestInterface $request) { if ($this->authenticationState->isEnabled() && !$this->customerSession->authenticate()) { $subject->getActionFlag()->set('', 'no-dispatch', true); diff --git a/app/code/Magento/Wishlist/Controller/Index/Remove.php b/app/code/Magento/Wishlist/Controller/Index/Remove.php index d74487a8f195d0b8c9ce3703bea3156e082b80a7..66d068fc7f4db39f964a75a1535dfae458fd6289 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Remove.php +++ b/app/code/Magento/Wishlist/Controller/Index/Remove.php @@ -35,7 +35,7 @@ class Remove extends Action\Action implements IndexInterface * @return \Magento\Framework\Controller\Result\Redirect * @throws NotFoundException */ - public function execute() + public function executeInternal() { $id = (int)$this->getRequest()->getParam('item'); $item = $this->_objectManager->create('Magento\Wishlist\Model\Item')->load($id); diff --git a/app/code/Magento/Wishlist/Controller/Index/Send.php b/app/code/Magento/Wishlist/Controller/Index/Send.php index 6baaa3772cd54918abf677eb2470100daa1a7af8..9ee4f3cd1b87a26891f5e2543db68d3758c1e09f 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Send.php +++ b/app/code/Magento/Wishlist/Controller/Index/Send.php @@ -119,7 +119,7 @@ class Send extends Action\Action implements IndexInterface * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Wishlist/Controller/Index/Share.php b/app/code/Magento/Wishlist/Controller/Index/Share.php index 502291b5078c418b4beefa079177b18084d100c7..4a8c92a37725e2afcd167a4683c47555b7d71c3f 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Share.php +++ b/app/code/Magento/Wishlist/Controller/Index/Share.php @@ -33,7 +33,7 @@ class Share extends Action\Action implements IndexInterface * * @return void|\Magento\Framework\View\Result\Page */ - public function execute() + public function executeInternal() { if ($this->customerSession->authenticate()) { /** @var \Magento\Framework\View\Result\Page $resultPage */ diff --git a/app/code/Magento/Wishlist/Controller/Index/Update.php b/app/code/Magento/Wishlist/Controller/Index/Update.php index ccb46f1c44a8ce873ce7ff779ffa760e724b31e2..863904999a2fb75419d3c63a50bebceac370e513 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Update.php +++ b/app/code/Magento/Wishlist/Controller/Index/Update.php @@ -53,7 +53,7 @@ class Update extends Action\Action implements IndexInterface * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function execute() + public function executeInternal() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/Wishlist/Controller/Index/UpdateItemOptions.php b/app/code/Magento/Wishlist/Controller/Index/UpdateItemOptions.php index 655844d6f116f43c206cfff2a8750687d9773289..e1ff89db2c83b2e41b14ac01ff61e9b555582596 100644 --- a/app/code/Magento/Wishlist/Controller/Index/UpdateItemOptions.php +++ b/app/code/Magento/Wishlist/Controller/Index/UpdateItemOptions.php @@ -51,7 +51,7 @@ class UpdateItemOptions extends Action\Action implements IndexInterface * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $productId = (int)$this->getRequest()->getParam('product'); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Wishlist/Controller/Shared/Allcart.php b/app/code/Magento/Wishlist/Controller/Shared/Allcart.php index ffb6e34ea96390aedd403549f7294126bcd1b93c..2f9208c43e9a3c359b93d29932c0666212267912 100644 --- a/app/code/Magento/Wishlist/Controller/Shared/Allcart.php +++ b/app/code/Magento/Wishlist/Controller/Shared/Allcart.php @@ -41,7 +41,7 @@ class Allcart extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $wishlist = $this->wishlistProvider->getWishlist(); if (!$wishlist) { diff --git a/app/code/Magento/Wishlist/Controller/Shared/Cart.php b/app/code/Magento/Wishlist/Controller/Shared/Cart.php index b3ed5a3b33093ef5f7d1ba041a0782fd1bf3fa81..8f03270d5bead068cdeb6af40dd6b9848caf95de 100644 --- a/app/code/Magento/Wishlist/Controller/Shared/Cart.php +++ b/app/code/Magento/Wishlist/Controller/Shared/Cart.php @@ -79,7 +79,7 @@ class Cart extends \Magento\Framework\App\Action\Action * * @return \Magento\Framework\Controller\Result\Redirect */ - public function execute() + public function executeInternal() { $itemId = (int)$this->getRequest()->getParam('item'); diff --git a/app/code/Magento/Wishlist/Controller/Shared/Index.php b/app/code/Magento/Wishlist/Controller/Shared/Index.php index 6f925099159fa32c7f1d57130f0f0e8b79506226..d54d52833044cf36526172e49f33aaeb71c23592 100644 --- a/app/code/Magento/Wishlist/Controller/Shared/Index.php +++ b/app/code/Magento/Wishlist/Controller/Shared/Index.php @@ -51,7 +51,7 @@ class Index extends Action * * @return \Magento\Framework\Controller\ResultInterface */ - public function execute() + public function executeInternal() { $wishlist = $this->wishlistProvider->getWishlist(); $customerId = $this->customerSession->getCustomerId(); diff --git a/app/code/Magento/Wishlist/CustomerData/Wishlist.php b/app/code/Magento/Wishlist/CustomerData/Wishlist.php index 2c4379872b8abf1136d02b1fc068c71afbf6c661..c937e334992c272815cd03f1cd2ee74daab80286 100644 --- a/app/code/Magento/Wishlist/CustomerData/Wishlist.php +++ b/app/code/Magento/Wishlist/CustomerData/Wishlist.php @@ -3,7 +3,6 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Wishlist\CustomerData; use Magento\Customer\CustomerData\SectionSourceInterface; @@ -24,9 +23,9 @@ class Wishlist implements SectionSourceInterface protected $wishlistHelper; /** - * @var \Magento\Catalog\Helper\Image + * @var \Magento\Catalog\Helper\ImageFactory */ - protected $imageHelper; + protected $imageHelperFactory; /** * @var \Magento\Framework\App\ViewInterface @@ -41,17 +40,17 @@ class Wishlist implements SectionSourceInterface /** * @param \Magento\Wishlist\Helper\Data $wishlistHelper * @param \Magento\Wishlist\Block\Customer\Sidebar $block - * @param \Magento\Catalog\Helper\Image $imageHelper + * @param \Magento\Catalog\Helper\ImageFactory $imageHelperFactory * @param \Magento\Framework\App\ViewInterface $view */ public function __construct( \Magento\Wishlist\Helper\Data $wishlistHelper, \Magento\Wishlist\Block\Customer\Sidebar $block, - \Magento\Catalog\Helper\Image $imageHelper, + \Magento\Catalog\Helper\ImageFactory $imageHelperFactory, \Magento\Framework\App\ViewInterface $view ) { $this->wishlistHelper = $wishlistHelper; - $this->imageHelper = $imageHelper; + $this->imageHelperFactory = $imageHelperFactory; $this->block = $block; $this->view = $view; } @@ -100,35 +99,77 @@ class Wishlist implements SectionSourceInterface protected function getItems() { $this->view->loadLayout(); + $collection = $this->wishlistHelper->getWishlistItemCollection(); $collection->clear()->setPageSize(self::SIDEBAR_ITEMS_NUMBER) ->setInStockFilter(true)->setOrder('added_at'); + $items = []; - /** @var \Magento\Wishlist\Model\Item $wishlistItem */ foreach ($collection as $wishlistItem) { - $product = $wishlistItem->getProduct(); - $this->imageHelper->init($product, 'wishlist_sidebar_block'); - $items[] = [ - 'image' => [ - 'src' => $this->imageHelper->getUrl(), - 'alt' => $this->imageHelper->getLabel(), - 'width' => $this->imageHelper->getWidth(), - 'height' => $this->imageHelper->getHeight(), - ], - 'product_url' => $this->wishlistHelper->getProductUrl($wishlistItem), - 'product_name' => $product->getName(), - 'product_price' => $this->block->getProductPriceHtml( - $product, - \Magento\Catalog\Pricing\Price\ConfiguredPriceInterface::CONFIGURED_PRICE_CODE, - \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST, - ['item' => $wishlistItem] - ), - 'product_is_saleable_and_visible' => $product->isSaleable() && $product->isVisibleInSiteVisibility(), - 'product_has_required_options' => $product->getTypeInstance()->hasRequiredOptions($product), - 'add_to_cart_params' => $this->wishlistHelper->getAddToCartParams($wishlistItem, true), - 'delete_item_params' => $this->wishlistHelper->getRemoveParams($wishlistItem, true), - ]; + $items[] = $this->getItemData($wishlistItem); } return $items; } + + /** + * Retrieve wishlist item data + * + * @param \Magento\Wishlist\Model\Item $wishlistItem + * @return array + */ + protected function getItemData(\Magento\Wishlist\Model\Item $wishlistItem) + { + $product = $wishlistItem->getProduct(); + return [ + 'image' => $this->getImageData($product), + 'product_url' => $this->wishlistHelper->getProductUrl($wishlistItem), + 'product_name' => $product->getName(), + 'product_price' => $this->block->getProductPriceHtml( + $product, + \Magento\Catalog\Pricing\Price\ConfiguredPriceInterface::CONFIGURED_PRICE_CODE, + \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST, + ['item' => $wishlistItem] + ), + 'product_is_saleable_and_visible' => $product->isSaleable() && $product->isVisibleInSiteVisibility(), + 'product_has_required_options' => $product->getTypeInstance()->hasRequiredOptions($product), + 'add_to_cart_params' => $this->wishlistHelper->getAddToCartParams($wishlistItem, true), + 'delete_item_params' => $this->wishlistHelper->getRemoveParams($wishlistItem, true), + ]; + } + + /** + * Retrieve product image data + * + * @param \Magento\Catalog\Model\Product $product + * @return \Magento\Catalog\Block\Product\Image + * @SuppressWarnings(PHPMD.NPathComplexity) + */ + protected function getImageData($product) + { + /** @var \Magento\Catalog\Helper\Image $helper */ + $helper = $this->imageHelperFactory->create() + ->init($product, 'wishlist_sidebar_block'); + + $template = $helper->getFrame() + ? 'Magento_Catalog/product/image' + : 'Magento_Catalog/product/image_with_borders'; + + $imagesize = $helper->getResizedImageInfo(); + + $width = $helper->getFrame() + ? $helper->getWidth() + : (!empty($imagesize[0]) ? $imagesize[0] : $helper->getWidth()); + + $height = $helper->getFrame() + ? $helper->getHeight() + : (!empty($imagesize[1]) ? $imagesize[1] : $helper->getHeight()); + + return [ + 'template' => $template, + 'src' => $helper->getUrl(), + 'width' => $width, + 'height' => $height, + 'alt' => $helper->getLabel(), + ]; + } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/AllcartTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/AllcartTest.php index 8d58bf0be7592847c0f13f568d923ff6aeeceba7..e72f4c4a42f741ed9fbe5c8deddd7d301059be42 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/AllcartTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/AllcartTest.php @@ -157,7 +157,7 @@ class AllcartTest extends \PHPUnit_Framework_TestCase ->willReturnSelf(); $controller = $this->getController(); - $this->assertSame($this->resultForwardMock, $controller->execute()); + $this->assertSame($this->resultForwardMock, $controller->executeInternal()); } public function testExecuteWithoutWishlist() @@ -176,7 +176,7 @@ class AllcartTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertSame($this->resultForwardMock, $this->getController()->execute()); + $this->assertSame($this->resultForwardMock, $this->getController()->executeInternal()); } public function testExecutePassed() @@ -204,6 +204,6 @@ class AllcartTest extends \PHPUnit_Framework_TestCase ->with($url) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/CartTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/CartTest.php index cdd8ea3b33372cc72b3aa98a65eb8090eaf3b718..937e5f843fd1beec8986c4b6ca48f93fc6a8e492 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/CartTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/CartTest.php @@ -259,7 +259,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with('*/*', []) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } public function testExecuteWithNoWishlist() @@ -300,7 +300,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with('*/*', []) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } public function testExecuteWithQuantityArray() @@ -312,7 +312,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with($refererUrl) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } public function testExecuteWithQuantityArrayAjax() @@ -324,7 +324,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with(['backUrl' => $refererUrl]) ->willReturnSelf(); - $this->assertSame($this->resultJsonMock, $this->model->execute()); + $this->assertSame($this->resultJsonMock, $this->model->executeInternal()); } /** @@ -698,7 +698,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with($indexUrl) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } /** @@ -859,6 +859,6 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with($configureUrl) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->model->execute()); + $this->assertSame($this->resultRedirectMock, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/FromcartTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/FromcartTest.php index 58109d6dc3d256607c2b1ba33b3101d50ede0944..51afe2756ad5e5ad52614dcf20dd0c5fa6b86104 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/FromcartTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/FromcartTest.php @@ -121,7 +121,7 @@ class FromcartTest extends \PHPUnit_Framework_TestCase ->method('getWishlist') ->willReturn(null); - $this->controller->execute(); + $this->controller->executeInternal(); } public function testExecuteNoCartItem() @@ -169,7 +169,7 @@ class FromcartTest extends \PHPUnit_Framework_TestCase ->with($cartUrl) ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->controller->execute()); + $this->assertSame($this->resultRedirect, $this->controller->executeInternal()); } public function testExecute() @@ -235,7 +235,7 @@ class FromcartTest extends \PHPUnit_Framework_TestCase ->with($cartUrl) ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->controller->execute()); + $this->assertSame($this->resultRedirect, $this->controller->executeInternal()); } public function testExecuteWithException() @@ -271,7 +271,7 @@ class FromcartTest extends \PHPUnit_Framework_TestCase ->with($cartUrl) ->willReturnSelf(); - $this->assertSame($this->resultRedirect, $this->controller->execute()); + $this->assertSame($this->resultRedirect, $this->controller->executeInternal()); } protected function prepareContext() diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/IndexTest.php index 12f3de81f386ccdb5d1fbbf041b254f40bb3d2ba..f49d76cc0a0cb5ca1db1545541221efdb1f2ff06 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/IndexTest.php @@ -139,7 +139,7 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->method('getWishlist') ->willReturn(null); - $this->getController()->execute(); + $this->getController()->executeInternal(); } public function testExecutePassed() @@ -150,6 +150,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase ->method('getWishlist') ->willReturn($wishlist); - $this->assertSame($this->resultPageMock, $this->getController()->execute()); + $this->assertSame($this->resultPageMock, $this->getController()->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/PluginTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/PluginTest.php index 4c905abca2873d00eb6a8a687ce2dffe937b424c..011eb067e36e32b127def8ae036f8202c8213e1f 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/PluginTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/PluginTest.php @@ -66,7 +66,7 @@ class PluginTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\NotFoundException */ - public function testBeforeDispatch() + public function testBeforeExecute() { $actionFlag = $this->getMock('Magento\Framework\App\ActionFlag', [], [], '', false); $indexController = $this->getMock('Magento\Wishlist\Controller\Index\Index', [], [], '', false); @@ -124,6 +124,6 @@ class PluginTest extends \PHPUnit_Framework_TestCase ->with('wishlist/general/active') ->willReturn(false); - $this->getPlugin()->beforeDispatch($indexController, $this->request); + $this->getPlugin()->beforeExecute($indexController, $this->request); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/RemoveTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/RemoveTest.php index 6b2a6b9a5959f919d05214858aa3643daef44078..787d6ef272cac8cd18eb6874087268b178d33505 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/RemoveTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/RemoveTest.php @@ -164,7 +164,7 @@ class RemoveTest extends \PHPUnit_Framework_TestCase ->with('Magento\Wishlist\Model\Item') ->willReturn($item); - $this->getController()->execute(); + $this->getController()->executeInternal(); } /** @@ -206,7 +206,7 @@ class RemoveTest extends \PHPUnit_Framework_TestCase ->with(2) ->willReturn(null); - $this->getController()->execute(); + $this->getController()->executeInternal(); } public function testExecuteCanNotSaveWishlist() @@ -291,7 +291,7 @@ class RemoveTest extends \PHPUnit_Framework_TestCase ->with($referer) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } public function testExecuteCanNotSaveWishlistAndWithRedirect() @@ -387,6 +387,6 @@ class RemoveTest extends \PHPUnit_Framework_TestCase ->with('http://test.com/frontname/module/controller/action') ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php index dd6dca9871675141bc97ee50dc555636caa98860..704e5b6fb085299926463b14638faa0b0764f3e6 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php @@ -270,7 +270,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('*/*/') ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } /** @@ -288,7 +288,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->method('getWishlist') ->willReturn(null); - $this->model->execute(); + $this->model->executeInternal(); } /** @@ -356,7 +356,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('*/*/share') ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } /** @@ -514,7 +514,7 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('*/*/share') ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } /** @@ -693,6 +693,6 @@ class SendTest extends \PHPUnit_Framework_TestCase ->with('*/*', ['wishlist_id' => $wishlistId]) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/ShareTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/ShareTest.php index b65e8d11e43adfd7810c269a15ebc5f66f71ac99..e53d854cbefdc123ff7e95d29b955c96db3ba8ce 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/ShareTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/ShareTest.php @@ -53,7 +53,7 @@ class ShareTest extends \PHPUnit_Framework_TestCase $this->resultFactoryMock->expects($this->once())->method('create')->with(ResultFactory::TYPE_PAGE) ->willReturn($resultMock); - $this->assertEquals($resultMock, $this->model->execute()); + $this->assertEquals($resultMock, $this->model->executeInternal()); } public function testExecuteAuthenticationFail() @@ -61,6 +61,6 @@ class ShareTest extends \PHPUnit_Framework_TestCase $this->customerSessionMock->expects($this->once())->method('authenticate') ->willReturn(false); - $this->assertEmpty($this->model->execute()); + $this->assertEmpty($this->model->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/UpdateItemOptionsTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/UpdateItemOptionsTest.php index f70306b60257a8203ae0e422e3407646ceebb967..1f811f79563218542fec5d15b46b87c20faec5a1 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/UpdateItemOptionsTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/UpdateItemOptionsTest.php @@ -186,7 +186,7 @@ class UpdateItemOptionsTest extends \PHPUnit_Framework_TestCase ->with('*/', []) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } /** @@ -218,7 +218,7 @@ class UpdateItemOptionsTest extends \PHPUnit_Framework_TestCase ->with('*/', []) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } /** @@ -286,7 +286,7 @@ class UpdateItemOptionsTest extends \PHPUnit_Framework_TestCase ->with('*/', []) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } /** @@ -407,7 +407,7 @@ class UpdateItemOptionsTest extends \PHPUnit_Framework_TestCase ->with('*/*', ['wishlist_id' => 56]) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } /** * Test execute add success critical exception @@ -545,6 +545,6 @@ class UpdateItemOptionsTest extends \PHPUnit_Framework_TestCase ->with('*/*', ['wishlist_id' => 56]) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->getController()->execute()); + $this->assertSame($this->resultRedirectMock, $this->getController()->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/AllcartTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/AllcartTest.php index 09ea2bb42c74aacbf7555c36fa41679d86822f43..984c2e70c164ca1b46b863e535ac81c24bca8117 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/AllcartTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/AllcartTest.php @@ -132,7 +132,7 @@ class AllcartTest extends \PHPUnit_Framework_TestCase ->with($url) ->willReturnSelf(); - $this->assertSame($this->resultRedirectMock, $this->allcartController->execute()); + $this->assertSame($this->resultRedirectMock, $this->allcartController->executeInternal()); } public function testExecuteWithNoWishlist() @@ -145,6 +145,6 @@ class AllcartTest extends \PHPUnit_Framework_TestCase ->with('noroute') ->willReturnSelf(); - $this->assertSame($this->resultForwardMock, $this->allcartController->execute()); + $this->assertSame($this->resultForwardMock, $this->allcartController->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/CartTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/CartTest.php index c42e48ba37b6da6d7933dcd0c96a4e23cb78c4c5..a917ac8b2ba1698750af529acb383a1d7af48d38 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/CartTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Shared/CartTest.php @@ -275,7 +275,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with($redirectUrl) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } /** @@ -329,7 +329,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with($productUrl) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } public function testExecuteProductException() @@ -360,7 +360,7 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with($refererUrl) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } public function testExecuteException() @@ -391,6 +391,6 @@ class CartTest extends \PHPUnit_Framework_TestCase ->with($refererUrl) ->willReturnSelf(); - $this->assertEquals($this->resultRedirect, $this->model->execute()); + $this->assertEquals($this->resultRedirect, $this->model->executeInternal()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/CustomerData/WishlistTest.php b/app/code/Magento/Wishlist/Test/Unit/CustomerData/WishlistTest.php index 24368820dc4df78f31f2bb407631a4a7caadd564..470be780e1269ea0f56088a151171820e67c1368 100644 --- a/app/code/Magento/Wishlist/Test/Unit/CustomerData/WishlistTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/CustomerData/WishlistTest.php @@ -46,16 +46,24 @@ class WishlistTest extends \PHPUnit_Framework_TestCase $this->sidebarMock = $this->getMockBuilder('Magento\Wishlist\Block\Customer\Sidebar') ->disableOriginalConstructor() ->getMock(); + $this->viewMock = $this->getMockBuilder('Magento\Framework\App\ViewInterface') + ->getMockForAbstractClass(); + $this->catalogImageHelperMock = $this->getMockBuilder('Magento\Catalog\Helper\Image') ->disableOriginalConstructor() ->getMock(); - $this->viewMock = $this->getMockBuilder('Magento\Framework\App\ViewInterface') - ->getMockForAbstractClass(); + $imageHelperFactory = $this->getMockBuilder('Magento\Catalog\Helper\ImageFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $imageHelperFactory->expects($this->any()) + ->method('create') + ->willReturn($this->catalogImageHelperMock); $this->model = new Wishlist( $this->wishlistHelperMock, $this->sidebarMock, - $this->catalogImageHelperMock, + $imageHelperFactory, $this->viewMock ); } @@ -83,6 +91,7 @@ class WishlistTest extends \PHPUnit_Framework_TestCase 'items' => [ [ 'image' => [ + 'template' => 'Magento_Catalog/product/image', 'src' => $imageUrl, 'alt' => $imageLabel, 'width' => $imageWidth, @@ -165,6 +174,12 @@ class WishlistTest extends \PHPUnit_Framework_TestCase $this->catalogImageHelperMock->expects($this->once()) ->method('getHeight') ->willReturn($imageHeight); + $this->catalogImageHelperMock->expects($this->any()) + ->method('getFrame') + ->willReturn(true); + $this->catalogImageHelperMock->expects($this->once()) + ->method('getResizedImageInfo') + ->willReturn([]); $this->wishlistHelperMock->expects($this->once()) ->method('getProductUrl') @@ -251,6 +266,7 @@ class WishlistTest extends \PHPUnit_Framework_TestCase 'items' => [ [ 'image' => [ + 'template' => 'Magento_Catalog/product/image', 'src' => $imageUrl, 'alt' => $imageLabel, 'width' => $imageWidth, @@ -266,6 +282,7 @@ class WishlistTest extends \PHPUnit_Framework_TestCase ], [ 'image' => [ + 'template' => 'Magento_Catalog/product/image', 'src' => $imageUrl, 'alt' => $imageLabel, 'width' => $imageWidth, @@ -342,6 +359,12 @@ class WishlistTest extends \PHPUnit_Framework_TestCase $this->catalogImageHelperMock->expects($this->exactly(2)) ->method('getHeight') ->willReturn($imageHeight); + $this->catalogImageHelperMock->expects($this->any()) + ->method('getFrame') + ->willReturn(true); + $this->catalogImageHelperMock->expects($this->exactly(2)) + ->method('getResizedImageInfo') + ->willReturn([]); $this->wishlistHelperMock->expects($this->exactly(2)) ->method('getProductUrl') diff --git a/app/code/Magento/Wishlist/view/frontend/templates/sidebar.phtml b/app/code/Magento/Wishlist/view/frontend/templates/sidebar.phtml index bab2e79a75f3310e63bbe5352f47818e81cd74a0..1d7eb6e7dcc73247b72d1999701a863eb97aaf7c 100644 --- a/app/code/Magento/Wishlist/view/frontend/templates/sidebar.phtml +++ b/app/code/Magento/Wishlist/view/frontend/templates/sidebar.phtml @@ -26,7 +26,7 @@ $wishlistHelper = $this->helper('Magento\Wishlist\Helper\Data'); <li class="product-item"> <div class="product-item-info"> <a class="product-item-photo" data-bind="attr: { href: product_url, title: product_name }"> - <!-- ko template: {name: 'Magento_Wishlist/product_image', data: $data.image} --><!-- /ko --> + <!-- ko template: {name: $data.image.template, data: $data.image} --><!-- /ko --> </a> <div class="product-item-details"> <strong class="product-item-name"> diff --git a/app/code/Magento/Wishlist/view/frontend/web/template/product_image.html b/app/code/Magento/Wishlist/view/frontend/web/template/product_image.html deleted file mode 100644 index da88b3236c986563e459da8021213663f556158a..0000000000000000000000000000000000000000 --- a/app/code/Magento/Wishlist/view/frontend/web/template/product_image.html +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<img class="photo image" data-bind="attr: {src: src, alt: alt}, style: {width: width + 'px', height: height + 'px'}" /> diff --git a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_footer.less b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_footer.less index 65e24732ac4faced36510d6dd1978b4f79899211..8bed4f0da21360a23e2543ffa40bc8b04d56116c 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_footer.less +++ b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_footer.less @@ -54,6 +54,7 @@ // Copyright .copyright { margin-bottom: -.2rem; + text-align: left; position: relative; .link-copyright { display: inline-block; @@ -85,15 +86,10 @@ .footer-legal { padding-top: 1rem; - text-align: right; } -// Locale switcher -.locale-switcher { - .label { - display: block; - margin-bottom: 1rem; - } +.footer-legal-system { + text-align: right; } // diff --git a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/main/_collapsible-blocks.less b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/main/_collapsible-blocks.less index 730f3d53ff58c7e23ab424d3926e85948cf1d305..78129d62a70de8796227b5d870c8aadafe147861 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/main/_collapsible-blocks.less +++ b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/main/_collapsible-blocks.less @@ -253,6 +253,9 @@ .scope-label { padding: 31px 1.5rem 0 0; } + .use-default { + padding: 29px 1.5rem 0 0; + } .value { padding-right: 4rem; } diff --git a/app/design/adminhtml/Magento/backend/Magento_ConfigurableProduct/web/css/source/_module.less b/app/design/adminhtml/Magento/backend/Magento_ConfigurableProduct/web/css/source/_module.less index 16606bb518d0a486f728d432bc957e385edf9e83..3d25c7dbf0b6731c2cffeaeff881d293dcefae95 100644 --- a/app/design/adminhtml/Magento/backend/Magento_ConfigurableProduct/web/css/source/_module.less +++ b/app/design/adminhtml/Magento/backend/Magento_ConfigurableProduct/web/css/source/_module.less @@ -11,7 +11,7 @@ @import 'module/components/_navigation-bar.less'; // Navigation Bar @import 'module/components/_grid.less'; // Grid styles @import 'module/components/_currency-addon.less'; // Currency Addon Styles -@import 'module/components/_attributes_template_popup.less'; // Choose Affected Product Template popup +@import 'module/components/_attributes_template_popup.less'; // Choose Affected Attribute Set popup // Main Steps @import 'module/steps/_select-attributes.less'; diff --git a/app/code/Magento/LayeredNavigation/view/frontend/layout/2columns-left.xml b/app/design/adminhtml/Magento/backend/Magento_Enterprise/layout/default.xml similarity index 56% rename from app/code/Magento/LayeredNavigation/view/frontend/layout/2columns-left.xml rename to app/design/adminhtml/Magento/backend/Magento_Enterprise/layout/default.xml index 7b679489fe942bc693b9948de94883e4bcab25cd..39859341ebc4e8bb4410ca680aec953228a16baf 100644 --- a/app/code/Magento/LayeredNavigation/view/frontend/layout/2columns-left.xml +++ b/app/design/adminhtml/Magento/backend/Magento_Enterprise/layout/default.xml @@ -5,8 +5,12 @@ * See COPYING.txt for license details. */ --> -<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="All Two-Column Layout Pages (Left Column)" design_abstraction="page_layout"> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> - <move element="catalog.leftnav" destination="sidebar.main" before="-"/> + <referenceBlock name="logo"> + <arguments> + <argument name="edition" xsi:type="string">Enterprise</argument> + </arguments> + </referenceBlock> </body> </page> diff --git a/app/design/adminhtml/Magento/backend/Magento_GiftCard/web/css/source/module.less b/app/design/adminhtml/Magento/backend/Magento_GiftCard/web/css/source/module.less new file mode 100644 index 0000000000000000000000000000000000000000..d3a921dc16dc0ddcab2c3bda1145688a127733a8 --- /dev/null +++ b/app/design/adminhtml/Magento/backend/Magento_GiftCard/web/css/source/module.less @@ -0,0 +1,17 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +.ie9 & { + .giftcard-info-container { + .admin__field { + .admin__field-label { + display: table; + span { + display: table-cell; + } + } + } + } +} diff --git a/app/design/adminhtml/Magento/backend/Magento_ProductVideo/web/css/source/_module.less b/app/design/adminhtml/Magento/backend/Magento_ProductVideo/web/css/source/_module.less index 7f4e8a590acf9c902b378a441875ac8994a5af14..1a57d5706f898a4b876aaf9bba938e66d3c3c604 100644 --- a/app/design/adminhtml/Magento/backend/Magento_ProductVideo/web/css/source/_module.less +++ b/app/design/adminhtml/Magento/backend/Magento_ProductVideo/web/css/source/_module.less @@ -234,3 +234,34 @@ .image.base-image:hover .image-label { display: none; } + +.image-upload-error { + background: #F9E1E1; + color: @color-gray19; + font-size: 12px; + font-weight: 400; + padding: 7px 7px 7px 35px; + position: relative; + .image-upload-error-cross { + position: absolute; + left: 8px; + top: 9px; + width: 20px; + height: 20px; + &:before, + &:after { + position: absolute; + left: 8px; + content: ' '; + height: 20px; + width: 4px; + background-color: @color-red9; + } + &:before { + transform: rotate(45deg); + } + &:after { + transform: rotate(-45deg); + } + } +} diff --git a/app/design/adminhtml/Magento/backend/Magento_Reward/web/css/source/_module.less b/app/design/adminhtml/Magento/backend/Magento_Reward/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..b44b2bc3aa7d20979a181e32a1ef67844cf12fd9 --- /dev/null +++ b/app/design/adminhtml/Magento/backend/Magento_Reward/web/css/source/_module.less @@ -0,0 +1,41 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Reward Page +// _____________________________________________ + +// +// Variables +// --------------------------------------------- + +@boundary__margin: 30px; +@boundary__ratio: 1.75; + +.adminhtml-reward-rate-edit { + .field-rate { + .admin__field-control { + &:extend(.abs-clearfix all); + } + .boundary { + float: left; + width: 125px; + } + .boundary-upper { + margin-left: @boundary__margin; + position: relative; + &:before { + content: '»'; + left: -(@boundary__margin / @boundary__ratio); + position: absolute; + top: 25%; + } + label { + .lib-visibility-hidden(); + display: block; + } + } + } +} diff --git a/app/design/adminhtml/Magento/backend/Magento_VersionsCms/web/css/source/_module.less b/app/design/adminhtml/Magento/backend/Magento_VersionsCms/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..5aba4abd3f4652efb862c5ea233be10f24d9b188 --- /dev/null +++ b/app/design/adminhtml/Magento/backend/Magento_VersionsCms/web/css/source/_module.less @@ -0,0 +1,35 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Hierarchy styles +// _____________________________________________ + +.cms-hierarchy { + &:extend(.abs-clearfix all); + + .cms-hierarchy-tree, + .cms-hierarchy-node { + float: left; + width: 50%; + } + + .cms_page_grid_container { + clear: both; + } + + .admin__page-section-title { + .actions { + float: right; + } + } + + .buttons-set { + margin: 0 0 1.14rem; + button { + margin-right: 0.36rem; + } + } +} diff --git a/app/design/adminhtml/Magento/backend/Magento_VisualMerchandiser/web/css/source/module.less b/app/design/adminhtml/Magento/backend/Magento_VisualMerchandiser/web/css/source/module.less new file mode 100644 index 0000000000000000000000000000000000000000..33e8affd44b2348f3995ba9d6b0c143a22eb985f --- /dev/null +++ b/app/design/adminhtml/Magento/backend/Magento_VisualMerchandiser/web/css/source/module.less @@ -0,0 +1,271 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ +#merchandiser-app { + .merchandiser-toolbar { + float: right; + } + + ul.tabs { + float: right; + } + + .clearfix { + clear: both; + } + + #catalog_category_merchandiser { + div.grid { + padding: 0; + } + div.grid-actions { + padding: 10px 0; + float: right; + } + } + + .merchandiser-tab { + padding: 0; + } + + .tabs { + list-style: none; + overflow: hidden; + li { + background-color: #f0f0f0; + float: left; + > a { + border: 1px solid #cccccc; + padding: 7px 10px; + text-decoration: none; + display: block; + color: #7d7d7d; + } + } + li:last-child > a { + border-left: 0; + } + li.ui-tabs-active { + background-color: #dedede; + } + } + + #catalog_category_merchandiser_list { + overflow: hidden; + > li { + list-style: none; + width: 190px; + height: 340px; + float: left; + border: 1px solid #7d7d7d; + margin:0 25px 20px 0; + padding: 10px; + background-color: #fff; + } + .image-holder { + text-align: center; + img { + max-height: 130px; + } + } + .controlbar-top { + overflow: hidden; + a { + text-decoration: none; + color: #7d7d7d; + float:left; + display: inline-block; + } + a:last-child { + float:right; + } + } + .info-block { + height: 100px; + } + .controlbar-bottom { + .position { + border-top: 1px solid #7d7d7d; + margin-top: 6px; + padding-top: 4px; + input { + width: 50px; + height: 25px; + float:left; + margin-right: 5px; + } + a { + text-decoration: none; + color: #7d7d7d; + margin-right: 5px; + margin-top: -2px; + float: left; + display: block; + } + } + } + .selected { + background-color: #f5d6c7; + } + } + + table.data-grid { + th.col-draggable-position { + width: 10px; + margin: 0 auto 0 auto; + } + td.col-draggable-position span.draggable-handle { + width: 8px; + height: 14px; + line-height: 14px; + background: url(../Magento_Backend/images/draggable-handle-vertical.png) no-repeat 0 0; + cursor: ns-resize; + color: #b2b0ad; + display: block; + } + td.col-position { + >* { + float: left; + margin-right: 5px; + } + .position input { + width: 40px; + text-align: center; + } + a { + text-decoration: none; + color: #7d7d7d; + } + } + .selected td { + background-color: #f5d6c7; + } + + tr.on-mouse td { + background-color: #e5f7fe; + } + } + + .mode-tile:before, .mode-grid:before, .icon-gripper:before, .icon-close-mage:before, + .icon-backward:before, .icon-forward:before, .block-search .label:before { + font-family: 'Admin Icons'; + -webkit-font-smoothing: antialiased; + font-size: 17px; + speak: none; + } + .mode-grid > span, + .mode-tile > span, + .icon-backward > span, + .icon-forward > span, + .icon-close-mage > span, + .icon-gripper > span { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + } + + .mode-tile:before { + content: "\e63d"; + } + + .mode-grid:before { + content: "\e63e"; + } + + .icon-gripper:before { + content: "\e617"; + } + + .icon-close-mage:before { + content: "\e62f"; + } + + .icon-backward:before { + content: "\e619"; + } + + .icon-forward:before { + content: "\e618"; + } + + .hidden { + display: none; + } + + .smart_category_table { + width: 100%; + border-collapse:collapse; + margin-bottom: 5px; + border-spacing:0 5px; + overflow: auto; + display:block; + } + + .smart_category_table tr:nth-of-type(odd) { + background:#eee; + } + + .smart_category_table th { + background: #333; + color: white; + font-weight: bold; + } + + .smart_category_table td, th { + padding: 6px; + border: 1px solid #ccc; + text-align: left; + } + .smart_category { + display:block; + clear:both; + margin-bottom: 5px; + } + + .mode_select { + float:right; + } + + .add_product_sku { + float:left; + display: block; + margin: 5px; + } + + .add_product_sku_buttons { + display: block; + margin: 5px; + } +} + +#catalog_category_add_product_tabs_content { + .admin__data-grid-header { + .admin__data-grid-pager-wrap { + float: right; + } + } + .data-grid-search-control-wrap { + .massassign_textarea, .massassign_buttons, .massassign_messages { + display:block; + margin:5px; + } + } +} + +.visual_merchandiser_draggable_container { + > li { + list-style: none; + width: 190px; + height: 340px; + float: left; + border: 1px solid #7d7d7d; + margin:0 15px 15px 0; + padding: 10px; + } +} diff --git a/app/design/adminhtml/Magento/backend/etc/view.xml b/app/design/adminhtml/Magento/backend/etc/view.xml index a846813648e5dc8f413a7185cbc17cabf6482808..eae913a23c235e3e3261b408626ce8f813bf117a 100644 --- a/app/design/adminhtml/Magento/backend/etc/view.xml +++ b/app/design/adminhtml/Magento/backend/etc/view.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Catalog/etc/view.xsd"> +<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/view.xsd"> <vars module="Js_Bundle"> <var name="bundle_size">1MB</var> </vars> diff --git a/app/design/adminhtml/Magento/backend/etc/view.xsd b/app/design/adminhtml/Magento/backend/etc/view.xsd deleted file mode 100644 index a695016f03565dc6ecf2f654c57d6c44c7eae906..0000000000000000000000000000000000000000 --- a/app/design/adminhtml/Magento/backend/etc/view.xsd +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> - <xs:redefine schemaLocation="urn:magento:framework:Config/etc/view.xsd"> - <xs:complexType name="mediaType" mixed="true"> - <xs:complexContent> - <xs:extension base="mediaType"> - <xs:sequence> - <xs:element name="images" type="imageType" minOccurs="0"/> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:redefine> - - <xs:complexType name="imageType"> - <xs:sequence> - <xs:element name="image" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="width" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="height" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="constrain" type="xs:boolean" minOccurs="0"/> - <xs:element name="aspect_ratio" type="xs:boolean" minOccurs="0"/> - <xs:element name="frame" type="xs:boolean" minOccurs="0"/> - <xs:element name="transparency" type="xs:boolean" minOccurs="0"/> - <xs:element name="background" minOccurs="0"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:pattern value="\[(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\]"/> - </xs:restriction> - </xs:simpleType> - </xs:element> - </xs:sequence> - <xs:attribute name="id" type="xs:string" use="required"/> - <xs:attribute name="type"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="thumbnail"/> - <xs:enumeration value="small_image"/> - <xs:enumeration value="image"/> - <xs:enumeration value="swatch_image"/> - <xs:enumeration value="swatch_thumb"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="module" type="xs:string" use="required"/> - </xs:complexType> -</xs:schema> diff --git a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_common.less b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_common.less index c743005c076011a27a42ac05921786914f99d29f..2665555a635bf29020ee2e987fc231821e792763 100644 --- a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_common.less +++ b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_common.less @@ -19,6 +19,12 @@ padding-top: @main__indent-top; } +.menu-wrapper { + .logo-static { + pointer-events: none; + } +} + // // Header // _____________________________________________ @@ -44,6 +50,10 @@ // Titles // _____________________________________________ +.page-title { + margin-bottom: @indent__s; +} + .page-sub-title { font-size: 2rem; margin-bottom: 1.3em; @@ -59,3 +69,13 @@ margin-top: 1.5rem; } } + +// Spinner modification for installer +.spinner { + &.side { + float: left; + font-size: 2.4rem; + margin-left: 2rem; + margin-top: -5px; + } +} diff --git a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less index cde931e2c71e1a17e0212f5012b16dc77c9ad40a..68932713975dbe647eef0d3e76ad1651e91e19a6 100644 --- a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less +++ b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/pages/_readiness-check.less @@ -56,7 +56,7 @@ .readiness-check-icon { float: left; margin-left: 1.7rem; - margin-top: .7rem; + margin-top: .3rem; } // diff --git a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/setup.less b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/setup.less index c2bbaf8f432b9a66faca168a78d9cf5c36f3da39..f315d89cba1671b9e278bb9e437d5bb8c4d72ed8 100644 --- a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/setup.less +++ b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/setup.less @@ -52,6 +52,7 @@ // Inherit Backend components @import '../../../../css/source/_actions.less'; +@import '../../../../css/source/actions/_actions-switcher.less'; // ToDo UI: remove when yes/no switcher is integrated to the backend @import '../../../../css/source/components/_messages.less'; @import '../../../../css/source/components/_modals_extend.less'; @import '../../../../css/source/components/_spinner.less'; diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less index e2fb2952d45d4b9f8c055469c49fe93e22e32a5e..0d8e187946d4de57abb5926c71f0152f45e3071b 100644 --- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less +++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_menu.less @@ -25,6 +25,13 @@ top: -1.6rem; } } + &._active { + > a { + &:after { + display: block; + } + } + } } > a { padding-top: 1.3rem; diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/pages/_common.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/pages/_common.less index a404bd2a8a99dcf9c977c428ac9908af33fa4c5b..7748463ab882c440c366e7c130969c9c076899d3 100644 --- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/pages/_common.less +++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/pages/_common.less @@ -13,6 +13,7 @@ .page-sub-title { margin-bottom: 2.1rem; + margin-top: @indent__l; } .multiselect-custom { diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_forms.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_forms.less index 22833d4d0ceae5e40d723b8317cfef99b673f9ba..0f44d221ef779672280a88d404b7718834b26694 100644 --- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_forms.less +++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_forms.less @@ -15,4 +15,4 @@ letter-spacing: @letter-spacing__small; margin-left: .4rem; margin-bottom: .4rem; -} \ No newline at end of file +} diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_typography.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_typography.less index d11865d6989620716212c59381d390ce994d2bec..0fc83eb059ce2d38ac65fc121fae109487ca7988 100644 --- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_typography.less +++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_typography.less @@ -42,5 +42,3 @@ margin-right: 2.4rem; } } - - diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_variables.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_variables.less index ff92bb10842a6aa5b80dc5e8d50d96c7f705fa9d..6d14e0a707db1dccd624d52d83726f09411c3a66 100644 --- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_variables.less +++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/source/_variables.less @@ -36,4 +36,4 @@ // // Tables // --------------------------------------------- -@table__color: @color-very-dark-gray-black; \ No newline at end of file +@table__color: @color-very-dark-gray-black; diff --git a/app/design/adminhtml/Magento/backend/web/css/source/actions/_actions-switcher.less b/app/design/adminhtml/Magento/backend/web/css/source/actions/_actions-switcher.less new file mode 100644 index 0000000000000000000000000000000000000000..1dd211f38baea35da1625f95ac8d34a75e9627c5 --- /dev/null +++ b/app/design/adminhtml/Magento/backend/web/css/source/actions/_actions-switcher.less @@ -0,0 +1,110 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Yes/no switcher +// _____________________________________________ + +// ToDo UI: integrate the switcher to the backend + +// +// Variables +// --------------------------------------------- + +@actions-switcher-background-color: @color-gray89; +@actions-switcher-border-radius: 12px; +@actions-switcher-border: 1px solid @color-gray65-lighten; +@actions-switcher-control-background-color: @color-white; +@actions-switcher-height: 20px; +@actions-switcher-width: 37px; + +// + +.actions-switch { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + height: @actions-switcher-height; + margin-right: 30px; + position: relative; + width: @actions-switcher-width; +} + +.actions-switch-label { + background: @actions-switcher-background-color; + border-radius: @actions-switcher-border-radius; + border: @actions-switcher-border; + cursor: pointer; + display: block; + overflow: hidden; +} + +.actions-switch-inner { + display: block; + margin-left: -100%; + transition: margin 0.3s ease-in 0s; + width: 200%; + &:before, + &:after { + border-radius: @actions-switcher-border-radius; + color: @color-white; + display: block; + float: left; + height: @actions-switcher-height; + line-height: 22px; + padding: 0; + width: 50%; + } + &:before { + background-color: @color-green-apple; + content: ""; + } + &:after { + content: ""; + text-align: right; + } +} + +.actions-switch-indicator { + background: @actions-switcher-control-background-color; + border-radius: @actions-switcher-border-radius; + border: @actions-switcher-border; + bottom: -2px; + display: block; + position: absolute; + right: 15px; + top: 0; + transition: all 0.3s ease-in 0s; + width: 22px; +} + +.actions-switch-text { + &:after { + content: attr(data-label-no); + display: block; + left: 32px; + margin-left: 12px; + position: absolute; + } +} + +.actions-switch-checkbox { + display: none; + &:checked { + + .actions-switch-label { + .actions-switch-inner { + margin-left: 0; + } + .actions-switch-indicator { + right: 0; + } + .actions-switch-text { + &:after { + content: attr(data-label-yes); + } + } + } + } +} diff --git a/app/design/adminhtml/Magento/backend/web/css/source/components/_file-insertion.less b/app/design/adminhtml/Magento/backend/web/css/source/components/_file-insertion.less index cdc66d477555dc532e9f3d9d264c6df18ad0a131..9dd4fec9c3c71d7638c283fd18d0f4eddfa5a483 100644 --- a/app/design/adminhtml/Magento/backend/web/css/source/components/_file-insertion.less +++ b/app/design/adminhtml/Magento/backend/web/css/source/components/_file-insertion.less @@ -18,7 +18,7 @@ display: none; } input { - -moz-transforms: none; + -moz-transform: none; border: none; opacity: 1; position: static; diff --git a/app/design/frontend/Magento/blank/Magento_AdvancedCheckout/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_AdvancedCheckout/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..170ebe4b62b9c607480e3045937da2898464a69b --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_AdvancedCheckout/web/css/source/_module.less @@ -0,0 +1,146 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .column { + .block-addbysku { + .fieldset { + margin: 0; + .fields { + position: relative; + .field { + display: inline-block; + margin-bottom: @indent__s; + vertical-align: top; + } + .actions-toolbar { + position: absolute; + right: 0; + top: 4px; + } + } + } + .sku { + &:extend(.abs-add-box-sizing all); + margin-right: -155px; + padding-right: 160px; + width: 100%; + } + .skus { + > .label { + margin-top: @indent__s; + } + } + .qty { + .qty { + &:extend(.abs-input-qty all); + + .mage-error { + width: 80px; + } + } + } + .block-content { + &:extend(.abs-add-clearfix-desktop all); + .box { + &:extend(.abs-blocks-2columns all); + } + .actions-toolbar { + clear: both; + .lib-actions-toolbar( + @_actions-toolbar-actions-position: left, + @_actions-toolbar-margin: 0 0 @indent__base + ); + .lib-actions-toolbar-clear-floats(); + > .secondary { + text-align: left; + } + } + } + .reset { + margin: @indent__s 0; + } + .note { + display: block; + margin: 0 0 @indent__base; + } + } + } + + .block-cart-failed { + margin-top: @indent__xl; + &:extend(.abs-shopping-cart-items all); + .block-title { + .lib-font-size(@h2__font-size); + strong { + font-weight: @h2__font-weight; + } + } + .actions { + text-align: center; + .action { + margin-bottom: @indent__s; + &.tocart { + margin-right: @indent__s; + } + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .column { + .block-addbysku { + .sku { + margin-right: -85px; + padding-right: 90px; + } + .action { + &.remove { + .lib-button-icon( + @_icon-font-content: @icon-remove, + @_icon-font-text-hide: true, + @_icon-font-size: 28px + ); + .lib-button-reset(); + } + } + } + } +} + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { + .column { + .block-addbysku { + .action { + &.remove { + .lib-button-reset(); + .lib-button-as-link(); + margin-top: 4px; + } + } + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .block-cart-failed { + &:extend(.abs-shopping-cart-items-desktop all); + .actions { + text-align: left; + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_AdvancedCheckout/web/css/source/_widgets.less b/app/design/frontend/Magento/blank/Magento_AdvancedCheckout/web/css/source/_widgets.less new file mode 100644 index 0000000000000000000000000000000000000000..e5fff5791b61a57d1580d3428c3bf454150ec4af --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_AdvancedCheckout/web/css/source/_widgets.less @@ -0,0 +1,88 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .sidebar { + .block-addbysku { + .fieldset { + margin: 0; + .fields { + position: relative; + .field { + display: inline-block; + margin-bottom: @indent__s; + vertical-align: top; + &.sku { + &:extend(.abs-add-box-sizing all); + margin-right: -85px; + padding-right: 90px; + width: 100%; + } + &.qty { + .qty { + &:extend(.abs-input-qty all); + + .mage-error { + width: 80px; + } + } + } + } + .actions-toolbar { + position: absolute; + right: 0; + top: 6px; + } + } + } + .form-addbysku { + .actions-toolbar { + margin-bottom: @indent__base; + .primary { + text-align: left; + .action { + width: auto; + } + } + .secondary { + float: none; + text-align: left; + } + } + } + .action { + &.add { + .lib-button-icon( + @_icon-font-content: @icon-expand, + @_icon-font-text-hide: true, + @_icon-font-size: 31px + ); + line-height: normal; + padding: 2px 0; + width: auto; + } + &.links { + display: inline-block; + margin: @indent__base 0 0; + } + &.reset { + margin: @indent__s 0; + display: block; + } + &.remove { + .lib-button-icon( + @_icon-font-content: @icon-remove, + @_icon-font-text-hide: true, + @_icon-font-size: 28px + ); + .lib-button-reset(); + } + } + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_Banner/web/css/source/_widgets.less b/app/design/frontend/Magento/blank/Magento_Banner/web/css/source/_widgets.less new file mode 100644 index 0000000000000000000000000000000000000000..f79ad22a9e85284e30540ec6c78468907d3b7b00 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_Banner/web/css/source/_widgets.less @@ -0,0 +1,32 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + + .block-banners, + .block-banners-inline { + &:extend(.abs-margin-for-blocks-and-widgets); + + .banner-items { + &:extend(.abs-reset-list all); + } + + .banner-item { + display: block; + } + + .banner-item-content { + .lib-css(margin-bottom, @indent__base); + img { + display: block; + margin: 0 auto; + } + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less index d65fc3090a9fa3be0da8cb586092370826853fee..67d9400be23c9caf497a7977364bf16942a70928 100644 --- a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less @@ -558,9 +558,12 @@ .product-info-main { float: right; } + .product.media { float: left; + margin-bottom: @indent__m; } + .page-layout-1column { .product-info-main { width: 40%; @@ -569,6 +572,7 @@ width: 57%; } } + .page-layout-2columns-left, .page-layout-2columns-right, .page-layout-3columns { diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less index 95ae194085ad27548b7e7384351409c9f8424e31..c6e638f56f4506159a5971a0f24c7e06ed65730b 100644 --- a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less +++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less @@ -4,105 +4,109 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ @toolbar-mode-icon-font-size: 24px; @toolbar-element-background: @panel__background-color; & when (@media-common = true) { -.page-products .columns { - position: relative; - z-index: 1; -} - -.toolbar { - &:extend(.abs-add-clearfix all); - &-amount { - display: block; - line-height: @toolbar-mode-icon-font-size+2; - padding: 8px 0 0; - margin: 0; - vertical-align: middle; - .products.wrapper ~ .toolbar & { - display: none; + .page-products { + .columns { + position: relative; + z-index: 1; } } - &-products { - margin-bottom: @indent__xl; - text-align: center; - padding: 0 @indent__s; + + .toolbar { &:extend(.abs-add-clearfix all); - .pages { - display: none; - .products.wrapper ~ & { - display: block; + &-amount { + display: block; + line-height: @toolbar-mode-icon-font-size+2; + margin: 0; + padding: 8px 0 0; + vertical-align: middle; + .products.wrapper ~ .toolbar & { + display: none; } } - .limiter { - display: none; - .control { - display: inline-block; + &-products { + margin-bottom: @indent__xl; + padding: 0 @indent__s; + text-align: center; + &:extend(.abs-add-clearfix all); + .pages { + display: none; + .products.wrapper ~ & { + display: block; + } + } + .limiter { + display: none; + .control { + display: inline-block; + } } } } -} -.sorter { - padding: 4px 0 0; - .products.wrapper ~ .toolbar & { - display: none; - } - &-options { - margin: 0 0 0 7px; - width: auto; - } - &-action { - vertical-align: top; - .lib-icon-font( + .sorter { + padding: 4px 0 0; + .products.wrapper ~ .toolbar & { + display: none; + } + &-options { + margin: 0 0 0 7px; + width: auto; + } + &-action { + vertical-align: top; + .lib-icon-font( @icon-arrow-up, @_icon-font-size: 28px, @_icon-font-line-height: 32px, @_icon-font-color: @header-icons-color, @_icon-font-color-hover: @header-icons-color-hover, @_icon-font-text-hide: true - ); - &.sort-desc:before { - content: @icon-arrow-down; + ); + &.sort-desc:before { + content: @icon-arrow-down; + } } } -} -.modes { - display: none; -} - -.limiter { - &-options { - width: auto; - margin: 0 5px 0 7px; - } - &-label { - font-weight: 400; - } - .page-products .toolbar & { + .modes { display: none; } -} + .limiter { + &-options { + width: auto; + margin: 0 5px 0 7px; + } + &-label { + font-weight: 400; + } + .page-products .toolbar & { + display: none; + } + } } // -// Mobile -// --------------------------------------------- +// Desctop +// _____________________________________________ .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { - .page-products .columns { - position: relative; - z-index: 1; - padding-top: 0; + .page-products { + .columns { + padding-top: 0; + position: relative; + z-index: 1; + } } + .toolbar { .products.wrapper ~ & .pages { float: left; @@ -111,19 +115,24 @@ float: left; } } + .sorter { float: right; } + .modes { - float: left; display: inline-block; + float: left; margin-right: @indent__base; + .products.wrapper ~ .toolbar & { display: none; } + &-label { &:extend(.abs-visually-hidden-desktop-s all); } + &-mode { .lib-css(color, @text__color__muted); border: 1px solid @border-color__base; @@ -134,8 +143,8 @@ padding: 7px 10px; text-align: center; &:not(.active):hover { - background: darken(@toolbar-element-background, 7%); .lib-css(color, @text__color__muted); + background: darken(@toolbar-element-background, 7%); } &:last-child { border-right: 1px solid @border-color__base; @@ -144,15 +153,19 @@ .lib-css(color, @primary__color__light); } .lib-icon-font( - @icon-grid, - @_icon-font-size: @toolbar-mode-icon-font-size, - @_icon-font-text-hide: true + @icon-grid, + @_icon-font-size: @toolbar-mode-icon-font-size, + @_icon-font-text-hide: true, + @_icon-font-color: @text__color__muted, + @_icon-font-color-hover: @text__color__muted ); } } + .mode-list { .lib-icon-font-symbol(@icon-list); } + .limiter { float: right; .products.wrapper ~ .toolbar & { diff --git a/app/design/frontend/Magento/blank/Magento_CatalogEvent/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_CatalogEvent/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..eec3d9c2c7650630cf8d4e5ce66249da07c900ed --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_CatalogEvent/web/css/source/_module.less @@ -0,0 +1,116 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +@catalog-event-background-color: @color-gray94; +@catalog-event-color: @primary__color; + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +// +// Catalog Events +// -------------------------------------- +.block-category-event { + .lib-css(background, @catalog-event-background-color); + .lib-css(color, @catalog-event-color); + text-align: center; + padding: @indent__s 0 15px; + &.block:last-child { + margin-bottom: @indent__s; + } + .block-title { + margin: 0 0 @indent__s; + strong { + .lib-font-size(15); + font-weight: @font-weight__light; + } + } + .ticker { + .lib-list-reset-styles(); + li { + display: none; + margin: 0 15px; + } + .value { + .lib-font-size(18); + font-weight: @font-weight__light; + } + .label { + display: block; + text-transform: lowercase; + .lib-font-size(10); + } + } + .dates { + .start, + .end { + display: block; + } + .date { + .lib-font-size(50); + } + .time { + display: block; + } + .start { + &:after { + content: "\2013"; + .lib-font-size(50); + display: block; + } + } + } +} + +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .block-category-event { + &.block:last-child { + margin-bottom: @indent__l; + padding: @indent__s 0 @indent__l; + } + .block-title { + margin: 0; + strong { + .lib-font-size(24); + } + } + .ticker { + li { + display: none; + margin: 0 50px; + } + .value { + .lib-font-size(60); + } + .label { + .lib-font-size(14); + text-transform: none; + } + } + .dates { + .start, + .end { + display: inline-block; + } + .start { + padding-right: 50px; + position: relative; + &:after { + position: absolute; + right: 10px; + top: 0; + } + } + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_CatalogEvent/web/css/source/_widgets.less b/app/design/frontend/Magento/blank/Magento_CatalogEvent/web/css/source/_widgets.less new file mode 100644 index 0000000000000000000000000000000000000000..109186faad1dbc8e8ce9371cf2db4ce6171f3d2d --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_CatalogEvent/web/css/source/_widgets.less @@ -0,0 +1,156 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.block-event { + .columns & { + position: relative; + z-index: 2; + } + .block-content { + position: relative; + > .action { + cursor: pointer; + margin-top: -6px; + position: absolute; + top: 50%; + z-index: 3; + &.backward, + &.forward { + opacity: .5; + overflow: hidden; + width: 20px; + .lib-icon-font( + @_icon-font-content: @icon-prev, + @_icon-font-text-hide: true, + @_icon-font-size: 55px, + @_icon-font-line-height: 30px + ); + &:before { + margin-left: -15px; + } + } + &.backward { + left: 0; + } + &.forward { + right: 0; + .lib-icon-font-symbol(@icon-next); + } + &.inactive { + cursor: default; + display: none; + } + &:hover { + opacity: 1; + } + } + } + .slider-panel { + position: relative; + overflow: hidden; + z-index: 2; + .slider { + &:extend(.abs-reset-list all); + white-space: nowrap; + .item { + .lib-css(background, @catalog-event-background-color); + display: inline-block; + text-align: center; + white-space: normal; + vertical-align: top; + width: 16.35%; + .sidebar-main &, + .sidebar-additional & { + width: 100%; + } + img { + max-width: 100%; + } + .category-name { + display: inline-block; + .lib-font-size(18); + padding-top: 15px; + } + .ticker { + .lib-list-reset-styles(); + li { + display: none; + margin: 0 5px; + } + .value { + .lib-font-size(26); + font-weight: @font-weight__light; + } + .label { + display: block; + .lib-font-size(13); + } + } + .dates { + font-weight: @font-weight__light; + .start, + .end, + .date { + display: block; + } + .start { + &:after { + content: "\2013"; + .lib-font-size(18); + display: block; + } + } + .date { + .lib-font-size(18); + font-weight: @font-weight__light; + } + .time { + .lib-font-size(13); + } + } + .box-event { + .box-content { + padding: 5px 0 @indent__s; + } + .box-title { + font-weight: @font-weight__light; + display: block; + margin: @indent__s 0 0; + } + } + .action { + &.show { + &:extend(.abs-add-box-sizing all); + display: block; + padding: 0; + .category.name { + display: inline-block; + padding: 30px 10px 0; + } + img { + display: block; + } + } + &.event { + .lib-button-primary(); + &:extend(.abs-action-link-button all); + margin-top: 15px; + &:hover { + text-decoration: none; + } + } + } + } + } + } +} + +} diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_minicart.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_minicart.less index fb76486d5287a9bc062e141fbc6a5c3dcfd6ed30..a0396d053157fe30fb27526c8b5bd458faa300e2 100644 --- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_minicart.less +++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_minicart.less @@ -49,8 +49,6 @@ } .subtitle { display: none; - } - .subtitle { &.empty { display: block; font-size: 14px; @@ -124,10 +122,14 @@ right: 26px; } } - .product.actions { - text-align: right; - > .primary, > .secondary { - display: inline; + .product { + .actions { + float: right; + margin: -24px 0 0; + text-align: right; + > .primary, > .secondary { + display: inline; + } } } @@ -165,7 +167,7 @@ text-align: center; white-space: normal; &.empty { - &:extend(.abs-no-display all); + display: none; } .loader { > img { @@ -184,8 +186,8 @@ } .minicart-items-wrapper { - .lib-css(margin, 0 -@minicart__padding-horizontal); .lib-css(border, 1px solid @minicart__border-color); + .lib-css(margin, 0 -@minicart__padding-horizontal); border-left: 0; border-right: 0; overflow-x: auto; @@ -301,12 +303,12 @@ text-align: center; width: 40px; } - .item-update { + .update-cart-item { .lib-font-size(11); vertical-align: top; } .subtitle { - &:extend(.abs-no-display all); + display: none; } .action { &.edit, diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less index 0de27d21df32f5a65c45e23f1c67b5a09f1fd9d1..4f8c9b771654909e46c3d61764fa9a134c03ff44 100644 --- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less +++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less @@ -105,6 +105,58 @@ filter: gray; // For IE 6 - 9 } } + + .ccard { + .legend { + &:extend(.abs-visually-hidden all); + } + .fields { + > .year { + padding-left: @indent__xs; + } + .select { + padding-left: @indent__xs; + padding-right: @indent__xs; + } + } + .month { + .select { + width: 140px; + } + } + .year { + .select { + width: 80px; + } + } + .number { + .input-text { + width: 225px; + } + } + + > .field.cvv { + > .control { + padding-right: @indent__base; + width: auto; + } + } + .cvv { + .input-text { + width: 55px; + } + } + + &.fieldset { + > .field { + .fields.group.group-2 { + .field { + width: auto !important; + } + } + } + } + } } } diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payments.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payments.less index 741516ae64dd30e2e11067ebc2a3c7d574ba95a9..516d9e21e8b091645193355d94bef8c86f5c2f87 100644 --- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payments.less +++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payments.less @@ -76,13 +76,6 @@ margin: 0 0 @indent__base; } } - .field { - &.cvv { - .control { - width: 40%; - } - } - } } .field-select-billing, @@ -136,14 +129,6 @@ .no-payments-block { margin: @indent__base 0; } - .ccard { - .legend { - &:extend(.abs-visually-hidden all); - } - .year { - padding-left: @indent__l; - } - } .payments { .legend { &:extend(.abs-visually-hidden all); diff --git a/app/design/frontend/Magento/blank/Magento_GiftCard/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GiftCard/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..5c0f40733dac6ae33157f1afa1602a32aa888c74 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_GiftCard/web/css/source/_module.less @@ -0,0 +1,46 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.cart { + &-summary { + .block { + &.giftcard { + .action.check { + .lib-button-s(); + &:extend(.abs-action-button-as-link all); + margin-top: @indent__base; + } + } + } + } +} +.page-product-giftcard { + .giftcard-amount { + text-align: left; + margin-bottom: 0; + .field:last-child { + padding-bottom: @form-field__vertical-indent; + } + } + .product-options-wrapper .field:first-of-type { + margin-top: @form-field__vertical-indent; + } + .fieldset.giftcard { + >.legend { + &:extend(.abs-visually-hidden all); + } + >.legend + br { + &:extend(.abs-no-display all); + } + } +} + +} diff --git a/app/code/Magento/LayeredNavigation/view/frontend/layout/3columns.xml b/app/design/frontend/Magento/blank/Magento_GiftCardAccount/layout/checkout_cart_index.xml similarity index 61% rename from app/code/Magento/LayeredNavigation/view/frontend/layout/3columns.xml rename to app/design/frontend/Magento/blank/Magento_GiftCardAccount/layout/checkout_cart_index.xml index 5b97b56d83d48958b92d9db9860d2c9f6b574a3e..56fda77e69b16fed0a38c02398a9a84293ecde91 100644 --- a/app/code/Magento/LayeredNavigation/view/frontend/layout/3columns.xml +++ b/app/design/frontend/Magento/blank/Magento_GiftCardAccount/layout/checkout_cart_index.xml @@ -5,8 +5,8 @@ * See COPYING.txt for license details. */ --> -<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="All Three-Column Layout Pages" design_abstraction="page_layout"> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> - <move element="catalog.leftnav" destination="sidebar.main" before="-"/> + <move element="checkout.cart.giftcardaccount" destination="cart.summary" after="checkout.cart.coupon" before="checkout.cart.totals.container"/> </body> </page> diff --git a/app/design/frontend/Magento/blank/Magento_GiftCardAccount/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GiftCardAccount/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..033a058c1f0dbfbb06f8f2548b4ddf53182bf839 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_GiftCardAccount/web/css/source/_module.less @@ -0,0 +1,41 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + + .giftcard-account { + .please-wait { + display: none; + } + .form-giftcard-redeem { + .giftcard.info { + margin-bottom: @indent__l; + } + } + } + + .opc-wrapper { + .form-giftcard-account { + max-width: 500px; + .field { + margin: 0 0 @indent__base; + .label { + &:extend(.abs-visually-hidden all); + } + } + } + .giftcard-account-info { + margin: 0 0 @indent__base; + + .giftcard-account-number { + margin: 0 0 @indent__s; + } + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..3419334602f7527deb1cd2aff595a301e3d7adc8 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_module.less @@ -0,0 +1,253 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + + .form-giftregistry-share, + .form-giftregistry-edit { + &:extend(.abs-add-fields all); + .actions-toolbar:not(:last-child) { + margin-bottom: @indent__xl; + } + .fieldset { + .nested { + .field:not(.choice) { + .control { + width: 100%; + } + } + } + } + } + + .form.giftregistry.items { + .actions-toolbar { + &:extend(.abs-reset-left-margin all); + } + } + + .giftregisty-dropdown { + &:extend(.abs-dropdown-simple all); + } + + .table-giftregistry-items { + .field.qty .qty { + &:extend(.abs-input-qty all); + } + .product-image { + float: left; + .lib-css(margin-right, @indent__s); + } + } + + .form.giftregistry .fieldset { + .cart-summary & { + margin: 25px 0 @indent__xs; + .field { + margin: 0 0 @indent__s; + .control { + float: none; + width: auto; + } + } + .action.primary { + margin-bottom: 0; + &:extend(.abs-revert-secondary-color all); + &:extend(.abs-revert-secondary-size all); + } + } + } + + .form-giftregistry-search { + margin-bottom: @indent__l*2; + .legend { + &:extend(.abs-account-title all); + } + .fields-specific-options { + .field { + &:nth-last-of-type(1) { + margin-bottom: 0; + } + } + .datetime-picker { + &:extend(.abs-field-date-input all); + } + } + } + + .block-giftregistry-results { + .block-title { + &:extend(.abs-block-title all); + } + + .toolbar-giftregistry-results { + text-align: center; + } + } + + .block-giftregistry { + .actions-toolbar { + margin: 17px 0 0; + } + } + + .block-giftregistry-shared { + .item-options { + .item-value { + margin: 0 0 @indent__m; + } + } + } + + .block-giftregistry-shared-items { + .block-title { + &:extend(.abs-block-title all); + } + .product-image-wrapper { + &:extend(.abs-reset-image-wrapper all); + } + .item { + border-bottom: @border-width__base solid @border-color__base; + } + .qty { + .qty { + &:extend(.abs-input-qty all); + } + } + .col { + padding: @indent__base 8px @indent__s; + .price-box { + display: inline-block; + } + .price-wrapper { + .lib-font-size(18); + display: block; + font-weight: @font-weight__bold; + white-space: nowrap; + } + } + + .product { + .item-options { + &:extend(.abs-product-options-list all); + &:extend(.abs-add-clearfix all); + margin-bottom: 0; + } + &-item-photo { + display: block; + max-width: 65px; + padding: @indent__s 0; + } + &-item-name { + display: block; + margin: 0 0 @indent__xs; + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .table-giftregistry-items { + .col.product { + &:before { + &:extend(.abs-visually-hidden-mobile all); + } + &:extend(.abs-add-clearfix-mobile all); + } + .field.choice, + .field.qty { + display: inline-block; + } + } + .form-giftregistry-search { + .fieldset { + margin-bottom: 15px; + } + } + + .toolbar-giftregistry-results { + &:extend(.abs-pager-toolbar-mobile-s all); + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .form-giftregistry-share, + .form-giftregistry-edit { + &:extend(.abs-add-fields-desktop all); + } + + .form-giftregistry-search { + .fieldset { + margin-bottom: @form-field__vertical-indent__desktop; + > .fields-specific-options { + > .field { + .lib-form-field-type-revert(); + } + } + } + } + + .toolbar-giftregistry-results { + &:extend(.abs-pager-toolbar all); + } + + .block-giftregistry-shared { + .item-options { + &:extend(.abs-product-options-list-desktop all); + &:extend(.abs-add-clearfix-desktop all); + } + } + + .block-giftregistry-shared-items { + .column.main & { + .actions-toolbar { + &:extend(.abs-reset-left-margin-desktop all); + } + } + .product { + &-item-photo { + display: table-cell; + max-width: 100%; + padding: 0 @indent__base 0 0; + vertical-align: top; + width: 1%; + } + &-item-details { + display: table-cell; + vertical-align: top; + width: 99%; + word-break: normal; + } + } + .col { + &.product { + width: 48%; + } + &:not(.product) { + text-align: center; + } + &.price { + padding-top: 17px; + } + } + .input-text { + &.qty { + margin-top: -4px; + } + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_widgets.less b/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_widgets.less new file mode 100644 index 0000000000000000000000000000000000000000..b5d0ca095c5366983259499cdf0a867c744e0795 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_widgets.less @@ -0,0 +1,7 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +.widget.block-giftregistry { +} diff --git a/app/design/frontend/Magento/blank/Magento_GiftWrapping/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GiftWrapping/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..7395b73c638437b4b279853a5378ea819d06a155 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_GiftWrapping/web/css/source/_module.less @@ -0,0 +1,216 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Variables +// _____________________________________________ + +@gift-wrapping__border-color: @color-gray-light5; +@gift-wrapping__border-width: @border-width__base; + +@gift-wrapping-preview__active__border-color: @color-gray20; +@gift-wrapping-preview__active__border-width: 3px; + +@gift-wrapping-thumbnail__height: 4rem; +@gift-wrapping-thumbnail__width: @gift-wrapping-thumbnail__height; + +@gift-wrapping-no-image__background: @color-gray95; +@gift-wrapping-no-image-icon__color: @color-gray-darken4; +@gift-wrapping-no-image-icon__font-size: 38px; + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .gift-wrapping-info { + .lib-css(font-weight, @font-weight__light); + font-size: @font-size__l; + margin: @indent__base 0; + } + + .gift-wrapping-list { + &:extend(.abs-add-clearfix all); + list-style: none; + margin: @indent__base 0 @indent__s; + padding: 0; + .no-image { + .lib-css(background, @gift-wrapping-no-image__background); + .lib-icon-font( + @icon-present, + @_icon-font-size: @gift-wrapping-no-image-icon__font-size, + @_icon-font-line-height: @gift-wrapping-thumbnail__height, + @_icon-font-color: @gift-wrapping-no-image-icon__color, + @_icon-font-position: after, + @_icon-font-text-hide: true, + @_icon-font-vertical-align: middle + ); + &:after { + display: block; + } + } + } + + .gift-wrapping-preview, + .gift-wrapping-item > span { + cursor: pointer; + display: block; + overflow: hidden; + position: relative; + z-index: 1; + } + + .gift-wrapping-item { + float: left; + margin: 0 @indent__s @indent__s 0; + &:last-child { + margin-right: 0; + } + &._active { + span { + &:before { + .lib-css(border, @gift-wrapping-preview__active__border-width solid @gift-wrapping-preview__active__border-color); + box-sizing: border-box; + content: ''; + display: block; + height: 100%; + position: absolute; + width: 100%; + z-index: 2; + } + } + } + > span { + height: @gift-wrapping-thumbnail__height; + width: @gift-wrapping-thumbnail__width; + } + } + + .gift-wrapping-title { + margin: @indent__s 0; + .action-remove { + margin-left: @indent__xs; + } + } + + .gift-options-content { + .fieldset { + > .field { + margin: 0 0 @indent__xs; + &:before { + display: none; + } + } + } + } + + .gift-wrapping-summary { + .gift-wrapping-title { + border: 0; + display: inline-block; + padding: 0; + } + } + + .opc-wrapper .data.table, + .table-order-items, + .table-order-review { + .gift-wrapping { + &:extend(.abs-add-clearfix all); + margin: @indent__base 0; + .title { + float: none; + } + .content { + margin: 0; + > img { + float: left; + margin: 0 @indent__s 0 0; + max-height: 50px; + max-width: 50px; + } + } + } + } + + .gift-summary, + .gift-options { + .price-box { + margin-left: 22px; + } + .regular-price { + &:before { + content: attr(data-label)": "; + } + .price { + font-weight: @font-weight__bold; + } + } + &:extend(.abs-adjustment-incl-excl-tax all); + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .gift-wrapping { + .lib-css(border-bottom, @gift-wrapping__border-width solid @gift-wrapping__border-color); + margin-bottom: @indent__base; + padding-bottom: @indent__s; + } + .gift-wrapping-list { + width: 100%; + } + .gift-wrapping-preview { + img { + width: 100%; + } + } + .item-actions { + .actions-toolbar { + .gift-options { + .gift-wrapping, + .gift-message { + display: block; + } + } + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .gift-wrapping { + .nested { + &:extend(.abs-add-clearfix-desktop all); + } + } + .table { + .gift-wrapping { + .content { + &:extend(.abs-add-clearfix-desktop all); + } + } + } + .gift-wrapping { + .lib-css(border-right, @gift-wrapping__border-width solid @gift-wrapping__border-color); + box-sizing: border-box; + float: left; + padding-right: @indent__base; + width: 50%; + & + .gift-message { + .lib-css(border-left, @gift-wrapping__border-width solid @gift-wrapping__border-color); + box-sizing: border-box; + float: left; + padding-left: 4.5rem; + width: 50%; + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_GroupedProduct/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GroupedProduct/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..5423cfa8da28af328a8740461ece9e94eb0d4395 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_GroupedProduct/web/css/source/_module.less @@ -0,0 +1,48 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.table.grouped { + .lib-table-bordered( + @_table_type: horizontal + ); + > thead > tr > th { + border-bottom: 0; + } + .product-item-name { + font-weight: @font-weight__regular; + } + .price-box { + .price { + font-size: @font-size__base; + } + } + .control { + .qty { + &:extend(.abs-input-qty all); + } + } + .stock.unavailable { + font-weight: normal; + margin: 0; + text-transform: none; + white-space: nowrap; + } + .row-tier-price { + td { + border-top: 0; + } + .prices-tier { + margin: 0 -10px 10px; + } + } +} + +} diff --git a/app/design/frontend/Magento/blank/Magento_Invitation/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Invitation/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..56d690b2e1d8bcc84f08830f4196b9b185c17c0e --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_Invitation/web/css/source/_module.less @@ -0,0 +1,55 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.form-add-invitations { + &:extend(.abs-add-fields all); + .action { + &.add { + .lib-button-icon( + @_icon-font-content: @icon-expand, + @_icon-font-text-hide: true, + @_icon-font-size: 31px + ); + line-height: normal; + padding: 2px 0; + width: auto; + } + } +} + +} + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .form-add-invitations { + .additional, + .field.text { + .lib-css(margin-top, @form-field__vertical-indent); + } + } +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .form-add-invitations { + &:extend(.abs-add-fields-desktop all); + .additional, + .field.text { + .lib-css(margin-top, @form-field__vertical-indent__desktop); + } + } + .table-invitations { + .col { + width: 50%; + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_LayeredNavigation/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_LayeredNavigation/web/css/source/_module.less index 8b3d0a38fe55dcf3540acd828ce9a4eae32f0f4a..47ac371e1cdf5d8544ec77ca6ba5d37d0af66081 100644 --- a/app/design/frontend/Magento/blank/Magento_LayeredNavigation/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_LayeredNavigation/web/css/source/_module.less @@ -4,35 +4,37 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { -.block.filter { - margin-bottom: 40px; - .title { - margin-bottom: 20px; - strong { - font-size: 18px; + .block.filter { + margin-bottom: @indent__xl ; + .filter-title { + margin-bottom: @indent__base; + strong { + font-size: 18px; + } } } - .subtitle { + .filter-subtitle { display: none; } + .filter-options-content { .filter-count-label { &:extend(.abs-visually-hidden all); } } - .options { + .filter-options { margin: 0; > dt { .lib-heading(h4); - margin: 0 0 10px; + margin: 0 0 @indent__s; } > dd { - margin: 0 0 25px; + margin: 0 0 @indent__m; .item { margin-bottom: 3px; @@ -75,4 +77,16 @@ } } +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .page-with-filter { + .columns { + .sidebar-main { + .lib-vendor-prefix-order(0); + } + } + } } diff --git a/app/design/frontend/Magento/blank/Magento_MultipleWishlist/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_MultipleWishlist/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..ee2926d3acf260c9a62c1029bf8490b26ac98792 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_MultipleWishlist/web/css/source/_module.less @@ -0,0 +1,494 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +@desktop-popup-width: 380px; +@desktop-popup-margin-left: -((@desktop-popup-width+(@popup__padding*2))/2); +@desktop-popup-position-left: 50%; +@desktop-popup-position-top: 20%; + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .wishlist { + // Wish list split button + &.split.button { + .lib-dropdown-split( + @_options-selector: ~".items", + @_dropdown-split-button-border-radius-fix: true, + @_dropdown-split-list-item-padding: 5px 5px 5px 23px, + @_dropdown-split-toggle-icon-content: @icon-down, + @_dropdown-split-toggle-active-icon-content: @icon-up, + @_dropdown-split-toggle-actions-padding: false, + @_icon-font-size: 22px, + @_icon-font-color: @addto-color, + @_icon-font-color-hover: @addto-hover-color, + @_dropdown-split-list-pointer-position: left, + @_dropdown-split-list-min-width: 200px + ); + vertical-align: middle; + .items { + text-align: left; + } + .items .item:last-child { + background: @color-gray-darken1; + &:hover { + .lib-css(background, @dropdown-list-item__hover); + } + } + &:extend(.abs-dropdown-items-new all); + + .table-comparison &, + .product-items & { + > .action { + &:extend(.abs-action-button-as-link all); + &.split { + &:extend(.abs-actions-addto-gridlist all); + .lib-icon-font-symbol( + @_icon-font-content: @icon-wishlist-empty + ); + } + &:active, + &:focus, + &:hover { + .lib-css(color, @addto-hover-color); + } + } + > .action.toggle { + &:before { + border-left: 1px solid lighten(@addto-color, 30%); + content: ''; + float: left; + height: 15px; + margin-top: 3px; + } + } + } + .product-info-main &, + .block-bundle-summary &, + .product-add-form &{ + .action { + &.split, + &.toggle { + .lib-button-s(); + } + &.toggle { + padding: 0; + } + } + } + .cart.table-wrapper & { + margin-bottom: @indent__s; + > .action { + &.split { + } + &.toggle { + padding: 4px @indent__xs; + } + } + } + } + &.window.popup { + .lib-popup(); + &.active { + display: block; + } + } + &.overlay { + .lib-window-overlay(); + &.active { + display: block; + } + } + &-dropdown { + &:extend(.abs-dropdown-simple all); + &:extend(.abs-dropdown-items-new all); + } + } + + .block-wishlist-management { + position: relative; + .wishlist { + // Select wish list + &-select { + .wishlist-name { + &-label { + font-weight: @font-weight__semibold; + &:extend(.abs-colon all); + } + &-current { + } + } + &-items { + &:extend(.abs-reset-list all); + &.active { + } + } + } + &-add.item { + .action { + } + } + // Wish list name + &-title { + margin-bottom: @indent__s; + strong { + font-weight: @font-weight__light; + margin-right: @indent__s; + } + .action.edit { + } + } + // Wish list info + &-info { + } + &-notice { + .lib-css(color, @text__color__muted); + display: inline-block; + margin-right: @indent__base; + &.private { + } + } + // Wish list toolbar + &-toolbar { + &-select, + &-actions { + display: inline-block; + } + &-select { + margin-right: @indent__base; + } + &-actions { + } + } + // Wish list toolbar actions + &-dropdown.move { + margin-right: @indent__base; + } + } + } + + .block-wishlist-search-form { + .block-title { + &:extend(.abs-account-title all); + } + .form-wishlist-search { + .lib-css(margin-bottom, @indent__l*2); + max-width: 500px; + .fieldset { + > .legend { + &:extend(.abs-visually-hidden); + } + } + } + } + + .block-wishlist-search-results { + .block-title { + &:extend(.abs-block-title all); + } + .toolbar-wishlist-results { + text-align: center; + } + } + + .page-multiple-wishlist { + .page-title-wrapper { + .page-title { + &:extend(.abs-visually-hidden all); + } + } + } + + .block-wishlist-info-items { + .block-title { + .lib-css(margin-bottom, @indent__base); + .lib-font-size(22); + > strong { + font-weight: @font-weight__light ; + } + } + .product-item { + width: 100%; + } + .product-item-photo { + margin-left: @indent__base; + } + .product-item-info { + width: auto; + &:hover { + .split { + visibility: visible; + } + } + } + .price-wrapper { + display: block; + margin: 0 0 @indent__s; + } + .split { + clear: both; + padding: @indent__s 0; + } + .action { + &.towishlist { + padding: @indent__s 0; + } + } + .input-text { + &.qty { + &:extend(.abs-input-qty all); + margin-right: @indent__s; + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .block-wishlist-management { + clear: both; + margin-top: -21px; + .wishlist { + // Select wish list + &-select { + margin: 0 -@layout__width-xs-indent 20px; + .wishlist-name { + &:extend(.abs-toggling-title-mobile all); + &-label { + } + &-current { + } + } + &-items { + border-bottom: @border-width__base solid @border-color__base; + .lib-css(background, @collapsible-nav-background); + display: none; + padding: 15px 0; + &.active { + display: block; + } + .item { + margin: 3px 0 0; + &:first-child { + margin-top: 0; + } + &.current { + display: none; + } + a { + display: block; + padding: @indent__xs 18px; + text-decoration: none; + &:hover { + .lib-css(background, @collapsible-nav-item-hover); + } + } + } + } + } + &-add.item { + .add { + &:extend(.abs-icon-add-mobile all); + } + } + // Wish list name + &-title { + strong { + .lib-font-size(26); + } + .action.edit { + } + } + // Wish list info + &-info { + margin-bottom: 15px; + } + &-notice { + &.private { + } + } + // Wish list toolbar + &-toolbar { + &-select, + &-actions { + margin-bottom: 15px; + } + &-select { + } + &-actions { + } + } + // Wish list toolbar actions + &-dropdown.move { + } + } + } + .products-grid.wishlist { + .product { + &-item { + &-checkbox { + left: 20px; + position: absolute; + top: 20px; + } + &-photo { + .page-multiple-wishlist & { + margin-left: @indent__m; + } + } + &-name, + &-description, + .price-box, + &-tooltip { + .page-multiple-wishlist & { + margin-left: 115px; + } + } + } + } + .wishlist-dropdown { + display: none; + } + } + + .toolbar-wishlist-results { + &:extend(.abs-pager-toolbar-mobile all); + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .wishlist { + &.window.popup { + bottom: auto; + .lib-css(top, @desktop-popup-position-top); + .lib-css(left, @desktop-popup-position-left); + .lib-css(margin-left, @desktop-popup-margin-left); + .lib-css(width, @desktop-popup-width); + right: auto; + .field { + .lib-form-field-type-revert(@_type: block); + } + } + } + + .block-wishlist-management { + &:extend(.abs-add-clearfix-desktop all); + margin-bottom: @indent__base; + .wishlist { + // Select wish list + &-select { + border-bottom: 1px solid @secondary__color; + display: table; + margin-bottom: 15px; + width: 100%; + .wishlist-name { + display: table-cell; + margin-right: @indent__s; + padding: @indent__xs @indent__s @indent__s; + vertical-align: top; + white-space: nowrap; + width: 5%; + span { + } + &.active { + } + &-label { + } + &-current { + } + } + &-items { + display: table-cell; + padding-right: 160px; + vertical-align: top; + &.active { + } + .item { + display: inline-block; + margin-right: @indent__s; + padding: @indent__xs @indent__s @indent__s; + &:last-child { + margin-right: 0; + } + } + .current { + border-bottom: 3px solid @active__color; + font-weight: @font-weight__semibold; + } + } + .wishlist-name-current { + display: none; + } + } + &-add.item { + position: absolute; + right: 0; + top: 0; + } + // Wish list name + &-title { + strong { + .lib-font-size(40); + } + .action.edit { + } + } + // Wish list info + &-info { + float: left; + } + &-notice { + &.private { + } + } + // Wish list toolbar + &-toolbar { + float: right; + &-select, + &-actions { + } + &-select { + } + &-actions { + } + } + // Wish list toolbar actions + &-dropdown.move { + } + } + } + + .block-wishlist-info-items { + .product-item-photo { + margin-left: 0; + } + } + + .products-grid.wishlist { + .product { + &-item { + &-checkbox { + float: left; + + .product-item-name { + margin-left: @indent__m; + } + } + } + } + } + + .toolbar-wishlist-results { + &:extend(.abs-pager-toolbar all); + } +} diff --git a/app/design/frontend/Magento/blank/Magento_MultipleWishlist/web/css/source/_widgets.less b/app/design/frontend/Magento/blank/Magento_MultipleWishlist/web/css/source/_widgets.less new file mode 100644 index 0000000000000000000000000000000000000000..a8e77fb379ba3c145090105c418ada44d654034c --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_MultipleWishlist/web/css/source/_widgets.less @@ -0,0 +1,10 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +.block-wishlist-search { + .form-wishlist-search { + margin: @form-field__vertical-indent 0 0; + } +} diff --git a/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less index fd2eb640f58f3ace9e12477cf2240860b0acf476..9e80d9980430ed01de7bb2867a93612cc7e86ad0 100644 --- a/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less @@ -253,8 +253,8 @@ margin-bottom: @indent__m; } > .primary { - margin-right: 0; margin-bottom: @indent__m; + margin-right: 0; } } } @@ -295,9 +295,19 @@ width: 25%; } .box-shipping-method { - padding-right: @indent__m; padding-left: @indent__m; + padding-right: @indent__m; width: 50%; + .fieldset { + .legend { + &:extend(.abs-reset-left-margin-desktop-s all); + } + .field { + &:before { + display: none; + } + } + } } } diff --git a/app/design/frontend/Magento/blank/Magento_ProductVideo/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_ProductVideo/web/css/source/_module.less index d51b978a97e0f74dad2a83121c0b331830e6a051..f13d4143e5a0d078c81d042d57106b79eb32c174 100644 --- a/app/design/frontend/Magento/blank/Magento_ProductVideo/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_ProductVideo/web/css/source/_module.less @@ -45,11 +45,14 @@ } .product-video { - height: 85%; - margin-top: 15%; + height: 75%; + left: 0; position: absolute; top: 0; width: 100%; + right: 0; + bottom: 0; + margin: auto; iframe { height: 100%; left: 0; @@ -60,6 +63,16 @@ } } +@media only screen +and (min-device-width : 320px) +and (max-device-width : 780px) +and (orientation : landscape) { + .product-video { + height: 100%; + width: 81%; + } +} + .fotorama__arr.hidden-video { z-index: -1; } diff --git a/app/design/frontend/Magento/blank/Magento_Reward/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Reward/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..47da1a78bd157b8b19387c294e73021c156323d3 --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_Reward/web/css/source/_module.less @@ -0,0 +1,48 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.block-reward-info { + .reward-rates, + .reward-limit, + .reward-expiring { + &:not(:last-child) { + margin-bottom: @indent__m; + } + .title { + display: inline-block; + margin-bottom: @indent__s; + } + } +} + +} + +// +// Mobile +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .reward-settings { + + .actions-toolbar { + margin-top: 10px; + } + } +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .reward-settings { + + .actions-toolbar { + margin-top: -32px; + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_Rma/web/css/source/_email.less b/app/design/frontend/Magento/blank/Magento_Rma/web/css/source/_email.less new file mode 100644 index 0000000000000000000000000000000000000000..a45fa3413067f29f87aef866980a0c7c4e3070ce --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_Rma/web/css/source/_email.less @@ -0,0 +1,17 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// RMA table styles +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + // Shrink table size on small screens to fit as much as possible without requiring horizontal scrolling + .rma-items td, + .rma-items th { + font-size: @font-size__s !important; + padding: 5px !important; + } +} diff --git a/app/design/frontend/Magento/blank/Magento_Rma/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Rma/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..efdb489342a7daf6c66df99369720c8d1405660c --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_Rma/web/css/source/_module.less @@ -0,0 +1,151 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.form-create-return { + &:extend(.abs-add-fields all); + .field { + .control > span, + address { + display: inline-block; + padding-top: @form-field-type-label-inline__padding-top; + } + } + .additional { + &:first-child { + margin-top: 0; + } + .field:nth-last-child(2) { + margin-bottom: 0; + } + .field:last-child { + margin-top: @form-field__vertical-indent; + } + } + .field.comment { + margin-top: 55px; + } +} + +.block-returns-comments { + .returns-comments { + dt, + dd { + margin: 0; + } + dt { + font-weight: @font-weight__regular; + } + dd { + margin-bottom: 15px; + &:last-child { + margin-bottom: 0; + } + } + } + .fieldset { + margin-bottom: 20px; + } +} + +.return-status { + &:extend(.abs-status all); +} + +.magento-rma-returns-returns, +.magento-rma-guest-returns, +.magento-rma-returns-view { + .page-title-wrapper { + .page-title { + margin-right: 25px; + } + } +} + +// +// Guest return view page +//-------------------------------------- +.magento-rma-guest-returns { + .column.main { + .block:not(.widget) { + &:extend(.abs-account-blocks all); + } + } +} + +} + +// +// Mobile +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .form-create-return { + .fieldset { + > .actions-toolbar { + &:extend(.abs-add-clearfix-mobile-m all); + } + } + } + .account { + .column.main { + .returns-details-items { + .block-returns-tracking { + .block-title { + > .action.track { + float: none; + display: block; + margin: @indent__s 0 0; + } + } + } + } + } + } +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .form-create-return { + &:extend(.abs-add-fields-desktop all); + .additional { + .field:last-child { + margin-top: @form-field__vertical-indent__desktop; + } + } + } + // + // Guest return view page + //-------------------------------------- + .magento-rma-guest-returns { + .column.main { + .block:not(.widget) { + .block-content { + &:extend(.abs-add-clearfix-desktop all); + .box { + &:extend(.abs-blocks-2columns all); + margin-bottom: @indent__base; + } + } + } + } + } + .block-returns-tracking { + .block-title { + .action { + margin: 12px 0 0 30px; + &.track { + float: right; + } + } + } + } +} diff --git a/app/design/frontend/Magento/blank/Magento_VersionsCms/web/css/source/_widgets.less b/app/design/frontend/Magento/blank/Magento_VersionsCms/web/css/source/_widgets.less new file mode 100644 index 0000000000000000000000000000000000000000..776754d62def1bae272273ee7642c6a64c6b503e --- /dev/null +++ b/app/design/frontend/Magento/blank/Magento_VersionsCms/web/css/source/_widgets.less @@ -0,0 +1,25 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.block-cms-hierarchy-link { + &.widget { + display: block; + margin-bottom: @indent__base; + } + +} +.block-cms-hierarchy-link-inline { + &.widget { + margin: 0; + } +} + +} diff --git a/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/_module.less index 506bbbd71fe10f26fa97847a9ff1575c4e622e57..49720b30a2cf62c57dbcf5d3fb19bdde080b2063 100644 --- a/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/_module.less @@ -4,143 +4,143 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { -.form.wishlist.items { - .actions-toolbar { - &:extend(.abs-reset-left-margin all); + .form.wishlist.items { + .actions-toolbar { + &:extend(.abs-reset-left-margin all); + } } -} -.product-info-main, -.product-options-bottom, -.block-bundle-summary { - .action.towishlist { - &:extend(.abs-action-addto-product all); + .product-info-main, + .product-options-bottom, + .block-bundle-summary { + .action.towishlist { + &:extend(.abs-action-addto-product all); + } } -} -.products.list.items, -.table-comparison { - .action { - &.towishlist { - &:extend(.abs-actions-addto-gridlist all); - .lib-icon-font-symbol( - @icon-wishlist-empty - ); + .products.list.items, + .table-comparison { + .action { + &.towishlist { + &:extend(.abs-actions-addto-gridlist all); + .lib-icon-font-symbol( + @icon-wishlist-empty + ); + } } } -} -.account .table-wrapper .data.table.wishlist { - .lib-table-bordered( - @_table_type: horizontal - ); - thead > tr > th { - border-bottom: 0; - } - tbody > tr:last-child > td { - border-bottom: 1px solid @table__border-color; - } - .product.name { - display: inline-block; - margin-bottom: @indent__s; - } - .box-tocart { - margin: @indent__s 0; - .qty { - vertical-align: middle; - &:extend(.abs-input-qty all); + .account .table-wrapper .data.table.wishlist { + .lib-table-bordered( + @_table_type: horizontal + ); + thead > tr > th { + border-bottom: 0; } - } - .col { - &.item { - width: 50%; + tbody > tr:last-child > td { + border-bottom: 1px solid @table__border-color; } - &.photo { - max-width: 150px; + .product.name { + display: inline-block; + margin-bottom: @indent__s; } - &.selector { - max-width: 15px; + .box-tocart { + margin: @indent__s 0; + .qty { + vertical-align: middle; + &:extend(.abs-input-qty all); + } + } + .col { + &.item { + width: 50%; + } + &.photo { + max-width: 150px; + } + &.selector { + max-width: 15px; + } + } + textarea { + margin: @indent__s 0; + } + .input-text.qty { + margin-bottom: @indent__s; + } + .action.primary { + vertical-align: top; + } + .price { + font-weight: @font-weight__bold; } } - textarea { - margin: 10px 0; - } - .input-text.qty { - margin-bottom: 10px; - } - .action.primary { - vertical-align: top; - } - .price { - font-weight: @font-weight__bold; - } -} -.block-wishlist { - .block-title { - &:extend(.abs-block-title all); - } - .counter { - &:extend(.abs-block-items-counter all); - } - .product-item-name { - margin-right: @indent__m; + .block-wishlist { + .block-title { + &:extend(.abs-block-title all); + } + .counter { + &:extend(.abs-block-items-counter all); + } + .product-item-name { + margin-right: @indent__m; + } } -} -.products-grid.wishlist { - .product { - &-item { - &-photo { - margin-bottom: @indent__s; - display: block; - } - &-name { - margin-top: 0; - } - .price-box { - margin: 0; - } - &-tooltip { - } - .comment-box { - .label { - &:extend(.abs-visually-hidden all); + .products-grid.wishlist { + .product { + &-item { + &-photo { + display: block; + margin-bottom: @indent__s; } - } - &-comment { - display: block; - margin: @indent__s 0; - height: 42px; - } - &-actions { - > * { - margin-right: 15px; - &:last-child { - margin-right: 0; + &-name { + margin-top: 0; + } + .price-box { + margin: 0; + } + &-tooltip { + } + .comment-box { + .label { + &:extend(.abs-visually-hidden all); } } - } - .box-tocart { - input.qty { - height: 32px; - &:extend(.abs-input-qty all); + &-comment { + display: block; + height: 42px; + margin: @indent__s 0; + } + &-actions { + > * { + margin-right: 15px; + &:last-child { + margin-right: 0; + } + } + } + .box-tocart { + input.qty { + height: 32px; + &:extend(.abs-input-qty all); + } } } } } } -} - // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .products-grid.wishlist { .product-item { @@ -154,15 +154,15 @@ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .products-grid.wishlist { - margin-right: -@indent__s; margin-bottom: @indent__l; + margin-right: -@indent__s; .product { &-item { padding: @indent__base @indent__s @indent__base @indent__base; position: relative; &-photo { - margin-right: @indent__base; float: left; + margin-right: @indent__base; } &-name { .lib-font-size(16); @@ -211,8 +211,9 @@ } // - // Grid view for wishlist - //-------------------------------------- + // Grid view for wishlist + // ----------------------------------------- + .wishlist-index-index { .product { &-item { @@ -229,7 +230,7 @@ .wishlist-index-index { .products-grid { .product-item { - margin-bottom: 20px; + margin-bottom: @indent__base; width: 50%; } .product-item-actions { @@ -240,8 +241,9 @@ } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .products-grid.wishlist { .product { @@ -253,12 +255,9 @@ margin: @indent__s 0 0; } .fieldset { - .field.qty, - .product-item-actions { - } .field.qty { - padding-right: @indent__s; margin-bottom: @indent__s; + padding-right: @indent__s; .label { width: auto; } @@ -275,7 +274,7 @@ } } } - .wishlist-index-index { + .wishlist-index-index { .product { &-item { &-info { @@ -283,17 +282,30 @@ } } } + .main { + .form-wishlist-items { + .actions-toolbar { + &:extend(.abs-reset-left-margin-desktop all); + } + } + } } } .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__l) { - .wishlist-index-index .products-grid .product-items { margin: 0; } - .wishlist-index-index .products-grid .product-item { - width: 24.439%; - margin-left: calc(~"(100% - 4 * 24.439%) / 3"); - padding: 0; - &:nth-child(4n+1) { - margin-left: 0; + .wishlist-index-index { + .products-grid { + .product-items { + margin: 0; + } + .product-item { + margin-left: calc(~"(100% - 4 * 24.439%) / 3"); + padding: 0; + width: 24.439%; + &:nth-child(4n+1) { + margin-left: 0; + } + } } } } diff --git a/app/design/frontend/Magento/blank/etc/view.xml b/app/design/frontend/Magento/blank/etc/view.xml index bdb30144699031fe72d05d500f822ea471a6924c..2e036c02197d60d641a6e95abd718723c9e84b67 100644 --- a/app/design/frontend/Magento/blank/etc/view.xml +++ b/app/design/frontend/Magento/blank/etc/view.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Catalog/etc/view.xsd"> +<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/view.xsd"> <media> <images module="Magento_Catalog"> <image id="bundled_product_customization_page" type="thumbnail"> diff --git a/app/design/frontend/Magento/blank/etc/view.xsd b/app/design/frontend/Magento/blank/etc/view.xsd deleted file mode 100644 index a695016f03565dc6ecf2f654c57d6c44c7eae906..0000000000000000000000000000000000000000 --- a/app/design/frontend/Magento/blank/etc/view.xsd +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> - <xs:redefine schemaLocation="urn:magento:framework:Config/etc/view.xsd"> - <xs:complexType name="mediaType" mixed="true"> - <xs:complexContent> - <xs:extension base="mediaType"> - <xs:sequence> - <xs:element name="images" type="imageType" minOccurs="0"/> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:redefine> - - <xs:complexType name="imageType"> - <xs:sequence> - <xs:element name="image" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="width" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="height" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="constrain" type="xs:boolean" minOccurs="0"/> - <xs:element name="aspect_ratio" type="xs:boolean" minOccurs="0"/> - <xs:element name="frame" type="xs:boolean" minOccurs="0"/> - <xs:element name="transparency" type="xs:boolean" minOccurs="0"/> - <xs:element name="background" minOccurs="0"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:pattern value="\[(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\]"/> - </xs:restriction> - </xs:simpleType> - </xs:element> - </xs:sequence> - <xs:attribute name="id" type="xs:string" use="required"/> - <xs:attribute name="type"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="thumbnail"/> - <xs:enumeration value="small_image"/> - <xs:enumeration value="image"/> - <xs:enumeration value="swatch_image"/> - <xs:enumeration value="swatch_thumb"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="module" type="xs:string" use="required"/> - </xs:complexType> -</xs:schema> diff --git a/app/design/frontend/Magento/blank/web/css/source/_navigation.less b/app/design/frontend/Magento/blank/web/css/source/_navigation.less index 4e4b410c5f6e28d62b5619792c739f760976103f..f4fee4d5d7d4e92f7c16e69eb4c83c469f7b58b6 100644 --- a/app/design/frontend/Magento/blank/web/css/source/_navigation.less +++ b/app/design/frontend/Magento/blank/web/css/source/_navigation.less @@ -86,7 +86,7 @@ font-size: 1.6rem; font-weight: 700; margin: 0; - padding: 8px 20px; + padding: .8rem 3.5rem .8rem 2rem; .label { display: block; margin-bottom: @indent__xs; @@ -125,16 +125,17 @@ .header.links { .lib-list-reset-styles(); + border-bottom: 1px solid @color-gray82; li { - border-top: 1px solid @color-gray82; font-size: 1.6rem; margin: 0; &.greet.welcome { + border-top: 1px solid @color-gray82; font-weight: 700; - padding: 8px 20px; + padding: .8rem @indent__base; } - &:last-child { - border-bottom: 1px solid @color-gray82; + > a { + border-top: 1px solid @color-gray82; } } a, @@ -143,7 +144,10 @@ .lib-css(text-decoration, @navigation-level0-item__text-decoration); display: block; font-weight: 700; - padding: 8px 20px; + padding: .8rem @indent__base; + } + .header.links { + border: 0; } } } @@ -217,6 +221,11 @@ background: transparent; border-bottom: 0; } + .nav-sections-item-switch { + &:hover { + text-decoration: none; + } + } } &-item-content { diff --git a/app/design/frontend/Magento/luma/Magento_AdvancedCheckout/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_AdvancedCheckout/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..c7df4ba9874a6683bf4ee69e274f9fdfde2301fc --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_AdvancedCheckout/web/css/source/_module.less @@ -0,0 +1,165 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .column { + .block-addbysku { + .fieldset { + margin: 0; + .fields { + position: relative; + .field { + display: inline-block; + margin-bottom: @indent__s; + vertical-align: top; + } + .actions-toolbar { + position: absolute; + right: 0; + top: 7px; + } + } + } + .sku { + &:extend(.abs-add-box-sizing all); + margin-right: -155px; + padding-right: 160px; + width: 100%; + } + .qty { + .qty { + &:extend(.abs-input-qty all); + + .mage-error { + width: 80px; + } + } + } + .block-content { + &:extend(.abs-add-clearfix-desktop all); + .box { + &:extend(.abs-blocks-2columns all); + } + .actions-toolbar { + clear: both; + .lib-actions-toolbar( + @_actions-toolbar-actions-position: left, + @_actions-toolbar-margin: 0 0 @indent__base + ); + .lib-actions-toolbar-clear-floats(); + > .secondary { + text-align: left; + } + } + } + .action { + &.add { + .lib-button-icon( + @_icon-font-content: @icon-expand, + @_icon-font-text-hide: true, + @_icon-font-size: 20px + ); + line-height: normal; + padding: 4px; + width: auto; + } + } + .reset { + margin: 7px 0; + } + .note { + display: block; + margin: 0 0 @indent__base; + padding-top: @indent__s; + } + } + } + + .block-cart-failed { + margin: @indent__xl 0; + &:extend(.abs-shopping-cart-items all); + .block-title { + .lib-font-size(@h2__font-size); + strong { + font-weight: @h2__font-weight; + } + } + .actions.secondary { + text-align: center; + .action { + display: block; + margin: 0 auto @indent__s; + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .column { + .block-addbysku { + .sku { + margin-right: -85px; + padding-right: 90px; + } + .action { + &.remove { + .lib-button-icon( + @_icon-font-content: @icon-trash, + @_icon-font-text-hide: true, + @_icon-font-size: 18px, + @_icon-font-color: @minicart-icons-color + ); + .lib-button-reset(); + } + } + } + } +} + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .block-cart-failed { + .block-title { + margin: 0 @indent__base @indent__base; + } + } +} + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { + .column { + .block-addbysku { + .action { + &.remove { + .lib-button-reset(); + .lib-button-as-link(); + margin-top: 4px; + } + } + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .block-cart-failed { + &:extend(.abs-shopping-cart-items-desktop all); + .actions.secondary { + text-align: right; + .action { + display: inline-block; + margin: 0 0 0 @indent__s; + } + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_AdvancedCheckout/web/css/source/_widgets.less b/app/design/frontend/Magento/luma/Magento_AdvancedCheckout/web/css/source/_widgets.less new file mode 100644 index 0000000000000000000000000000000000000000..bd1d1bf824899e05ad5b2072d4f8bd50bcefe4f9 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_AdvancedCheckout/web/css/source/_widgets.less @@ -0,0 +1,89 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .sidebar { + .block-addbysku { + .fieldset { + margin: 0; + .fields { + position: relative; + .field { + display: inline-block; + margin-bottom: @indent__s; + vertical-align: top; + &.sku { + &:extend(.abs-add-box-sizing all); + margin-right: -85px; + padding-right: 90px; + width: 100%; + } + &.qty { + .qty { + &:extend(.abs-input-qty all); + + .mage-error { + width: 80px; + } + } + } + } + .actions-toolbar { + position: absolute; + top: 7px; + right: 0; + } + } + } + .form-addbysku { + .actions-toolbar { + margin-bottom: @indent__base; + .primary { + text-align: left; + .action { + width: auto; + } + } + .secondary { + float: none; + text-align: left; + } + } + } + .action { + &.add { + .lib-button-icon( + @_icon-font-content: @icon-expand, + @_icon-font-text-hide: true, + @_icon-font-size: 18px + ); + line-height: normal; + padding: 4px; + width: auto; + } + &.links { + display: inline-block; + margin: @indent__base 0 0; + } + &.reset { + display: block; + margin: @indent__s 0; + } + &.remove { + .lib-button-icon( + @_icon-font-content: @icon-remove, + @_icon-font-text-hide: true, + @_icon-font-size: 12px, + @_icon-font-color: @color-gray60 + ); + .lib-button-reset(); + } + } + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less index e322d35fe9c551acf327f97a514cceed78982447..555101ccdbd5ce14e784b65290f7414aee7eee67 100644 --- a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less @@ -579,9 +579,12 @@ .product-info-main { float: right; } + .product.media { float: left; + margin-bottom: @indent__m; } + .page-layout-1column { .product-info-main { width: 40%; @@ -590,6 +593,7 @@ width: 57%; } } + .page-layout-2columns-left, .page-layout-2columns-right, .page-layout-3columns { diff --git a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less index 3eefdcaa2b74c24112ef02e551053460e08360b8..bb25b47c668dac3073a63b97dd78561e3565d097 100644 --- a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less +++ b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less @@ -11,114 +11,117 @@ @pager__font-weight: @font-weight__bold; // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { - -.page-products .columns { - position: relative; - z-index: 1; - padding-top: 60px; -} - -.toolbar { - select { - .lib-css(background-color, @toolbar-element-background); - border-radius: 3px; - .lib-css(box-shadow, @button__shadow); + .page-products { + .columns { + padding-top: 60px; + position: relative; + z-index: 1; + } } - text-align: center; - &:extend(.abs-add-clearfix all); - &-amount { - position: absolute; - left: 0; - top: 0; - line-height: @toolbar-mode-icon-font-size+2; - padding: 7px 0; - margin: 0; - vertical-align: middle; - text-align: left; - .products.wrapper ~ .toolbar & { - display: none; + .toolbar { + &:extend(.abs-add-clearfix all); + margin-bottom: @indent__l; + text-align: center; + + select { + .lib-css(background-color, @toolbar-element-background); + .lib-css(box-shadow, @button__shadow); + border-radius: 3px; } - } - .page-with-filter & { + &-amount { - position: static; + left: 0; + line-height: @toolbar-mode-icon-font-size+2; + margin: 0; + padding: 7px 0; + position: absolute; + text-align: left; + top: 0; + vertical-align: middle; + .products.wrapper ~ .toolbar & { + display: none; + } } - } - margin-bottom: @indent__l; - &-products { - .lib-css(background-color, @toolbar-background); - .pages { - display: none; - .products.wrapper ~ & { - display: block; + + .page-with-filter & { + &-amount { + position: static; } } - } - .pages { - margin-bottom: @indent__m; - } -} -.sorter { - float: right; - .page-products & { - position: absolute; - z-index: 1; - top: 0; - right: @indent__s; - } - .products.wrapper ~ .toolbar & { - display: none; - } - &-options { - margin: 0 @indent__xs 0 7px; - width: auto; + &-products { + .lib-css(background-color, @toolbar-background); + .pages { + display: none; + .products.wrapper ~ & { + display: block; + } + } + } + .pages { + margin-bottom: @indent__m; + } } - &-action { - .lib-icon-font( + + .sorter { + float: right; + .page-products & { + position: absolute; + right: @indent__s; + top: 0; + z-index: 1; + } + .products.wrapper ~ .toolbar & { + display: none; + } + &-options { + margin: 0 @indent__xs 0 7px; + width: auto; + } + &-action { + .lib-icon-font( @icon-arrow-up, @_icon-font-size: 16px, @_icon-font-color: @header-icons-color, @_icon-font-color-hover: @header-icons-color-hover - ); - .lib-icon-text-hide(); - &.sort-desc:before { - content: @icon-arrow-down; + ); + .lib-icon-text-hide(); + &.sort-desc:before { + content: @icon-arrow-down; + } } } -} -.modes { - display: none; -} - -.limiter { - display: none; - &-options { - width: auto; - margin: 0 5px 0 7px; - } - &-label { - font-weight: 400; - } - .page-products .toolbar & { + .modes { display: none; } - .control { - display: inline-block; - } -} + .limiter { + display: none; + &-options { + margin: 0 5px 0 7px; + width: auto; + } + &-label { + font-weight: 400; + } + .page-products .toolbar & { + display: none; + } + .control { + display: inline-block; + } + } } // -// Mobile -//-------------------------------------- +// Desctop +// _____________________________________________ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .toolbar-products { @@ -127,26 +130,31 @@ } .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { - .page-products .columns { - position: relative; - z-index: 1; - padding-top: 0; + .page-products { + .columns { + padding-top: 0; + position: relative; + z-index: 1; + } } + .toolbar { &-amount { - position: static; display: block; float: left; + position: static; } .products.wrapper ~ & .pages { float: left; margin-bottom: 0; } } + .modes { - float: left; display: inline-block; + float: left; margin-right: @indent__base; + .products.wrapper ~ .toolbar & { display: none; } @@ -156,22 +164,23 @@ } &-mode { - float: left; + .lib-css(background-color, @toolbar-element-background); + .lib-css(box-shadow, @button__shadow); + .lib-css(color, @text__color__muted); border: 1px solid @border-color__base; + border-right: 0; + float: left; font-weight: @font-weight__regular; - .lib-css(color, @text__color__muted); - text-align: center; - padding: 7px 10px; line-height: 1; - border-right: 0; - .lib-css(background-color, @toolbar-element-background); - .lib-css(box-shadow, @button__shadow); + padding: 7px 10px; + text-align: center; + .modes-label + & { border-radius: 3px 0 0 3px; } &:hover { - background: darken(@toolbar-element-background, 2%); .lib-css(color, @text__color__muted); + background: darken(@toolbar-element-background, 2%); } &:last-child { border-radius: 0 3px 3px 0; @@ -182,21 +191,29 @@ background: darken(@toolbar-element-background, 7%); color: @color-gray62; } + .lib-icon-font( - @icon-grid, - @_icon-font-size: @toolbar-mode-icon-font-size, - @_icon-font-text-hide: true + @icon-grid, + @_icon-font-size: @toolbar-mode-icon-font-size, + @_icon-font-text-hide: true, + @_icon-font-color: @text__color__muted, + @_icon-font-color-hover: @text__color__muted ); } } + .sorter { .page-products & { position: static; } } - .mode-list:before { - content: @icon-list; + + .mode-list { + &:before { + content: @icon-list; + } } + .limiter { float: right; .products.wrapper ~ .toolbar & { diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_minicart.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_minicart.less index e4a039fac1df3d756dfe28b7e4df43f39aadc96c..10a28b07bdd6b3249982da6ea3e8a500d3a3329a 100644 --- a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_minicart.less +++ b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_minicart.less @@ -12,7 +12,6 @@ @minicart-qty__height: 24px; - // // Common // _____________________________________________ @@ -52,9 +51,9 @@ display: none; &.empty { display: block; + font-size: 14px; padding: @indent__l 0 @indent__base; text-align: center; - font-size: 14px; } } .text { @@ -95,18 +94,18 @@ .minicart-wrapper { .lib-dropdown( - @_toggle-selector: ~".action.showcart", - @_options-selector: ~".block-minicart", - @_dropdown-toggle-icon-content: @icon-cart, - @_dropdown-toggle-active-icon-content: @icon-cart, - @_dropdown-list-item-padding: false, - @_dropdown-list-item-hover: false, - @_icon-font-position: before, - @_icon-font-size: 22px, - @_icon-font-line-height: 28px, - @_icon-font-color: @minicart-icons-color, - @_icon-font-color-hover: @minicart-icons-color-hover, - @_icon-font-color-active: @minicart-icons-color + @_toggle-selector: ~".action.showcart", + @_options-selector: ~".block-minicart", + @_dropdown-toggle-icon-content: @icon-cart, + @_dropdown-toggle-active-icon-content: @icon-cart, + @_dropdown-list-item-padding: false, + @_dropdown-list-item-hover: false, + @_icon-font-position: before, + @_icon-font-size: 22px, + @_icon-font-line-height: 28px, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @minicart-icons-color-hover, + @_icon-font-color-active: @minicart-icons-color ); float: right; .block-minicart { @@ -140,11 +139,11 @@ } .action { &.close { - width: 40px; height: 40px; - top: 0; - right: 0; position: absolute; + right: 0; + top: 0; + width: 40px; .lib-button-reset(); .lib-button-icon( @icon-remove, @@ -155,10 +154,10 @@ ); } &.showcart { + white-space: nowrap; .text { &:extend(.abs-visually-hidden all); } - white-space: nowrap; .counter.qty { .lib-css(background, @active__color); .lib-css(color, @page__background-color); @@ -203,10 +202,10 @@ .minicart-items { .lib-list-reset-styles(); .product-item { + padding: @indent__base 0; &:not(:first-child) { .lib-css(border-top, 1px solid @minicart__border-color); } - padding: @indent__base 0; &:first-child { padding-top: 0; } @@ -260,9 +259,9 @@ .toggle { &:extend(.abs-toggling-title all); &:after { - position: static; - margin: 0 0 0 @indent__xs; .lib-css(color, @color-gray56); + margin: 0 0 0 @indent__xs; + position: static; } border: 0; padding: 0 @indent__xl @indent__xs 0; @@ -281,12 +280,12 @@ &.options { .tooltip.toggle { .lib-icon-font( - @icon-down, - @_icon-font-size: 12px, - @_icon-font-line-height: 12px, - @_icon-font-text-hide: true, - @_icon-font-margin: -3px 0 0 7px, - @_icon-font-position: after + @icon-down, + @_icon-font-size: 12px, + @_icon-font-line-height: 12px, + @_icon-font-text-hide: true, + @_icon-font-margin: -3px 0 0 7px, + @_icon-font-position: after ); } .details { @@ -301,38 +300,37 @@ } } .item-qty { - width: 40px; - text-align: center; margin-right: @indent__s; + text-align: center; + width: 40px; } .update-cart-item { - vertical-align: top; .lib-font-size(11); + vertical-align: top; + } + .subtitle { + display: none; } .action { &.edit, &.delete { .lib-icon-font( - @icon-edit, - @_icon-font-size: 18px, - @_icon-font-line-height: 20px, - @_icon-font-text-hide: true, - @_icon-font-color: @minicart-icons-color, - @_icon-font-color-hover: @primary__color, - @_icon-font-color-active: @minicart-icons-color + @icon-edit, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color ); } &.delete { .lib-icon-font-symbol( - @_icon-font-content: @icon-trash + @_icon-font-content: @icon-trash ); } } - .subtitle { - display: none; - } } - } // @@ -351,7 +349,6 @@ } } - // // Desktop // _____________________________________________ diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payment-options.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payment-options.less new file mode 100644 index 0000000000000000000000000000000000000000..555098fcefb113aa8c98fa535c37ac960278abe2 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payment-options.less @@ -0,0 +1,203 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Variables +// _____________________________________________ + +@checkout-payment-option-title__border: @checkout-payment-method-title__border; +@checkout-payment-option-title__color: @link__color; +@checkout-payment-option-title__padding: @checkout-payment-method-title__padding; +@checkout-payment-option-title-mobile__padding: @checkout-payment-method-title-mobile__padding; + +@checkout-payment-option-title-icon__font-size: 32px; +@checkout-payment-option-title-icon__line-height: 16px; +@checkout-payment-option-title-icon__margin: 0; +@checkout-payment-option-title-icon__color: @minicart-icons-color; +@checkout-payment-option-title-icon__hover__color: @primary__color; + +@checkout-payment-option-content__padding__xl: @checkout-payment-method-content__padding__xl; + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .checkout-payment-method { + .payment-option { + &._active { + .payment-option-title { + .action-toggle { + &:after { + content: @icon-up; + } + } + } + } + &._collapsible { + .payment-option-title { + cursor: pointer; + } + .payment-option-content { + display: none; + } + } + } + + .payment-option-title { + .lib-css(border-top, @checkout-payment-option-title__border); + .lib-css(padding, @checkout-payment-option-title__padding 0); + + .action-toggle { + .lib-css(color, @checkout-payment-option-title__color); + .lib-icon-font( + @icon-down, + @_icon-font-size: @checkout-payment-option-title-icon__font-size, + @_icon-font-line-height: @checkout-payment-option-title-icon__line-height, + @_icon-font-color: @checkout-payment-option-title-icon__color, + @_icon-font-color-hover: @checkout-payment-option-title-icon__hover__color, + @_icon-font-color-active: @checkout-payment-option-title-icon__color, + @_icon-font-margin: @checkout-payment-option-title-icon__margin, + @_icon-font-position: after + ); + } + } + + .payment-option-content { + .lib-css(padding, 0 0 @indent__base @checkout-payment-option-content__padding__xl); + } + + .payment-option-inner { + margin: 0 0 @indent__base; + } + + .credit-card-types { + padding: 0; + .item { + display: inline-block; + list-style: none; + margin: 0 @indent__xs 0 0; + vertical-align: top; + &._active { + font-weight: @font-weight__bold; + img { + -webkit-filter: grayscale(0%); + filter: grayscale(0%); + filter: none; + } + } + &._inactive { + opacity: 0.4; + filter: alpha(opacity=40); + } + span { + display: inline-block; + padding-top: 6px; + vertical-align: top; + } + } + img { + -webkit-filter: grayscale(100%); // For Webkit browsers + -webkit-transition: all .6s ease; // Fade to color for Chrome and Safari + filter: grayscale(100%); + filter: gray; // For IE 6 - 9 + } + } + + .ccard { + .legend { + &:extend(.abs-visually-hidden all); + } + .fields { + > .year { + padding-left: @indent__xs; + } + .select { + padding-left: @indent__xs; + padding-right: @indent__xs; + } + } + .month { + .select { + width: 140px; + } + } + .year { + .select { + width: 80px; + } + } + .number { + .input-text { + width: 225px; + } + } + + > .field.cvv { + > .control { + display: inline-block; + padding-right: @indent__base; + } + } + .cvv { + .label { + display: block; + } + .input-text { + width: 55px; + } + } + + &.fieldset { + > .field { + .fields.group.group-2 { + .field { + width: auto !important; + } + } + } + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .checkout-payment-method { + .payment-option { + .lib-css(margin, 0 -(@checkout-payment-option-title-mobile__padding)); + + .payment-option-title { + .lib-css(padding, @checkout-payment-option-title-mobile__padding) + } + + .payment-option-content { + .lib-css(padding, 0 @checkout-payment-option-title-mobile__padding @indent__base); + } + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .checkout-payment-method { + .payment-option-title { + .lib-css(padding-left, @checkout-payment-option-content__padding__xl); + } + .payment-option-content { + .payment-option-inner { + + .actions-toolbar { + margin-left: 0; + } + } + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less index c0f1168e6ef0f0a2513ed747ed59cebf21d85fe4..0940e6e4723609fa1da4a64f6fa315bca9999472 100644 --- a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less +++ b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less @@ -76,13 +76,6 @@ margin: 0 0 @indent__base; } } - .field { - &.cvv { - .control { - width: 40%; - } - } - } } .field-select-billing, @@ -136,14 +129,6 @@ .no-payments-block { margin: @indent__base 0; } - .ccard { - .legend { - &:extend(.abs-visually-hidden all); - } - .year { - padding-left: @indent__l; - } - } .payments { .legend { &:extend(.abs-visually-hidden all); diff --git a/app/design/frontend/Magento/luma/Magento_CustomerBalance/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_CustomerBalance/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..93feda14b8394ce73f0cd876c869db6af722ebd5 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_CustomerBalance/web/css/source/_module.less @@ -0,0 +1,56 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.block-balance { + .balance-price-label { + &:extend(.abs-visually-hidden all); + } + .price { + .lib-font-size(32); + line-height: 32px; + display: inline-block; + .lib-css(margin-top, -@indent__s); + } +} + +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .storecredit { + .block { + &:extend(.abs-blocks-2columns all); + } + .block-balance-history { + width: 100%; + } + } + .table-balance-history { + .col { + width: 25%; + } + } + .table-wrapper.balance-history { + &:extend(.abs-account-table-margin-desktop all); + } +} + +// +// Mobile +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .table-wrapper.balance-history { + &:extend(.abs-account-table-margin-mobile all); + &:extend(.abs-no-border-top all); + } +} diff --git a/app/design/frontend/Magento/luma/Magento_GiftCard/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_GiftCard/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..48be33cd9642f8fadc00cb143873303ecf3978e1 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_GiftCard/web/css/source/_module.less @@ -0,0 +1,141 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + + .page-product-giftcard { + .giftcard-amount { + text-align: left; + margin-bottom: 0; + clear: both; + border-top: 1px @color-gray-light5 solid; + padding-top: 15px; + .field:last-child { + padding-bottom: @form-field__vertical-indent !important; + } + } + .product-info-main { + .price-box { + .old-price { + font-size: 20px; + } + .price-container.price-final_price { + > span { + display: block; + margin-bottom: @indent__xs; + &:last-child { + margin-bottom: 0; + } + } + .price { + font-size: 22px; + line-height: 22px; + font-weight: @font-weight__semibold; + } + } + & + .giftcard.form { + border-top: 1px @color-gray-light5 solid; + padding-top: 15px; + } + } + } + .product-info-stock-sku { + display: block; + } + .product-add-form { + clear: none; + border: 0; + padding-top: 0; + .product-options-wrapper .field:not(.text) { + margin-top: @form-field__vertical-indent; + margin-bottom: @form-field__vertical-indent; + } + } + .giftcard.form { + clear: both; + } + .price-box { + margin-bottom: 10px; + } + .product-info-price { + float: right; + width: auto; + display: block; + white-space: nowrap; + border: 0; + } + .fieldset.giftcard { + >.legend { + &:extend(.abs-visually-hidden all); + } + >.legend + br { + &:extend(.abs-no-display all); + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .cart-discount { + .giftcard .content { + padding-bottom: 35px; + } + .actions-toolbar { + .secondary { + bottom: 17px; + } + } + } + .field.open-amount { + width: 100%; + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .page-product-giftcard { + .product-info-main { + .price-box { + .price-container.price-final_price { + font-size: @font-size__xl; + .price { + font-size: 36px; + line-height: 36px; + } + } + } + } + .product-add-form { + .field:not(.text) { + .lib-form-field( + @_type: block, + @_column: true + ); + &:nth-child(odd) { + padding-right: 25px; + } + &:nth-child(even) { + padding-right: 0; + } + } + .product-options-wrapper { + .field:not(.date) > .control { + width: auto; + } + } + } + } +} diff --git a/app/code/Magento/LayeredNavigation/view/frontend/layout/1column.xml b/app/design/frontend/Magento/luma/Magento_GiftCardAccount/layout/checkout_cart_index.xml similarity index 62% rename from app/code/Magento/LayeredNavigation/view/frontend/layout/1column.xml rename to app/design/frontend/Magento/luma/Magento_GiftCardAccount/layout/checkout_cart_index.xml index 4d0318516508c3d23b6eea467edf8f855f3352c3..79d15de6b671a76a96ed9c28aff20a560eddcbec 100644 --- a/app/code/Magento/LayeredNavigation/view/frontend/layout/1column.xml +++ b/app/design/frontend/Magento/luma/Magento_GiftCardAccount/layout/checkout_cart_index.xml @@ -5,8 +5,8 @@ * See COPYING.txt for license details. */ --> -<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="All One-Column Layout Pages" design_abstraction="page_layout"> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> - <move element="catalog.leftnav" destination="content.top" after="-"/> + <move element="checkout.cart.giftcardaccount" destination="cart.discount" after="-"/> </body> </page> diff --git a/app/design/frontend/Magento/luma/Magento_GiftCardAccount/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_GiftCardAccount/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..b1c67cd2c6801417e3f79d2325bd240f9bd778f0 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_GiftCardAccount/web/css/source/_module.less @@ -0,0 +1,58 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .giftcard-account { + .please-wait { + display: none; + } + .form-giftcard-redeem { + .giftcard.info { + margin-bottom: @indent__l; + } + .fieldset { + &:extend(.abs-forms-margin-small all); + } + } + } + + .opc-wrapper { + .form-giftcard-account { + max-width: 500px; + .field { + margin: 0 0 @indent__base; + .label { + &:extend(.abs-visually-hidden all); + } + } + } + .giftcard-account-info { + margin: 0 0 @indent__base; + + .giftcard-account-number { + margin: 0 0 @indent__s; + } + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .form-giftcard-redeem { + &:extend(.abs-forms-general-desktop all); + } + .block-balance-giftcard { + .block-content { + &:extend(.abs-account-block-font-size all); + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_GiftRegistry/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_GiftRegistry/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..eb1e4d0d92d5b5d2a952a4986fcbe37184a3f294 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_GiftRegistry/web/css/source/_module.less @@ -0,0 +1,364 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .form-giftregistry-share, + .form-giftregistry-edit { + &:extend(.abs-add-fields all); + .actions-toolbar:not(:last-child) { + margin-bottom: @indent__xl; + } + .fieldset { + .nested { + .field:not(.choice) { + .control { + width: 100%; + } + } + } + } + } + + .form.giftregistry.items { + .actions-toolbar { + &:extend(.abs-reset-left-margin all); + } + } + + .giftregisty-dropdown { + &:extend(.abs-dropdown-simple all); + .action.toggle { + .lib-css(color, @link__color); + } + } + + .table-giftregistry-items { + .field.qty .qty { + &:extend(.abs-input-qty all); + } + .product-image { + .lib-css(margin-right, @indent__s); + float: left; + } + } + + .form.giftregistry .fieldset { + .cart-summary & { + margin: 15px 0 @indent__xs; + text-align: left; + .field { + margin: 0 0 @indent__s; + .control { + float: none; + width: auto; + } + } + .action.primary { + &:extend(.abs-revert-to-action-secondary all); + } + } + } + + .form-giftregistry-create { + .fieldset { + &:extend(.abs-forms-margin-small all); + } + } + + .form-giftregistry-edit { + .giftregistry-type { + .lib-css(margin-bottom, @indent__l); + .lib-css(margin-top, -@indent__m); + } + .field.date { + &:extend(.abs-field-date all); + } + } + + .form-giftregistry-search { + margin-bottom: @indent__l*2; + .legend { + &:extend(.abs-account-title all); + } + .fields-specific-options { + .field { + &:nth-last-of-type(1) { + margin-bottom: 0; + } + } + .datetime-picker { + &:extend(.abs-field-date-input all); + } + } + } + + .block-giftregistry-results { + .block-title { + &:extend(.abs-account-title all); + } + .data.table { + &:extend(.abs-table-striped all); + } + } + + .block-giftregistry { + .actions-toolbar { + margin: 17px 0 0; + } + } + + .block-giftregistry-shared { + .item-options { + .item-value { + margin: 0 0 @indent__m; + } + } + } + + .block-giftregistry-shared-items { + .block-title { + &:extend(.abs-account-title all); + } + .product-image-wrapper { + &:extend(.abs-reset-image-wrapper all); + } + .item { + .col { + border: 0; + } + } + th { + border-bottom: @border-width__base solid @border-color__base; + } + .col { + padding: @cart-item-cell-padding-top 11px 10px; + .price-box { + display: inline-block; + } + .price-wrapper { + .lib-font-size(18); + display: block; + font-weight: @font-weight__bold; + white-space: nowrap; + } + } + + .qty { + .qty { + &:extend(.abs-input-qty all); + } + } + + .product { + .item-options { + &:extend(.abs-product-options-list all); + &:extend(.abs-add-clearfix all); + margin: 0; + } + &-item-photo { + display: block; + max-width: 65px; + padding: @indent__s 0; + } + &-item-name { + .lib-font-size(18); + display: block; + margin: 0 0 @indent__xs; + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .account { + .table-giftregistry { + .col.actions { + &:extend(.abs-col-no-prefix all); + } + } + } + .table-giftregistry-items { + .col.product { + &:before { + &:extend(.abs-visually-hidden-mobile all); + } + &:extend(.abs-add-clearfix-mobile all); + } + .field.choice, + .field.qty { + display: inline-block; + } + } + .form-giftregistry-search { + .fieldset { + margin-bottom: @indent__base; + } + } + .block-giftregistry-results { + .block-title { + margin-bottom: 0; + } + .table-wrapper { + border-top: none; + } + } + .block-giftregistry-shared-items { + .block-title { + margin-bottom: @indent__s; + } + .table-wrapper { + border-top: 0; + } + } +} + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + // Shopping cart link + .cart.table-wrapper { + .action-giftregistry { + .lib-icon-font( + @icon-gift-registry, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .form-giftregistry-share, + .form-giftregistry-edit { + &:extend(.abs-add-fields-desktop all); + &:extend(.abs-form-field-column-2 all); + .fieldset .field { + width: 45%; + } + } + .form-giftregistry-edit { + .fieldset.shipping_address { + .fieldset { + margin-top: @form-field__vertical-indent; + } + } + } + .form-giftregistry-create { + &:extend(.abs-forms-general-desktop all); + } + .table-giftregistry { + .col.create { + white-space: nowrap; + } + .col.message { + width: 40%; + } + .col.actions { + width: 30%; + } + } + .table-giftregistry-items { + .col.note { + width: 30%; + } + .account .data.table& { + .lib-table-bordered( + @_table_type: horizontal + ); + th { + border-bottom: 0; + } + > tbody > tr:nth-child(even) { + > td, + > th { + background: none; + } + } + } + } + .form-giftregistry-search { + .fieldset { + margin-bottom: @form-field__vertical-indent__desktop; + .field { + &.name, + &.lastname { + .lib-form-field-column(@_column: true); + margin-bottom: auto; + } + &.lastname { + padding: 0; + } + } + } + } + + .toolbar-giftregistry-results { + &:extend(.abs-pager-toolbar all); + } + + .block-giftregistry-shared { + .item-options { + &:extend(.abs-product-options-list-desktop all); + &:extend(.abs-add-clearfix-desktop all); + } + } + + .block-giftregistry-shared-items { + .column.main & { + .actions-toolbar { + &:extend(.abs-reset-left-margin-desktop all); + } + } + .item { + border-bottom: @border-width__base solid @border-color__base; + border-top: 0; + } + .product { + &-item-photo { + display: table-cell; + max-width: 100%; + padding: 0 @indent__base 0 0; + vertical-align: top; + width: 1%; + } + &-item-details { + display: table-cell; + vertical-align: top; + width: 99%; + word-break: normal; + } + } + .col { + &.product { + width: 48%; + } + &:not(.product) { + text-align: center; + } + &.price { + padding-top: 17px; + } + } + .input-text { + &.qty { + margin-top: -4px; + } + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_GiftWrapping/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_GiftWrapping/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..e3296daa1bde2b7fbc5909ba07a78d9df5f5eccd --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_GiftWrapping/web/css/source/_module.less @@ -0,0 +1,238 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Variables +// _____________________________________________ + +@gift-wrapping__border-color: @color-gray-light5; +@gift-wrapping__border-width: @border-width__base; + +@gift-wrapping-preview__active__border-color: @color-gray20; +@gift-wrapping-preview__active__border-width: 3px; + +@gift-wrapping-thumbnail__height: 4rem; +@gift-wrapping-thumbnail__width: @gift-wrapping-thumbnail__height; + +@gift-wrapping-no-image__background: @color-gray95; +@gift-wrapping-no-image-icon__color: @color-gray-darken4; +@gift-wrapping-no-image-icon__font-size: 22px; + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .gift-wrapping-info { + .lib-css(font-weight, @font-weight__light); + font-size: @font-size__l; + margin: @indent__base 0; + } + + .gift-wrapping-list { + &:extend(.abs-add-clearfix all); + list-style: none; + margin: @indent__base 0 @indent__s; + padding: 0; + .no-image { + .lib-css(background, @gift-wrapping-no-image__background); + .lib-icon-font( + @icon-present, + @_icon-font-size: @gift-wrapping-no-image-icon__font-size, + @_icon-font-line-height: @gift-wrapping-thumbnail__height, + @_icon-font-color: @gift-wrapping-no-image-icon__color, + @_icon-font-position: after, + @_icon-font-text-hide: true, + @_icon-font-vertical-align: middle + ); + &:after { + display: block; + } + } + } + + .gift-wrapping-preview, + .gift-wrapping-item > span { + cursor: pointer; + display: block; + overflow: hidden; + position: relative; + z-index: 1; + } + + .gift-wrapping-item { + float: left; + margin: 0 @indent__s @indent__s 0; + &:last-child { + margin-right: 0; + } + &._active { + span { + &:before { + .lib-css(border, @gift-wrapping-preview__active__border-width solid @gift-wrapping-preview__active__border-color); + box-sizing: border-box; + content: ''; + display: block; + height: 100%; + position: absolute; + width: 100%; + z-index: 2; + } + } + } + > span { + height: @gift-wrapping-thumbnail__height; + width: @gift-wrapping-thumbnail__width; + } + } + + .gift-wrapping-title { + margin: @indent__s 0; + .action-remove { + &:extend(.abs-action-button-as-link all); + margin: -@indent__xs 0 0 @indent__xs; + .lib-icon-font( + @icon-trash, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); + } + } + + .gift-options-content { + .fieldset { + .field { + margin: @indent__s 0; + } + } + } + + .gift-wrapping-summary { + padding-right: 7rem; + + .gift-wrapping-title { + border: 0; + display: inline-block; + padding: 0; + } + } + + .opc-wrapper { + .fieldset.gift-message .field.gift-wrapping { + padding: 0; + width: 100%; + } + } + + .opc-wrapper .data.table, + .table-order-items { + .gift-wrapping { + margin: @indent__base 0 0; + .title { + float: none; + } + .content { + &:extend(.abs-add-clearfix all); + margin: 0; + > img { + float: left; + margin: 0 @indent__s 0 0; + max-height: 50px; + max-width: 50px; + } + } + } + } + + .gift-summary, + .gift-options { + .price-box { + margin-left: 22px; + } + .regular-price { + &:before { + content: attr(data-label)": "; + } + .price { + font-weight: @font-weight__bold; + } + } + &:extend(.abs-adjustment-incl-excl-tax all); + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .gift-wrapping { + .lib-css(border-bottom, @gift-wrapping__border-width solid @gift-wrapping__border-color); + margin-bottom: @indent__base; + padding-bottom: @indent__s; + } + .gift-wrapping-list { + width: 100%; + } + .gift-wrapping-summary { + + .gift-message-summary { + padding-right: 0; + } + } + .gift-options-cart-item { + float: left; + } + .gift-wrapping-preview { + img { + width: 100%; + } + } + .item-actions { + .actions-toolbar { + .gift-options { + .gift-wrapping, + .gift-message { + display: block; + } + } + } + } +} + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .data.table { + .gift-wrapping { + .nested, + .content { + &:extend(.abs-add-clearfix-desktop all); + } + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .gift-wrapping { + .lib-css(border-right, @gift-wrapping__border-width solid @gift-wrapping__border-color); + box-sizing: border-box; + float: left; + padding-right: @indent__base; + width: 50%; + & + .gift-message { + .lib-css(border-left, @gift-wrapping__border-width solid @gift-wrapping__border-color); + box-sizing: border-box; + float: left; + padding-left: 4.5rem; + width: 50%; + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_GroupedProduct/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_GroupedProduct/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..d5a3c3b559298e415a8bee44d61cc314c4acb9fa --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_GroupedProduct/web/css/source/_module.less @@ -0,0 +1,100 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.table-wrapper.grouped { + width: auto; +} + +.table.grouped { + .row-tier-price { + > td { + border-top: 0; + } + } + .col.item { + width: 90%; + } + .col.qty { + width: 10%; + .control.qty { + .qty { + &:extend(.abs-input-qty all); + } + } + } + .product-item-name { + font-weight: @font-weight__regular; + margin-bottom: @indent__s; + display: inline-block; + } + .price-box { + p { + margin: 0; + } + .price { + font-weight: @font-weight__bold; + } + .old-price { + .price { + font-weight: normal; + } + } + } + .stock.unavailable { + margin: 0; + white-space: nowrap; + text-transform: none; + font-weight: normal; + } + .row-tier-price { + } +} + +.page-product-grouped .product-info-price { + float: right; + display: block; + width: auto; + border: 0; +} + +} + +// +// Mobile +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .table.grouped { + > thead > tr > th { + display: table-cell; + border-bottom: @table__border-width @table__border-style @table__border-color; + } + > tbody { + border-bottom: @table__border-width @table__border-style @table__border-color; + > tr > td { + &:extend(.abs-col-no-prefix all); + border: 0; + display: table-cell; + padding: @table-cell__padding-vertical @table-cell__padding-horizontal; + &:last-child { + border: 0; + } + } + } + } +} + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .table-wrapper.grouped { + margin-left: -@layout__width-xs-indent; + margin-right: -@layout__width-xs-indent; + } +} + diff --git a/app/design/frontend/Magento/luma/Magento_Invitation/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Invitation/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..4aa9812a0634a8de3a1c00c1a3d98efc5891ee58 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_Invitation/web/css/source/_module.less @@ -0,0 +1,75 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.form-add-invitations { + &:extend(.abs-add-fields all); + .fields { + .label { + &:extend(.abs-visually-hidden all); + } + } + .additional, + .field.message { + .lib-css(margin-top, @form-field__vertical-indent); + } + .action { + &.remove { + top: 4px; + } + &.add { + .lib-button-icon( + @_icon-font-content: @icon-expand, + @_icon-font-text-hide: true, + @_icon-font-size: 18px + ); + line-height: normal; + padding: 4px; + width: auto; + } + } +} + +} + +// +// Mobile +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .form-add-invitations { + .action { + &.remove { + .lib-button-icon( + @_icon-font-content: @icon-trash, + @_icon-font-text-hide: true, + @_icon-font-size: 18px, + @_icon-font-color: @minicart-icons-color + ); + } + } + } +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { + .form-add-invitations { + &:extend(.abs-add-fields-desktop all); + } +} + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .table-invitations { + .col { + width: 50%; + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_LayeredNavigation/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_LayeredNavigation/web/css/source/_module.less index 898ddc99afdfa2d23f5d8f7baf12d8d65baec71e..276730fafe6962c624f12c807c58c4e44f59d741 100644 --- a/app/design/frontend/Magento/luma/Magento_LayeredNavigation/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_LayeredNavigation/web/css/source/_module.less @@ -4,238 +4,240 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { + .filter { + &.block { + margin-bottom: 0; + } + &-title { + strong { + @_shadow: inset 0 1px 0 0 @color-white, inset 0 -1px 0 0 fade(@border-color__base, 30); -.filter { - &.block { - margin-bottom: 0; - } - &-title { - strong { - position: absolute; - z-index: 2; - line-height: 16px; - border: 1px solid @border-color__base; - text-align: center; - padding: 7px 10px; - @_shadow: inset 0 1px 0 0 @color-white, inset 0 -1px 0 0 fade(@border-color__base, 30); - .lib-css(background-color, @toolbar-element-background); - .lib-css(box-shadow, @_shadow); - border-radius: 3px; - font-weight: 400; - top: 0; - left: 0; - &[data-count]:after { - content: attr(data-count); - display: inline-block; - border-radius: 2px; - padding: 2px; - font-size: .8em; - margin: 0 5px; - .lib-css(color, @color-white); - min-width: 1em; - line-height: 1; - background: @color-orange-red4; - } - &.disabled { - opacity: .5; + .lib-css(background-color, @toolbar-element-background); + .lib-css(box-shadow, @_shadow); + border-radius: 3px; + border: 1px solid @border-color__base; + font-weight: 400; + left: 0; + line-height: 16px; + padding: 7px @indent__s; + position: absolute; + text-align: center; + top: 0; + z-index: 2; + &[data-count]:after { + .lib-css(color, @color-white); + background: @color-orange-red4; + border-radius: 2px; + content: attr(data-count); + display: inline-block; + font-size: .8em; + line-height: 1; + margin: 0 @indent__xs; + min-width: 1em; + padding: 2px; + } + &.disabled { + opacity: .5; + } } } - } - .block-subtitle { - font-weight: @font-weight__semibold; - padding: @indent__s @indent__s @indent__base; - font-size: @font-size__base; - line-height: 1em; - border-bottom: @border-width__base solid @border-color__base; - } - &-subtitle { - display: none; - } - &-current { - margin: 0; - .items { - padding: @indent__xs @indent__s; + .block-subtitle { + border-bottom: @border-width__base solid @border-color__base; + font-size: @font-size__base; + font-weight: @font-weight__semibold; + line-height: 1em; + padding: @indent__s @indent__s @indent__base; } - .item { - position: relative; - z-index: 1; - padding-left: 17px; + &-subtitle { + display: none; } - .filter &-subtitle { - display: block; - border: none; - padding-bottom: @indent__s; + &-current { + margin: 0; + .items { + padding: @indent__xs @indent__s; + } + .item { + padding-left: 17px; + position: relative; + z-index: 1; + } + .filter &-subtitle { + border: none; + display: block; + padding-bottom: @indent__s; + } + .action.remove { + &:extend(.abs-remove-button-for-blocks all); + left: -2px; + position: absolute; + top: -1px; + } } - .action.remove { - &:extend(.abs-remove-button-for-blocks all); - position: absolute; - left: -2px; - top: -1px; + &-actions { + margin-bottom: @indent__m; + padding: 0 @indent__s; } - } - &-actions { - padding: 0 @indent__s; - margin-bottom: @indent__m; - } - &-label { - font-weight: @font-weight__bold; - &:after { - content: ": "; + &-label { + font-weight: @font-weight__bold; + &:after { + content: ': '; + } } - } - &-value { - .lib-css(color, @filter-quantity); - } - &-options { - display: none; - margin: 0; - &-item { - border-bottom: @border-width__base solid @border-color__base; - padding-bottom: @indent__s; + &-value { + .lib-css(color, @filter-quantity); } - &-title { - cursor: pointer; - font-weight: @font-weight__semibold; + &-options { + display: none; margin: 0; - overflow: hidden; - padding: @indent__s 20px+@indent__s 0 @indent__s; - position: relative; - z-index: 1; - text-transform: uppercase; - - .lib-icon-font( + &-item { + border-bottom: @border-width__base solid @border-color__base; + padding-bottom: @indent__s; + } + &-title { + cursor: pointer; + font-weight: @font-weight__semibold; + margin: 0; + overflow: hidden; + padding: @indent__s 30px+@indent__s 0 @indent__s; + position: relative; + text-transform: uppercase; + word-break: break-all; + z-index: 1; + .lib-icon-font( @_icon-font-content: @icon-down, @_icon-font-size: 13px, @_icon-font-position: after, @_icon-font-display: block - ); - &:after { - position: absolute; - right: 13px; - top: 9px; - } - &:hover { - .lib-css(color, @filter-link-hover); - } - .active > & { - .lib-icon-font-symbol( - @_icon-font-content: @icon-up, - @_icon-font-position: after ); - } - } - &-content { - margin: 0; - padding: @indent__s; - .item { - margin: @indent__s 0; - line-height: 1.5em; - } - a { - .lib-css(color, @filter-link); - margin-right: -5px; - padding-left: 5px; - margin-left: -5px; - padding-right: 7px; + + &:after { + position: absolute; + right: 13px; + top: 9px; + } &:hover { - background-color: @color-gray91; - text-decoration: none; - & + .count { + .lib-css(color, @filter-link-hover); + } + .active > & { + .lib-icon-font-symbol( + @_icon-font-content: @icon-up, + @_icon-font-position: after + ); + } + } + &-content { + margin: 0; + padding: @indent__s; + .item { + margin: @indent__s 0; + line-height: 1.5em; + } + a { + .lib-css(color, @filter-link); + margin-left: -5px; + margin-right: -5px; + padding-left: 5px; + padding-right: 7px; + &:hover { background-color: @color-gray91; + text-decoration: none; + & + .count { + background-color: @color-gray91; + } } } - } - .count { - .lib-css(color, @filter-quantity); - padding-right: 5px; - &:before { - content: "("; + .count { + .lib-css(color, @filter-quantity); + padding-right: 5px; + &:before { + content: '('; + } + &:after { + content: ')'; + } } - &:after { - content: ")"; + .filter-count-label { + &:extend(.abs-visually-hidden all); } } - .filter-count-label { - &:extend(.abs-visually-hidden all); - } } } } -} - // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { - body.filter-active { - .page-wrapper { - visibility: hidden; - height: 0; - margin-top: -999999em; - } - .columns { - z-index: 999; + body { + &.filter-active { + .page-wrapper { + height: 0; + margin-top: -999999em; + visibility: hidden; + } + .columns { + z-index: 999; + } } } .filter { &.active { position: relative; - z-index: 99; visibility: visible; + z-index: 99; .filter-options-item:last-child { margin-bottom: @indent__xl; } .filter-title { + border-bottom: 1px solid @border-color__base; + height: 48px; + left: 0; position: fixed; - top: 0; right: 0; - left: 0; - height: 48px; + top: 0; z-index: 2; - border-bottom: 1px solid @border-color__base; strong { - right: 3px; - left: auto; - top: 10px; - border: 0; - background: none; - .lib-css(box-shadow, none); - color: transparent; - .lib-icon-font( - @icon-remove, - @_icon-font-color: @text__color__muted, - @_icon-font-size: 16px, - @_icon-font-position: after - ); + .lib-css(box-shadow, none); + background: none; + border: 0; + color: transparent; + left: auto; + right: 3px; + top: 10px; + .lib-icon-font( + @icon-remove, + @_icon-font-color: @text__color__muted, + @_icon-font-size: 16px, + @_icon-font-position: after + ); } } .filter-subtitle { + .lib-css(background, @toolbar-background); display: block; + height: 50px; + left: 0; + line-height: 32px; position: fixed; - top: 0; right: 0; - left: 0; - height: 50px; - .lib-css(background, @toolbar-background); + top: 0; z-index: 1; - line-height: 32px; } .filter-options { + .lib-css(background, @color-white); + bottom: 0; display: block; - position: fixed; - top: 50px; left: 0; - right: 0; - bottom: 0; overflow: scroll; - .lib-css(background, @color-white); + position: fixed; + right: 0; + top: 50px; z-index: 10; } } @@ -253,30 +255,17 @@ padding: @indent__xs @indent__s; } } - .filter-no-options { - .filter-title:before { - content: ""; - width: 100px; - height: 40px; - background: rgba(255,255,255,.5); - display: block; - position: relative; - z-index: 99; - margin-top: -40px; - left: -15px; - } - } .filter .filter-current { - margin: @indent__xs -@indent__s 0; border: solid @border-color__base; border-width: 1px 0; + margin: @indent__xs -@indent__s 0; .items { display: none; } &-subtitle { - text-transform: uppercase; position: relative; + text-transform: uppercase; z-index: 1; .lib-icon-font( @_icon-font-content: @icon-down, @@ -291,9 +280,9 @@ } &:after { + .lib-css(color, @text__color__muted); content:' (' attr(data-count) ')'; font-size:.9em; - .lib-css(color, @text__color__muted); } } &.active { @@ -315,6 +304,31 @@ display: none; } } + .filter-no-options { + .filter-title { + &:before { + background: rgba(255,255,255,.5); + content: ''; + display: block; + height: 40px; + left: -15px; + margin-top: -60px; + position: relative; + width: 100px; + z-index: 99; + } + } + .filter-content { + margin-bottom: @indent__base; + } + } + .page-with-filter { + .columns { + .sidebar-main { + .lib-vendor-prefix-order(0); + } + } + } } .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { @@ -336,11 +350,11 @@ } &.active &-options, &-options { + background: transparent; clear: both; - position: static; - overflow: initial; display: block; - background: transparent; + overflow: initial; + position: static; } &-subtitle { position: static; @@ -357,9 +371,9 @@ position: static; } &.page-with-filter .column.main { + padding-top: 45px; position: relative; z-index: 1; - padding-top: 45px; } .filter { &.block { @@ -373,8 +387,8 @@ } &-options { &-item { - display: inline-block; border: 0; + display: inline-block; margin-right: @indent__m; &.active { position: relative; @@ -384,14 +398,14 @@ } &:after, &:before { - content: ""; - display: block; .lib-arrow(up, 8px, @color-black); - position: absolute; - left: 50%; bottom: -1px; + content: ''; + display: block; + left: 50%; + margin-left: -@indent__base; + position: absolute; z-index: 3; - margin-left: -20px; } &:after { .lib-css(border-bottom-color, @color-white); @@ -401,7 +415,7 @@ } } &-title { - padding: 0 20px 0 0; + padding: 0 @indent__base 0 0; &:after { right: 2px; top: 3px; @@ -409,15 +423,16 @@ } } &-content { - position: absolute; - z-index: 2; + @_shadow: 0 3px 5px 0 rgba(50, 50, 50, .75); + .lib-css(background, @color-white); - width: 180px; - top: 100%; + .lib-css(box-shadow, @_shadow, 1); border: 1px solid @border-color__base; padding: @indent__xs 0; - @_shadow: 0 3px 5px 0 rgba(50, 50, 50, .75); - .lib-css(box-shadow, @_shadow, 1); + position: absolute; + top: 100%; + width: 180px; + z-index: 2; .item { padding: @indent__xs; margin:0; @@ -434,13 +449,13 @@ display: inline; line-height: 35px; &-subtitle { - display: inline; - padding: 0; .lib-css(color, @text__color__muted); + display: inline; font-size: @font-size__base; font-weight: normal; + padding: 0; &:after { - content: ":"; + content: ':'; } } .item, diff --git a/app/design/frontend/Magento/luma/Magento_MultipleWishlist/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_MultipleWishlist/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..1bf8d88e34013be115ae4fc0f0548bc0443a4e0e --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_MultipleWishlist/web/css/source/_module.less @@ -0,0 +1,534 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +@desktop-popup-width: 380px; +@desktop-popup-margin-left: -((@desktop-popup-width+(@popup__padding*2))/2); +@desktop-popup-position-left: 50%; +@desktop-popup-position-top: 20%; + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .wishlist { + // Wish list split button + &.split.button { + .lib-dropdown-split( + @_options-selector: ~".items", + @_dropdown-split-button-border-radius-fix: false, + @_dropdown-split-list-item-padding: 5px 5px 5px 23px, + @_dropdown-split-toggle-icon-content: @icon-down, + @_dropdown-split-toggle-active-icon-content: @icon-up, + @_icon-font-size: 12px, + @_icon-font-color: @addto-color, + @_icon-font-color-hover: @addto-hover-color, + @_icon-font-vertical-align: middle, + @_dropdown-split-list-pointer-position: left, + @_dropdown-split-list-min-width: 200px + ); + margin-right: 5%; + vertical-align: middle; + .items { + padding: 6px 0; + } + &:extend(.abs-dropdown-items-new all); + + > .action { + &:extend(.abs-action-button-as-link all); + &.split { + .lib-icon-font-symbol( + @_icon-font-content: @icon-wishlist-full + ); + &:extend(.abs-actions-addto all); + margin-right: 5px; + &:before { + margin: 0; + } + } + &:active, + &:focus, + &:hover { + .lib-css(color, @addto-hover-color); + } + } + > .action.toggle { + &:before { + border-left: 1px solid @addto-color; + content: ''; + float: left; + height: 15px; + margin: 3px 4px 0 0; + } + } + .table-comparison &, + .product-items & { + > .action { + &.split { + span { + &:extend(.abs-visually-hidden all); + } + } + } + } + .product-info-main &, + .block-bundle-summary & { + > .action { + &.split { + } + } + } + .cart.table-wrapper & { + vertical-align: baseline; + > .action { + &.split { + font-weight: normal; + letter-spacing: normal; + text-transform: none; + } + &.toggle { + &:after { + .lib-css(color, @link__color); + } + } + &.split, + &.toggle { + .lib-css(color, @link__color); + &:before { + display: none; + } + } + } + } + } + // Wish list popup + &.window.popup { + .lib-popup(); + &.active { + display: block; + } + } + &.overlay { + .lib-window-overlay(); + &.active { + display: block; + } + } + // Wish list dropdown + &-dropdown { + &:extend(.abs-dropdown-simple all); + &:extend(.abs-dropdown-items-new all); + } + &-dropdown.move, + &-dropdown.copy { + .action.toggle { + .lib-css(color, @link__color); + } + } + } + + .page-multiple-wishlist { + .page-title-wrapper { + .page-title { + &:extend(.abs-visually-hidden all); + } + } + .actions-toolbar { + > .primary { + display: block; + float: none; + text-align: left; + .action.remove { + float: right; + } + } + } + } + + .block-wishlist-management { + position: relative; + .wishlist { + // Select wish list + &-select { + .wishlist-name { + &-label { + font-weight: @font-weight__semibold; + &:extend(.abs-colon all); + } + &-current { + } + } + &-items { + &:extend(.abs-reset-list all); + &.active { + } + } + } + &-add.item { + .action { + } + } + // Wish list name + &-title { + margin-bottom: @indent__s; + strong { + font-weight: @font-weight__light; + margin-right: @indent__s; + } + .action.edit { + } + } + // Wish list info + &-info { + } + &-notice { + .lib-css(color, @text__color__muted); + display: inline-block; + margin-right: @indent__base; + &.private { + .lib-icon-font( + @_icon-font-content: @icon-private, + @_icon-font-color: lighten(@text__color__muted, 15%), + @_icon-font-vertical-align: text-bottom, + @_icon-font-margin: 0 @indent__xs 0 0 + ); + } + } + // Wish list toolbar + &-toolbar { + &-select, + &-actions { + display: inline-block; + } + &-select { + margin-right: @indent__base; + } + &-actions { + } + } + // Wish list toolbar actions + &-dropdown.move { + margin-right: @indent__base; + } + } + } + + .block-wishlist-search-form { + .block-title { + &:extend(.abs-account-title all); + } + .form-wishlist-search { + .lib-css(margin-bottom, @indent__l*2); + max-width: 500px; + .fieldset { + > .legend { + &:extend(.abs-visually-hidden); + } + } + } + } + + .block-wishlist-search-results { + .block-title { + &:extend(.abs-account-title all); + } + .data.table { + &:extend(.abs-table-striped all); + } + .table-wrapper { + border-top: none; + } + } + + .block-wishlist-info-items { + .block-title { + .lib-css(margin-bottom, @indent__base); + .lib-font-size(22px); + > strong { + font-weight: @font-weight__light ; + } + } + .product-item { + width: 100%; + } + .product-item-photo { + margin-left: @indent__base; + } + .product-item-info { + width: auto; + &:hover { + .split { + visibility: visible; + } + } + } + .price-wrapper { + display: block; + margin: 0 0 @indent__s; + } + .split { + clear: both; + padding: @indent__s 0; + visibility: hidden; + } + .wishlist-dropdown { + .change { + .lib-css(color, @link__color); + } + } + .action { + &.towishlist { + padding: @indent__s 0; + } + } + .input-text { + &.qty { + &:extend(.abs-input-qty all); + margin-right: 10px; + } + } + } +} + +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .block-wishlist-management { + clear: both; + margin-top: -21px; + .wishlist { + // Select wish list + &-select { + margin: 0 -@layout__width-xs-indent 20px; + .wishlist-name { + .lib-font-size(16); + &:extend(.abs-toggling-title-mobile all); + &-label { + } + &-current { + } + } + &-items { + border-bottom: @border-width__base solid @border-color__base; + .lib-css(background, @collapsible-nav-background); + display: none; + padding: 15px 0; + &.active { + display: block; + } + .item { + margin: 3px 0 0; + &:first-child { + margin-top: 0; + } + &.current { + display: none; + } + a { + .lib-css(color, @text__color); + display: block; + padding: @indent__xs 18px; + text-decoration: none; + &:hover { + .lib-css(background, @collapsible-nav-item-hover); + } + } + } + } + } + &-add.item { + .add { + &:extend(.abs-icon-add-mobile all); + } + } + // Wish list name + &-title { + strong { + .lib-font-size(26); + } + .action.edit { + } + } + // Wish list info + &-info { + margin-bottom: 15px; + } + &-notice { + &.private { + } + } + // Wish list toolbar + &-toolbar { + &-select, + &-actions { + margin-bottom: 15px; + } + &-select { + } + &-actions { + } + } + // Wish list toolbar actions + &-dropdown.move { + } + } + } + .products-grid.wishlist { + .product { + &-item { + &-checkbox { + left: 20px; + position: absolute; + top: 20px; + } + &-photo { + .page-multiple-wishlist & { + margin-left: @indent__m; + } + } + &-name, + &-description, + .price-box, + &-tooltip { + .page-multiple-wishlist & { + margin-left: 115px; + } + } + } + } + .wishlist-dropdown { + display: none; + } + } +} + +// +// Desktop +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .wishlist { + &.window.popup { + bottom: auto; + .lib-css(top, @desktop-popup-position-top); + .lib-css(left, @desktop-popup-position-left); + .lib-css(margin-left, @desktop-popup-margin-left); + .lib-css(width, @desktop-popup-width); + right: auto; + } + } + + .block-wishlist-management { + &:extend(.abs-add-clearfix-desktop all); + margin-bottom: @indent__base; + .wishlist { + // Select wish list + &-select { + border-bottom: 1px solid @secondary__color; + display: table; + margin-bottom: 15px; + width: 100%; + .wishlist-name { + display: table-cell; + margin-right: @indent__s; + padding: @indent__xs @indent__s @indent__s; + vertical-align: top; + white-space: nowrap; + width: 5%; + span { + } + &.active { + } + &-label { + } + &-current { + } + } + &-items { + display: table-cell; + padding-right: 160px; + vertical-align: top; + &.active { + } + .item { + display: inline-block; + margin-right: @indent__s; + padding: @indent__xs @indent__s @indent__s; + &:last-child { + margin-right: 0; + } + } + .current { + border-bottom: 3px solid @active__color; + font-weight: @font-weight__semibold; + } + } + .wishlist-name-current { + display: none; + } + } + &-add.item { + position: absolute; + right: 0; + top: 0; + } + // Wish list name + &-title { + strong { + .lib-font-size(40); + } + .action.edit { + } + } + // Wish list info + &-info { + float: left; + } + &-notice { + &.private { + } + } + // Wish list toolbar + &-toolbar { + float: right; + &-select, + &-actions { + } + &-select { + } + &-actions { + } + } + // Wish list toolbar actions + &-dropdown.move { + } + } + } + + .block-wishlist-info-items { + .product-item-photo { + margin-left: 0; + } + } + + .products-grid.wishlist { + .product { + &-item { + &-checkbox { + float: left; + + .product-item-name { + margin-left: @indent__m; + } + } + } + } + } + + .toolbar-wishlist-results { + &:extend(.abs-pager-toolbar all); + } +} diff --git a/app/design/frontend/Magento/luma/Magento_Reward/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Reward/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..943689c0b48f6fb3728d36bcd17749cc6a71b639 --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_Reward/web/css/source/_module.less @@ -0,0 +1,48 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.block-reward-info { + .reward-balance { + .lib-font-size(18); + margin-bottom: @indent__m; + } + .reward-rates, + .reward-limit, + .reward-expiring { + &:not(:last-child) { + margin-bottom: @indent__m; + } + .title { + display: inline-block; + margin-bottom: @indent__s; + } + } +} + +} + +// +// Mobile +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .table-wrapper.reward-history { + &:extend(.abs-account-table-margin-mobile all); + } +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .table-wrapper.reward-history { + &:extend(.abs-account-table-margin-desktop all); + } +} diff --git a/app/design/frontend/Magento/luma/Magento_Rma/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Rma/web/css/source/_module.less new file mode 100644 index 0000000000000000000000000000000000000000..45d70d9720a99fbc8a5e649851a914963e98dc1f --- /dev/null +++ b/app/design/frontend/Magento/luma/Magento_Rma/web/css/source/_module.less @@ -0,0 +1,157 @@ +// /** +// * Copyright © 2015 Magento. All rights reserved. +// * See COPYING.txt for license details. +// */ + +// +// Common +//-------------------------------------- + +& when (@media-common = true) { + +.order-details-items.rma { + .order-title { + display: none; + + .toolbar { + display: none; + } + } +} + +.form-create-return { + &:extend(.abs-add-fields all); + .additional { + &:first-child { + margin-top: 0; + } + } + .field.comment { + margin-top: 55px; + } + .actions-toolbar { + &:extend(.abs-add-clearfix all); + } +} + +.return-status { + &:extend(.abs-status all); +} + +.block-returns-comments { + .returns-comments { + dt, + dd { + margin: 0; + } + dt { + font-weight: @font-weight__regular; + } + dd { + margin-bottom: 15px; + &:last-child { + margin-bottom: 0; + } + } + } + .fieldset { + margin-bottom: @indent__base; + } +} + +.magento-rma-returns-returns, +.magento-rma-returns-view { + &:extend(.abs-title-orders all); +} + +// +// Guest return view page +//-------------------------------------- +.magento-rma-guest-returns { + .column.main { + .block:not(.widget) { + &:extend(.abs-account-blocks all); + } + } + &:extend(.abs-title-orders all); +} + +} + +// +// Mobile +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .form-create-return { + .additional { + .field:nth-last-child(2) { + margin-bottom: 0; + } + .field:last-child { + margin-top: @form-field__vertical-indent; + } + } + } + .magento-rma-returns-returns, + .magento-rma-returns-view { + &:extend(.abs-title-orders-mobile all); + } + .account { + .column.main { + .returns-details-items { + .block-returns-tracking { + .block-title { + > .action.track { + float: none; + display: block; + margin: @indent__s 0 0; + } + } + } + } + } + } + .table-wrapper.table-returns { + &:extend(.abs-no-border-top all); + } +} + +// +// Desktop +//-------------------------------------- +.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { + .form-create-return { + &:extend(.abs-add-fields-desktop all); + &:extend(.abs-form-field-column-2 all); + .fieldset .field { + width: 45%; + } + } + .return-status { + &:extend(.abs-status-desktop all); + } + .magento-rma-returns-returns, + .magento-rma-returns-view { + &:extend(.abs-title-orders-desktop all); + } + .magento-rma-guest-returns { + .column.main .block.block-order-details-view { + &:extend(.abs-add-clearfix-desktop all); + .block-content:not(.widget) .box { + &:extend(.abs-add-box-sizing-desktop all); + clear: none; + float: left; + width: 100%/4; + } + } + } + .block-returns-tracking { + .block-title { + .action { + margin: 12px 0 0 30px; + &.track { + float: right; + } + } + } + } +} diff --git a/app/design/frontend/Magento/luma/Magento_Sales/web/css/source/_email.less b/app/design/frontend/Magento/luma/Magento_Sales/web/css/source/_email.less index 8d002c55b8ea073b6f4e377e28050bc2cb877b48..9fbeb9458d058cc24b1d29f3d4c0b0cda16bae39 100644 --- a/app/design/frontend/Magento/luma/Magento_Sales/web/css/source/_email.less +++ b/app/design/frontend/Magento/luma/Magento_Sales/web/css/source/_email.less @@ -100,7 +100,7 @@ // ---------------------------------------------- .shipment-track { - .table(@table__width, 0); + .lib-table(@table__width, 0); thead, tbody { @@ -127,7 +127,7 @@ // ---------------------------------------------- .email-items { - .table(@table__width, 0); + .lib-table(@table__width, 0); tfoot { > tr { > th, @@ -241,6 +241,6 @@ .email-non-inline() { .email-items { - .table-overflow(); + .lib-table-overflow(); } } diff --git a/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/_module.less index 6327a89678098ed5ba19078cd7821020c87842f2..a1f0aac552bc6011d8eb667686c03d0af9f6ad0a 100644 --- a/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/_module.less @@ -465,6 +465,9 @@ padding: 8px; } } + .customer-name { + cursor: pointer; + } .customer-menu { display: none; } diff --git a/app/design/frontend/Magento/luma/etc/view.xml b/app/design/frontend/Magento/luma/etc/view.xml index 974c4c9fe5a8064263a06996ba0e9ea7c27ebaef..e4f42fabb5c33c22599cd1d550ed4e1ab15a6fe9 100644 --- a/app/design/frontend/Magento/luma/etc/view.xml +++ b/app/design/frontend/Magento/luma/etc/view.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Catalog/etc/view.xsd"> +<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/view.xsd"> <media> <images module="Magento_Catalog"> <image id="bundled_product_customization_page" type="thumbnail"> diff --git a/app/design/frontend/Magento/luma/etc/view.xsd b/app/design/frontend/Magento/luma/etc/view.xsd deleted file mode 100644 index a695016f03565dc6ecf2f654c57d6c44c7eae906..0000000000000000000000000000000000000000 --- a/app/design/frontend/Magento/luma/etc/view.xsd +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> - <xs:redefine schemaLocation="urn:magento:framework:Config/etc/view.xsd"> - <xs:complexType name="mediaType" mixed="true"> - <xs:complexContent> - <xs:extension base="mediaType"> - <xs:sequence> - <xs:element name="images" type="imageType" minOccurs="0"/> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:redefine> - - <xs:complexType name="imageType"> - <xs:sequence> - <xs:element name="image" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="width" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="height" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="constrain" type="xs:boolean" minOccurs="0"/> - <xs:element name="aspect_ratio" type="xs:boolean" minOccurs="0"/> - <xs:element name="frame" type="xs:boolean" minOccurs="0"/> - <xs:element name="transparency" type="xs:boolean" minOccurs="0"/> - <xs:element name="background" minOccurs="0"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:pattern value="\[(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\]"/> - </xs:restriction> - </xs:simpleType> - </xs:element> - </xs:sequence> - <xs:attribute name="id" type="xs:string" use="required"/> - <xs:attribute name="type"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="thumbnail"/> - <xs:enumeration value="small_image"/> - <xs:enumeration value="image"/> - <xs:enumeration value="swatch_image"/> - <xs:enumeration value="swatch_thumb"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="module" type="xs:string" use="required"/> - </xs:complexType> -</xs:schema> diff --git a/app/etc/di.xml b/app/etc/di.xml index 598bc2c341ed351b1cb1ebd20feee0d742330b33..3932bcf133661c8c8b5b9e9eb66355468cc55425 100755 --- a/app/etc/di.xml +++ b/app/etc/di.xml @@ -176,7 +176,7 @@ <type name="Magento\Framework\View\BlockPool" shared="false" /> <type name="Magento\Framework\App\Request\Http"> <arguments> - <argument name="pathInfoProcessor" xsi:type="object">Magento\Store\App\Request\PathInfoProcessor\Proxy</argument> + <argument name="pathInfoProcessor" xsi:type="object">Magento\Backend\App\Request\PathInfoProcessor\Proxy</argument> </arguments> </type> <preference for="Magento\Framework\Session\SaveHandlerInterface" type="Magento\Framework\Session\SaveHandler" /> diff --git a/composer.json b/composer.json index a9e71e4b11044065e63828380d9c3203185e9599..ac841e198ba06c5e24214c71aea2fc92ea4594d2 100644 --- a/composer.json +++ b/composer.json @@ -49,13 +49,7 @@ "symfony/event-dispatcher": "~2.1", "phpseclib/phpseclib": "~0.3", "tedivm/jshrink": "~1.0.1", - "magento/composer": "~1.0.0" - }, - "require-dev": { - "phpunit/phpunit": "4.1.0", - "squizlabs/php_codesniffer": "1.5.3", - "phpmd/phpmd": "@stable", - "pdepend/pdepend": "2.0.6", + "magento/composer": "~1.0.0", "lib-libxml": "*", "ext-ctype": "*", "ext-gd": "*", @@ -69,7 +63,13 @@ "ext-intl": "*", "ext-xsl": "*", "ext-mbstring": "*", - "ext-openssl": "*", + "ext-openssl": "*" + }, + "require-dev": { + "phpunit/phpunit": "4.1.0", + "squizlabs/php_codesniffer": "1.5.3", + "phpmd/phpmd": "@stable", + "pdepend/pdepend": "2.0.6", "sjparkinson/static-review": "~4.1", "fabpot/php-cs-fixer": "~1.2", "lusitanian/oauth": "~0.3 <=0.7.0" diff --git a/composer.lock b/composer.lock index 9da039729694a59f2cb2ed8d294c322ed126c17a..b14624bb5819ea3469cac7cf40f08b628d1388f4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "80867d6202a3ae5d2f4c079e2cfd702f", - "content-hash": "41493176956dcfd2401ac1181d4d4782", + "hash": "e4fca60e7de95ce1b8a7f76d7fa40c80", + "content-hash": "6372c4ff0d59809e1b9a22251313cc80", "packages": [ { "name": "braintree/braintree_php", @@ -2571,16 +2571,16 @@ }, { "name": "fabpot/php-cs-fixer", - "version": "v1.10.1", + "version": "v1.10.2", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "12dbcd1462f1e3a5a96c6c7398af26b28e092a8a" + "reference": "e8b3c4e41dc1484210fdc45363c41af6c2d56f20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/12dbcd1462f1e3a5a96c6c7398af26b28e092a8a", - "reference": "12dbcd1462f1e3a5a96c6c7398af26b28e092a8a", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/e8b3c4e41dc1484210fdc45363c41af6c2d56f20", + "reference": "e8b3c4e41dc1484210fdc45363c41af6c2d56f20", "shasum": "" }, "require": { @@ -2621,7 +2621,7 @@ } ], "description": "A tool to automatically fix PHP code style", - "time": "2015-10-12 20:13:46" + "time": "2015-10-21 19:19:43" }, { "name": "league/climate", @@ -3926,9 +3926,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "~5.5.0|~5.6.0|~7.0.0" - }, - "platform-dev": { + "php": "~5.5.0|~5.6.0|~7.0.0", "lib-libxml": "*", "ext-ctype": "*", "ext-gd": "*", @@ -3943,5 +3941,6 @@ "ext-xsl": "*", "ext-mbstring": "*", "ext-openssl": "*" - } + }, + "platform-dev": [] } diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester.php b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester.php index 01be1182f2b39f7abe1167ec94d8a4c5914f13f2..986be8b00f51a4832106ecb5aa590dc866edc3cb 100644 --- a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester.php +++ b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester.php @@ -61,7 +61,7 @@ abstract class CookieTester implements \Magento\Framework\App\ActionInterface * @param RequestInterface $request * @return mixed */ - abstract protected function execute(RequestInterface $request); + abstract protected function executeInternal(RequestInterface $request); /** * Dispatch request @@ -69,9 +69,9 @@ abstract class CookieTester implements \Magento\Framework\App\ActionInterface * @param RequestInterface $request * @return \Magento\Framework\App\ResponseInterface */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { - $result = $this->execute($request); + $result = $this->executeInternal($request); return $result ? $result : $this->_response; } } diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/DeleteCookie.php b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/DeleteCookie.php index 0baf5fdce982e2757e031261bc7c6e6e5e835062..755aae0f0612b43633c555330a89d800e91bce0e 100644 --- a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/DeleteCookie.php +++ b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/DeleteCookie.php @@ -16,7 +16,7 @@ class DeleteCookie extends \Magento\TestModule1\Controller\CookieTester * * @return void */ - public function execute(RequestInterface $request) + public function executeInternal(RequestInterface $request) { $cookieName = $request->getParam('cookie_name'); $this->getCookieManager()->deleteCookie($cookieName); diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetPublicCookie.php b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetPublicCookie.php index 6583b3bad168d0301c1af932d9c291275023eb05..da6cde29dcd01f9d11e8f603e45ccf0897395580 100644 --- a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetPublicCookie.php +++ b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetPublicCookie.php @@ -16,7 +16,7 @@ class SetPublicCookie extends \Magento\TestModule1\Controller\CookieTester * * @return void */ - public function execute(RequestInterface $request) + public function executeInternal(RequestInterface $request) { $publicCookieMetadata = $this->getCookieMetadataFactory()->createPublicCookieMetadata(); diff --git a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetSensitiveCookie.php b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetSensitiveCookie.php index 74ea42b69bc76e40b59a8bcf5aa2d2da23ca542d..cf8cfd054c425600cea14ba451c1d475f92d1b21 100644 --- a/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetSensitiveCookie.php +++ b/dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetSensitiveCookie.php @@ -16,7 +16,7 @@ class SetSensitiveCookie extends \Magento\TestModule1\Controller\CookieTester * * @return void */ - public function execute(RequestInterface $request) + public function executeInternal(RequestInterface $request) { $sensitiveCookieMetadata = $this->getCookieMetadataFactory()->createSensitiveCookieMetadata(); diff --git a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/OrderItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/OrderItemRepositoryTest.php index 72005876cc595da0a6d1a2ae85a258464b07781f..5944edff812c676dcaba7654e4c76d695dc7d6a3 100644 --- a/dev/tests/api-functional/testsuite/Magento/Bundle/Api/OrderItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Bundle/Api/OrderItemRepositoryTest.php @@ -76,7 +76,7 @@ class OrderItemRepositoryTest extends WebapiAbstract ] ); - $requestData = ['criteria' => $searchCriteriaBuilder->create()->__toArray()]; + $requestData = ['searchCriteria' => $searchCriteriaBuilder->create()->__toArray()]; $serviceInfo = [ 'rest' => [ diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/OrderItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/OrderItemRepositoryTest.php index db63fbb6084601820a27dc4cc770fa6826a28507..613be6d50073ef492226d584b747077c26af59c4 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/OrderItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/OrderItemRepositoryTest.php @@ -76,7 +76,7 @@ class OrderItemRepositoryTest extends WebapiAbstract ] ); - $requestData = ['criteria' => $searchCriteriaBuilder->create()->__toArray()]; + $requestData = ['searchCriteria' => $searchCriteriaBuilder->create()->__toArray()]; $serviceInfo = [ 'rest' => [ diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php index a4e575526562a01fa40e60cec7a47c1e7ead4d2a..8535762ad4f0833fb3e8a57a4951aeb77e0763d0 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php @@ -140,7 +140,7 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract * @param array $fixtureProduct * * @dataProvider productCreationProvider - * @magentoApiDataFixture Magento/Store/_files/core_fixturestore.php + * @magentoApiDataFixture Magento/Store/_files/fixture_store_with_catalogsearch_index.php */ public function testCreateAllStoreCode($fixtureProduct) { @@ -169,7 +169,7 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract * @param array $fixtureProduct * * @dataProvider productCreationProvider - * @magentoApiDataFixture Magento/Store/_files/core_fixturestore.php + * @magentoApiDataFixture Magento/Store/_files/fixture_store_with_catalogsearch_index.php */ public function testDeleteAllStoreCode($fixtureProduct) { diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php index 25cb0e8652bf2996a9864e68bfcbeb5fb977fe63..318a225288827759eb65bb32793fac5bf0536144 100644 --- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php @@ -76,7 +76,7 @@ class OrderItemRepositoryTest extends WebapiAbstract ] ); - $requestData = ['criteria' => $searchCriteriaBuilder->create()->__toArray()]; + $requestData = ['searchCriteria' => $searchCriteriaBuilder->create()->__toArray()]; $serviceInfo = [ 'rest' => [ diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php index e8719f6f4e276d3185856c04af776a8b38e61048..21f313bcf0c3515ace3d47586740cde1b1f4dd68 100644 --- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php @@ -126,7 +126,6 @@ class ProductRepositoryTest extends WebapiAbstract $response = $this->createConfigurableProduct(); $this->assertEquals(self::CONFIGURABLE_PRODUCT_SKU, $response[ProductInterface::SKU]); - $this->assertEquals(50, $response['price']); $this->assertTrue( isset($response[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]["configurable_product_options"]) ); diff --git a/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/OrderItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/OrderItemRepositoryTest.php index 41a5c6a506962a018eeb8421c6d8bc53f5ad7567..e3da911ba3a17affc4049868fd524d93672a1611 100644 --- a/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/OrderItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Downloadable/Api/OrderItemRepositoryTest.php @@ -76,7 +76,7 @@ class OrderItemRepositoryTest extends WebapiAbstract ] ); - $requestData = ['criteria' => $searchCriteriaBuilder->create()->__toArray()]; + $requestData = ['searchCriteria' => $searchCriteriaBuilder->create()->__toArray()]; $serviceInfo = [ 'rest' => [ diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php index d3216b9cf41c17d454e7e46ed7d8be1051561586..892f4ca944a4673641d705bdea7d9acd5da12ead 100644 --- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/CreditmemoListTest.php @@ -68,7 +68,7 @@ class CreditmemoListTest extends WebapiAbstract ); $searchData = $searchCriteriaBuilder->create()->__toArray(); - $requestData = ['criteria' => $searchData]; + $requestData = ['searchCriteria' => $searchData]; $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData), diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php index b529af4d554d2a5be200e05d1f3c42abc1b3f7b7..6b8aa48df12f2337e603c79bda7200806a5c358b 100644 --- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/InvoiceListTest.php @@ -53,7 +53,7 @@ class InvoiceListTest extends WebapiAbstract ); $searchData = $searchCriteriaBuilder->create()->__toArray(); - $requestData = ['criteria' => $searchData]; + $requestData = ['searchCriteria' => $searchData]; $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData), diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php index 1cd2b7a30656eea7334dbf9266281f9871bceeec..e91f747116db0ac2eea035af55096c8ba9517e20 100644 --- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderItemGetListTest.php @@ -48,7 +48,7 @@ class OrderItemGetListTest extends WebapiAbstract ] ); - $requestData = ['criteria' => $searchCriteriaBuilder->create()->__toArray()]; + $requestData = ['searchCriteria' => $searchCriteriaBuilder->create()->__toArray()]; $serviceInfo = [ 'rest' => [ diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php index 003ccfccf94e8e7fffef995a27e4fd36932378cf..a6598376efb31d1119eba37ce3dad2decbef64ca 100644 --- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderListTest.php @@ -54,7 +54,7 @@ class OrderListTest extends WebapiAbstract ); $searchData = $searchCriteriaBuilder->create()->__toArray(); - $requestData = ['criteria' => $searchData]; + $requestData = ['searchCriteria' => $searchData]; $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData), diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php index a06f22664920a35b9990442f7a6f2adb4c6c013f..678edb386c75315b9d4dfa4ad5f15334f358c305 100644 --- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentListTest.php @@ -46,7 +46,7 @@ class ShipmentListTest extends WebapiAbstract $searchCriteriaBuilder->addFilters([$filterBuilder->setField('shipment_status')->setValue(1)->create()]); $searchData = $searchCriteriaBuilder->create()->__toArray(); - $requestData = ['criteria' => $searchData]; + $requestData = ['searchCriteria' => $searchData]; $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData), diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php index 2081f0502ff731d331d178c4257496e8b062284b..b0fb27eb25441a9797ba5cf5f15ba5ba4037f1e4 100644 --- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/TransactionTest.php @@ -118,7 +118,7 @@ class TransactionTest extends WebapiAbstract $searchCriteriaBuilder->addFilters($filters); $searchData = $searchCriteriaBuilder->create()->__toArray(); - $requestData = ['criteria' => $searchData]; + $requestData = ['searchCriteria' => $searchData]; $serviceInfo = [ 'rest' => [ diff --git a/dev/tests/functional/.htaccess b/dev/tests/functional/.htaccess index 0fe8af43b87597383c5904481c15b751e52630d2..ae57d9073f2d950763d40e015ffabd05c02c29db 100644 --- a/dev/tests/functional/.htaccess +++ b/dev/tests/functional/.htaccess @@ -36,9 +36,36 @@ php_value max_execution_time 18000 ############################################ -## disable magic quotes for php request vars +## disable automatic session start +## before autoload was initialized + + php_flag session.auto_start off + +############################################ +## enable resulting html compression + + #php_flag zlib.output_compression on + +########################################### +# disable user agent verification to not break multiple image upload + + php_flag suhosin.session.cryptua off - php_flag magic_quotes_gpc off +########################################### +# turn off compatibility with PHP4 when dealing with objects + + php_flag zend.ze1_compatibility_mode Off + +</IfModule> + +<IfModule mod_php7.c> + +############################################ +## adjust memory limit + +# php_value memory_limit 64M + php_value memory_limit 256M + php_value max_execution_time 18000 ############################################ ## disable automatic session start diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache.php index be0e3f829e2eb6eb668972e7143aa8e4e4dc35cb..eac82f0b3dcd31f844bc7a3ebeac7b8da1d29526 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Cache.php @@ -68,7 +68,7 @@ class Cache extends Block */ public function isStorageCacheFlushed() { - return $this->getMessagesBlock()->getSuccessMessages() == $this->messagesText['cache_storage_flushed']; + return $this->getMessagesBlock()->getSuccessMessage() == $this->messagesText['cache_storage_flushed']; } /** @@ -78,7 +78,7 @@ class Cache extends Block */ public function isMagentoCacheFlushed() { - return $this->getMessagesBlock()->getSuccessMessages() == $this->messagesText['cache_magento_flushed']; + return $this->getMessagesBlock()->getSuccessMessage() == $this->messagesText['cache_magento_flushed']; } /** diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Messages.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Messages.php index 586f0d9205f9ea6643a7b1e1f6f385260b89064c..8cfce3edc4ca9ac1b4140074b7685cfe1423bf11 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Messages.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Messages.php @@ -21,6 +21,13 @@ class Messages extends Block */ protected $successMessage = '[data-ui-id$=message-success]'; + /** + * Last success message selector. + * + * @var string + */ + protected $lastSuccessMessage = '[data-ui-id$=message-success]:last-child'; + /** * Message link. * @@ -62,7 +69,7 @@ class Messages extends Block /** * Get all success messages which are present on the page. * - * @return string|array + * @return array */ public function getSuccessMessages() { @@ -74,7 +81,19 @@ class Messages extends Block $messages[] = $element->getText(); } - return count($messages) > 1 ? $messages : $messages[0]; + return $messages; + } + + /** + * Get last success message which is present on the page. + * + * @return string + */ + public function getSuccessMessage() + { + $this->waitForElementVisible($this->successMessage); + + return $this->_rootElement->find($this->lastSuccessMessage)->getText(); } /** @@ -96,11 +115,11 @@ class Messages extends Block } /** - * Get all error messages which are present on the page. + * Get all error message which is present on the page. * * @return string */ - public function getErrorMessages() + public function getErrorMessage() { return $this->_rootElement ->find($this->errorMessage, Locator::SELECTOR_CSS) @@ -108,13 +127,13 @@ class Messages extends Block } /** - * Click on link in the messages which are present on the page. + * Click on link in the message which is present on the page. * * @param string $messageType * @param string $linkText * @return void */ - public function clickLinkInMessages($messageType, $linkText) + public function clickLinkInMessage($messageType, $linkText) { if ($this->isVisibleMessage($messageType)) { $this->_rootElement @@ -162,7 +181,7 @@ class Messages extends Block * * @return string */ - public function getNoticeMessages() + public function getNoticeMessage() { $this->waitForElementVisible($this->noticeMessage); return $this->_rootElement->find($this->noticeMessage)->getText(); @@ -173,7 +192,7 @@ class Messages extends Block * * @return string */ - public function getWarningMessages() + public function getWarningMessage() { $this->waitForElementVisible($this->warningMessage); return $this->_rootElement->find($this->warningMessage)->getText(); diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php index a5aaf0243996e99b6e117344b86b20cf64c725d9..85aa4dcf2f5a8e966760d37942472fc2c08dc785 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php @@ -189,7 +189,7 @@ abstract class Grid extends Block protected $rowPattern = '//tbody/tr[%s]'; /** - * Selector for confirm. + * Selector for confirm. * * @var string */ diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheIsRefreshableAndInvalidated.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheIsRefreshableAndInvalidated.php index 5492c69ef0b27568f4289cab588a9f8894a5d925..76ab1d8b104c74b5ceee50faf13970c143813cd8 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheIsRefreshableAndInvalidated.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheIsRefreshableAndInvalidated.php @@ -41,7 +41,7 @@ class AssertCacheIsRefreshableAndInvalidated extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_MESSAGE, count($items)), - $adminCache->getMessagesBlock()->getSuccessMessages(), + $adminCache->getMessagesBlock()->getSuccessMessage(), 'Cache is Invalid and refreshable.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheManagementAction.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheManagementAction.php index 5ca1e4e677bbf7f3fa1ecf19f25114a19e547a2e..1be33c03244280bc59ebd442bb3fbe501680dd64 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheManagementAction.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Constraint/AssertCacheManagementAction.php @@ -25,7 +25,7 @@ class AssertCacheManagementAction extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( $successMessage, - $adminCache->getMessagesBlock()->getSuccessMessages(), + $adminCache->getMessagesBlock()->getSuccessMessage(), 'Action is not successful.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/Price.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/Price.xml index db2317905be3d6aebe0fda14b7efbaef35af2a96..4bd3a3f73db784856b9b7c4484e7a82b8d3521e0 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/Price.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/Price.xml @@ -56,8 +56,8 @@ </dataset> <dataset name="fixed-100-custom-options"> - <field name="price_from" xsi:type="string">244.00</field> - <field name="cart_price" xsi:type="string">244.00</field> + <field name="price_from" xsi:type="string">270.00</field> + <field name="cart_price" xsi:type="string">270.00</field> </dataset> <dataset name="fixed-110"> diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml index 530018bf81c4741e9785564800a14f39a3397ac1..5fa78fb4247fa90abb876c3787e6ded8d01d4e8d 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml @@ -149,8 +149,6 @@ <data name="product/data/weight" xsi:type="string">10</data> <data name="product/data/category" xsi:type="string">category_%isolation%</data> <data name="product/data/price_view" xsi:type="string">Price Range</data> - <data name="product/data/stock_data/use_config_manage_stock" xsi:type="string">No</data> - <data name="product/data/stock_data/manage_stock" xsi:type="string">Yes</data> <data name="product/data/shipment_type" xsi:type="string">Together</data> <data name="product/data/bundle_selections/dataset" xsi:type="string">with_not_required_options</data> <data name="product/data/bundle_selections/products" xsi:type="string">catalogProductSimple::product_100_dollar,catalogProductVirtual::product_50_dollar|catalogProductSimple::product_100_dollar,catalogProductVirtual::product_50_dollar</data> @@ -214,7 +212,7 @@ <data name="product/data/sku_type" xsi:type="string">Dynamic</data> <data name="product/data/sku" xsi:type="string">sku_bundle_dynamic_%isolation%</data> <data name="product/data/price_type" xsi:type="string">Dynamic</data> - <data name="product/data/price/dataset" xsi:type="string">dynamic-32</data> + <data name="product/data/price/dataset" xsi:type="string">dynamic-40</data> <data name="product/data/bundle_selections/dataset" xsi:type="string">default_dynamic</data> <data name="product/data/bundle_selections/products" xsi:type="string">catalogProductSimple::product_100_dollar,catalogProductSimple::product_40_dollar</data> <data name="product/data/checkout_data/dataset" xsi:type="string">bundle_default</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/CategoryForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/CategoryForm.php index 6af0253e217e3f51e47e9a5b4021869037bb00c2..df04b06cb442cce34c174d067fe40ff104591984 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/CategoryForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/CategoryForm.php @@ -31,7 +31,7 @@ class CategoryForm extends FormTabs protected $dropdownBlock = '.dropdown'; /** - * Selector for confirm. + * Selector for confirm. * * @var string */ @@ -51,9 +51,9 @@ class CategoryForm extends FormTabs $store = $fixture->getStoreId(); $storeSwitcherBlock = $this->browser->find($this->storeSwitcherBlock); $storeSwitcherBlock->find($this->dropdownBlock, Locator::SELECTOR_CSS, 'liselectstore')->setValue($store); - $element = $this->browser->find($this->confirmModal); + $modalElement = $this->browser->find($this->confirmModal); /** @var \Magento\Ui\Test\Block\Adminhtml\Modal $modal */ - $modal = $this->blockFactory->create('Magento\Ui\Test\Block\Adminhtml\Modal', ['element' => $element]); + $modal = $this->blockFactory->create('Magento\Ui\Test\Block\Adminhtml\Modal', ['element' => $modalElement]); $modal->acceptAlert(); } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php index 4dfc6d203b3f945c520bc8fadfff384600d1b20d..7d85ae5b237c01549832c92c601f4ad0a5f2a5f0 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/CustomAttribute.php @@ -19,7 +19,7 @@ class CustomAttribute extends SimpleElement * * @var string */ - protected $inputSelector = '.control [data-ui-id][name]'; + protected $inputSelector = '.control [name]:not([type="hidden"]), table'; /** * Attribute class to element type reference. @@ -45,7 +45,9 @@ class CustomAttribute extends SimpleElement $this->eventManager->dispatchEvent(['set_value'], [__METHOD__, $this->getAbsoluteSelector()]); $element = $this->getElementByClass($this->getElementClass()); $value = is_array($data) ? $data['value'] : $data; - $this->find($this->inputSelector, Locator::SELECTOR_CSS, $element)->setValue($value); + if ($value !== null) { + $this->find($this->inputSelector, Locator::SELECTOR_CSS, $element)->setValue($value); + } } /** diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/GridPageActions.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/GridPageActions.php index 49d3f926aa63111003e8a56440c30a1fd95160ed..9373e1ab10ffaf958e27b18f4719141979f63498 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/GridPageActions.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/GridPageActions.php @@ -10,7 +10,7 @@ use Magento\Backend\Test\Block\GridPageActions as AbstractGridPageActions; /** * Class GridPageActions - * Grid page actions block on Product Templates page + * Grid page actions block on Attribute Sets page */ class GridPageActions extends AbstractGridPageActions { diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/ProductTab.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/ProductTab.php index c7c48a1847c784ab2dc885b98fe3c3640c73549d..4754efe1f1bfcfe93081670cae1605a1a669a28b 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/ProductTab.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/ProductTab.php @@ -9,7 +9,6 @@ namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit; use Magento\Mtf\Client\Locator; use Magento\Backend\Test\Block\Widget\Tab; use Magento\Catalog\Test\Block\Adminhtml\Product\Attribute\Edit; -use Magento\Catalog\Test\Fixture\CatalogProductAttribute; /** * General class for tabs on product FormTabs with "Add attribute" button. diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/AttributeSet.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/AttributeSet.php index 93e96cf4e28ebcd26cd1029086c5abf846a8fa71..2ecde06b84bc3773ac4572c095c5ef74fe8914e0 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/AttributeSet.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/AttributeSet.php @@ -7,6 +7,7 @@ namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Tab\ProductDetails; use Magento\Mtf\Client\Element\SuggestElement; +use Magento\Mtf\Client\Locator; /** * Class AttributeSet @@ -35,6 +36,13 @@ class AttributeSet extends SuggestElement */ protected $loader = '[data-role="loader"]'; + /** + * Page header selector. + * + * @var string + */ + protected $header = 'header'; + /** * Set value * @@ -44,8 +52,27 @@ class AttributeSet extends SuggestElement public function setValue($value) { if ($value !== $this->find($this->actionToggle)->getText()) { + $this->eventManager->dispatchEvent(['set_value'], [__METHOD__, $this->getAbsoluteSelector()]); $this->find($this->actionToggle)->click(); - parent::setValue($value); + $this->clear(); + if ($value == '') { + return; + } + foreach (str_split($value) as $symbol) { + $this->keys([$symbol]); + $searchedItem = $this->find(sprintf($this->resultItem, $value), Locator::SELECTOR_XPATH); + if ($searchedItem->isVisible()) { + try { + $searchedItem->hover(); + $this->driver->find($this->header)->hover(); + $searchedItem->click(); + break; + } catch (\Exception $e) { + // In parallel run on windows change the focus is lost on element + // that causes disappearing of category suggest list. + } + } + } } // Wait loader $element = $this->driver; diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php index 7e4608bc008a1acf44807ac3937d283844f24fcc..9fcea9e345614a72f5489684d31a02ec5acd83ad 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php @@ -30,14 +30,14 @@ class CustomOptions extends Form * * @var string */ - protected $optionElement = '#product-options-wrapper .field'; + protected $optionElement = '#product-options-wrapper > * > .field'; /** * Selector for title of option * * @var string */ - protected $title = 'label'; + protected $title = 'label > span:nth-child(1), legend > span:nth-child(1)'; /** * Selector for required option @@ -381,7 +381,7 @@ class CustomOptions extends Form */ protected function parseOptionText($optionText) { - preg_match('`^(.*?)\+\$(\d.*?)$`', $optionText, $match); + preg_match('`^(.*?) \+ ?\$([\d\.,]*?)$`', $optionText, $match); $optionPrice = isset($match[2]) ? str_replace(',', '', $match[2]) : 0; $optionTitle = isset($match[1]) ? trim($match[1]) : $optionText; diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAddedProductAttributeOnProductForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAddedProductAttributeOnProductForm.php index 22cc3977640cb5e7fcf1ee60e7619bd5dcbaf38b..eeb6257ee1f1873813e89421e9fa2a3f0e42c52c 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAddedProductAttributeOnProductForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAddedProductAttributeOnProductForm.php @@ -28,7 +28,7 @@ class AssertAddedProductAttributeOnProductForm extends AbstractConstraint * @param CatalogProductIndex $productGrid * @param CatalogProductEdit $productEdit * @param CatalogProductAttribute $attribute - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @param CatalogProductAttribute $productAttributeOriginal * @throws \Exception * @return void @@ -38,11 +38,11 @@ class AssertAddedProductAttributeOnProductForm extends AbstractConstraint CatalogProductIndex $productGrid, CatalogProductEdit $productEdit, CatalogProductAttribute $attribute, - CatalogAttributeSet $productTemplate, + CatalogAttributeSet $attributeSet, CatalogProductAttribute $productAttributeOriginal = null ) { if (!$product->hasData('sku')) { - $product = $this->createProductWithAttributeSet($productAttributeOriginal, $productTemplate); + $product = $this->createProductWithAttributeSet($productAttributeOriginal, $attributeSet); } $filterProduct = ['sku' => $product->getSku()]; $productGrid->open(); @@ -62,16 +62,16 @@ class AssertAddedProductAttributeOnProductForm extends AbstractConstraint * Create Product With AttributeSet. * * @param CatalogProductAttribute $attribute - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @return CatalogProductSimple */ protected function createProductWithAttributeSet( CatalogProductAttribute $attribute, - CatalogAttributeSet $productTemplate + CatalogAttributeSet $attributeSet ) { $product = ObjectManager::getInstance()->create( - 'Magento\Catalog\Test\TestStep\AddAttributeToProductTemplateStep', - ['attribute' => $attribute, 'productTemplate' => $productTemplate] + 'Magento\Catalog\Test\TestStep\AddAttributeToAttributeSetStep', + ['attribute' => $attribute, 'attributeSet' => $attributeSet] )->run(); return $product['product']; } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetForm.php similarity index 79% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateForm.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetForm.php index 4a634c7d23dec5d00566c6e59a9254800b0a1eb2..527f609aa60bb8483ad07967fcf2ebecc105eb33 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetForm.php @@ -13,14 +13,14 @@ use Magento\Catalog\Test\Page\Adminhtml\CatalogProductSetIndex; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Class AssertProductTemplateForm - * Checking data from Product Template form with data fixture + * Class AssertAttributeSetForm + * Checking data from Attribute Set form with data fixture */ -class AssertProductTemplateForm extends AbstractConstraint +class AssertAttributeSetForm extends AbstractConstraint { /** - * Assert that after save a product template on edit product set page displays: - * 1. Correct product template name in Attribute set name field passed from fixture + * Assert that after save a attribute set on edit product set page displays: + * 1. Correct attribute set name in Attribute set name field passed from fixture * 2. Created Product Attribute (if was added) * * @param CatalogProductSetIndex $productSet @@ -43,7 +43,7 @@ class AssertProductTemplateForm extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( $filterAttribute['set_name'], $productSetEdit->getAttributeSetEditBlock()->getAttributeSetName(), - 'Product Template not found' + 'Attribute Set not found' . "\nExpected: " . $filterAttribute['set_name'] . "\nActual: " . $productSetEdit->getAttributeSetEditBlock()->getAttributeSetName() ); @@ -51,7 +51,7 @@ class AssertProductTemplateForm extends AbstractConstraint $attributeLabel = $productAttribute->getFrontendLabel(); \PHPUnit_Framework_Assert::assertTrue( $productSetEdit->getAttributeSetEditBlock()->checkProductAttribute($attributeLabel), - "Product Attribute is absent on Product Template Groups" + "Product Attribute is absent on Attribute Set Groups" ); } } @@ -63,6 +63,6 @@ class AssertProductTemplateForm extends AbstractConstraint */ public function toString() { - return 'Data from the Product Template form matched with fixture'; + return 'Data from the Attribute Set form matched with fixture'; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateGroupOnProductForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetGroupOnProductForm.php similarity index 88% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateGroupOnProductForm.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetGroupOnProductForm.php index 2baac340525f3c1506afbb7cde40e0325dffe918..3aa7d3e9361e30fae3c614b95549d2b697c752ea 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateGroupOnProductForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetGroupOnProductForm.php @@ -17,15 +17,15 @@ use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex; use Magento\Catalog\Test\Page\Adminhtml\CatalogProductEdit; /** - * Class AssertProductTemplateGroupOnProductForm - * Check that created product template displays in product template suggest container dropdown and + * Class AssertAttributeSetGroupOnProductForm + * Check that created attribute set displays in attribute set suggest container dropdown and * can be used for new created product */ -class AssertProductTemplateGroupOnProductForm extends AbstractConstraint +class AssertAttributeSetGroupOnProductForm extends AbstractConstraint { /** - * Assert that created product template: - * 1. Displays in product template suggest container dropdown + * Assert that created attribute set: + * 1. Displays in attribute set suggest container dropdown * 2. Can be used for new created product. * * @param FixtureFactory $fixtureFactory diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateInGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetInGrid.php similarity index 67% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateInGrid.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetInGrid.php index 281327b9f8c921784306d09d87b935261a42b5d5..6e6d02c324171284022529d2931f145f4dbacec1 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetInGrid.php @@ -11,13 +11,13 @@ use Magento\Catalog\Test\Page\Adminhtml\CatalogProductSetIndex; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Class AssertProductTemplateInGrid - * Checks present product template in Product Templates grid + * Class AssertAttributeSetInGrid + * Checks present attribute set in Attribute Sets grid */ -class AssertProductTemplateInGrid extends AbstractConstraint +class AssertAttributeSetInGrid extends AbstractConstraint { /** - * Assert that new product template displays in Product Templates grid + * Assert that new attribute set displays in Attribute Sets grid * * @param CatalogProductSetIndex $productSetPage * @param CatalogAttributeSet $attributeSet @@ -32,17 +32,17 @@ class AssertProductTemplateInGrid extends AbstractConstraint $productSetPage->open(); \PHPUnit_Framework_Assert::assertTrue( $productSetPage->getGrid()->isRowVisible($filterAttributeSet), - 'Product Template \'' . $filterAttributeSet['set_name'] . '\' is absent in Product Template grid.' + 'Attribute Set \'' . $filterAttributeSet['set_name'] . '\' is absent in Attribute Set grid.' ); } /** - * Text present new product template in grid + * Text present new attribute set in grid * * @return string */ public function toString() { - return 'Product template is present in Product Templates grid'; + return 'Attribute set is present in Attribute Sets grid'; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetNotInGrid.php similarity index 62% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetNotInGrid.php index 02d8435fb2585e5c0372f07c1b52f20a5ce8b8ed..7d5ed1707c64dfcc2053f0b2326db0bc1a9e72e7 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetNotInGrid.php @@ -11,42 +11,42 @@ use Magento\Catalog\Test\Page\Adminhtml\CatalogProductSetIndex; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Class AssertProductTemplateNotInGrid - * Assert that Product Template absence on grid + * Class AssertAttributeSetNotInGrid + * Assert that Attribute Set absence on grid */ -class AssertProductTemplateNotInGrid extends AbstractConstraint +class AssertAttributeSetNotInGrid extends AbstractConstraint { /* tags */ const SEVERITY = 'low'; /* end tags */ /** - * Assert that product template is not displayed in Product Templates grid + * Assert that attribute set is not displayed in Attribute Sets grid * * @param CatalogProductSetIndex $productSetPage - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @return void */ - public function processAssert(CatalogProductSetIndex $productSetPage, CatalogAttributeSet $productTemplate) + public function processAssert(CatalogProductSetIndex $productSetPage, CatalogAttributeSet $attributeSet) { $filterAttributeSet = [ - 'set_name' => $productTemplate->getAttributeSetName(), + 'set_name' => $attributeSet->getAttributeSetName(), ]; $productSetPage->open(); \PHPUnit_Framework_Assert::assertFalse( $productSetPage->getGrid()->isRowVisible($filterAttributeSet), - 'An attribute set named "' . $filterAttributeSet['set_name'] . '" is present in Product Template grid.' + 'An attribute set named "' . $filterAttributeSet['set_name'] . '" is present in Attribute Set grid.' ); } /** - * Text absent new product template in grid + * Text absent new attribute set in grid * * @return string */ public function toString() { - return 'Product template is absent in Product Templates grid'; + return 'Attribute set is absent in Attribute Sets grid'; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateOnProductForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetOnProductForm.php similarity index 88% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateOnProductForm.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetOnProductForm.php index cf3e50c9f09009b498b96ad8bb74853d520f50ea..0f66f26036df9073cb1887d86255bc38f48dfc3e 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateOnProductForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetOnProductForm.php @@ -16,14 +16,14 @@ use Magento\Mtf\Constraint\AbstractConstraint; use Magento\Mtf\Fixture\FixtureFactory; /** - * Class AssertProductTemplateOnProductForm + * Class AssertAttributeSetOnProductForm * Check Attribute Set and Product Attribute on Product form */ -class AssertProductTemplateOnProductForm extends AbstractConstraint +class AssertAttributeSetOnProductForm extends AbstractConstraint { /** - * Assert that created product template: - * 1. Displays in product template suggest container dropdown + * Assert that created attribute set: + * 1. Displays in attribute set suggest container dropdown * 2. Can be used for new created product. * * @param FixtureFactory $fixtureFactory @@ -66,7 +66,7 @@ class AssertProductTemplateOnProductForm extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( $attributeSet->getAttributeSetName(), $formAttributeSet, - 'Product Template not found on Product form.' + 'Attribute Set not found on Product form.' . "\nExpected: " . $attributeSet->getAttributeSetName() . "\nActual: " . $formAttributeSet ); @@ -88,6 +88,6 @@ class AssertProductTemplateOnProductForm extends AbstractConstraint */ public function toString() { - return 'Product Attribute and Product Template are present on the Product form.'; + return 'Product Attribute and Attribute Set are present on the Product form.'; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetSuccessDeleteMessage.php similarity index 70% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessDeleteMessage.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetSuccessDeleteMessage.php index 43cff91896a5373c3641bb780978fddf1ff44407..8da7dc6bd271f975b3f50d249971b9d512ef420c 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetSuccessDeleteMessage.php @@ -10,25 +10,25 @@ use Magento\Catalog\Test\Page\Adminhtml\CatalogProductSetIndex; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Class AssertProductTemplateSuccessDeleteMessage - * Check Product Templates success delete message + * Class AssertAttributeSetSuccessDeleteMessage + * Check Attribute Sets success delete message */ -class AssertProductTemplateSuccessDeleteMessage extends AbstractConstraint +class AssertAttributeSetSuccessDeleteMessage extends AbstractConstraint { /** * Text value to be checked */ - const SUCCESS_DELETE_MESSAGE = 'The product template has been removed.'; + const SUCCESS_DELETE_MESSAGE = 'The attribute set has been removed.'; /** - * Assert that after deleting product template success delete message appears + * Assert that after deleting attribute set success delete message appears * * @param CatalogProductSetIndex $productSetIndex * @return void */ public function processAssert(CatalogProductSetIndex $productSetIndex) { - $actualMessage = $productSetIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $productSetIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, @@ -45,6 +45,6 @@ class AssertProductTemplateSuccessDeleteMessage extends AbstractConstraint */ public function toString() { - return 'Product Templates success delete message is present.'; + return 'Attribute Sets success delete message is present.'; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetSuccessSaveMessage.php similarity index 69% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessSaveMessage.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetSuccessSaveMessage.php index 457cac5b7082e897686f71f98b0571d0c070962e..789c2806091c11ff7853baf990a51f60dd3768f4 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertAttributeSetSuccessSaveMessage.php @@ -10,25 +10,25 @@ use Magento\Catalog\Test\Page\Adminhtml\CatalogProductSetIndex; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Class AssertProductTemplateSuccessSaveMessage - * Check Product Templates success save message + * Class AssertAttributeSetSuccessSaveMessage + * Check Attribute Sets success save message */ -class AssertProductTemplateSuccessSaveMessage extends AbstractConstraint +class AssertAttributeSetSuccessSaveMessage extends AbstractConstraint { /** * Text value to be checked */ - const SUCCESS_MESSAGE = 'You saved the product template.'; + const SUCCESS_MESSAGE = 'You saved the attribute set.'; /** - * Assert that after save a product template "You saved the attribute set." successful message appears + * Assert that after save a attribute set "You saved the attribute set." successful message appears * * @param CatalogProductSetIndex $productSetIndex * @return void */ public function processAssert(CatalogProductSetIndex $productSetIndex) { - $actualMessage = $productSetIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $productSetIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, @@ -45,6 +45,6 @@ class AssertProductTemplateSuccessSaveMessage extends AbstractConstraint */ public function toString() { - return 'Product Templates success save message is present.'; + return 'Attribute Sets success save message is present.'; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySaveMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySaveMessage.php index 454379830cd060168582a3f7067beb2fb5f22137..c983a5afc6e5b3fe9adff454cfacb4e7e4f97d3a 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySaveMessage.php @@ -28,7 +28,7 @@ class AssertCategorySaveMessage extends AbstractConstraint */ public function processAssert(CatalogCategoryEdit $catalogCategoryEdit) { - $actualMessage = $catalogCategoryEdit->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $catalogCategoryEdit->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySuccessDeleteMessage.php index bb77a39089fe91bc5cb9394eed042d5017c83e8a..dbc9db525560f2fd294ecd5d81ed39118552770d 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategorySuccessDeleteMessage.php @@ -28,7 +28,7 @@ class AssertCategorySuccessDeleteMessage extends AbstractConstraint */ public function processAssert(CatalogCategoryEdit $categoryEdit) { - $actualMessage = $categoryEdit->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $categoryEdit->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertMassProductUpdateSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertMassProductUpdateSuccessMessage.php index 4aa368dcf71a14752ded095cc80e64ecd5d2b200..04639082d289d1466ebf5196cc699c6b31c76f18 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertMassProductUpdateSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertMassProductUpdateSuccessMessage.php @@ -30,7 +30,7 @@ class AssertMassProductUpdateSuccessMessage extends AbstractConstraint { $countProducts = count($products) ? count($products) : 1; $expectedMessage = sprintf(self::SUCCESS_MESSAGE, $countProducts); - $actualMessage = $productGrid->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $productGrid->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectedMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInSearchOnProductForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInSearchOnProductForm.php index 4052a470a60642250dcefe83cae20bef9696df43..6ba9ad8b07825a832c853ceecc8d829d81a6b0c2 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInSearchOnProductForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInSearchOnProductForm.php @@ -12,12 +12,12 @@ use Magento\Catalog\Test\Page\Adminhtml\CatalogProductNew; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Checks that product attribute cannot be added to product template on Product Page via Add Attribute control. + * Checks that product attribute cannot be added to attribute set on Product Page via Add Attribute control. */ class AssertProductAttributeAbsenceInSearchOnProductForm extends AbstractConstraint { /** - * Assert that deleted attribute can't be added to product template on Product Page via Add Attribute control. + * Assert that deleted attribute can't be added to attribute set on Product Page via Add Attribute control. * * @param CatalogProductAttribute $productAttribute * @param CatalogProductIndex $productGrid diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInTemplateGroups.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInTemplateGroups.php index 821d96b2db2215c60fc3fc4cfa155f552806815a..3d865b5ccddd79ca047adc636ab1e8302842aaeb 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInTemplateGroups.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInTemplateGroups.php @@ -13,45 +13,45 @@ use Magento\Mtf\Constraint\AbstractConstraint; /** * Class AssertProductAttributeAbsenceInTemplateGroups - * Checks that product attribute isn't displayed in Product template's Groups section + * Checks that product attribute isn't displayed in Attribute set's Groups section */ class AssertProductAttributeAbsenceInTemplateGroups extends AbstractConstraint { /** - * Assert that deleted attribute isn't displayed in Product template's Groups section + * Assert that deleted attribute isn't displayed in Attribute set's Groups section * - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @param CatalogProductSetIndex $productSetIndex * @param CatalogProductSetEdit $productSetEdit * @return void */ public function processAssert( - CatalogAttributeSet $productTemplate, + CatalogAttributeSet $attributeSet, CatalogProductSetIndex $productSetIndex, CatalogProductSetEdit $productSetEdit ) { - $filter = ['set_name' => $productTemplate->getAttributeSetName()]; + $filter = ['set_name' => $attributeSet->getAttributeSetName()]; $productSetIndex->open(); $productSetIndex->getGrid()->searchAndOpen($filter); - $attributeCode = $productTemplate + $attributeCode = $attributeSet ->getDataFieldConfig('assigned_attributes')['source'] ->getAttributes()[0] ->getAttributeCode(); \PHPUnit_Framework_Assert::assertFalse( $productSetEdit->getAttributeSetEditBlock()->checkProductAttribute($attributeCode), - "Attribute " . $attributeCode . " is present in Product template's Groups section." + "Attribute " . $attributeCode . " is present in Attribute set's Groups section." ); } /** - * Text absent Product Attribute in Product template's Groups section + * Text absent Product Attribute in Attribute set's Groups section * * @return string */ public function toString() { - return "Product Attribute is absent in Product template's Groups section."; + return "Product Attribute is absent in Attribute set's Groups section."; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInUnassignedAttributes.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInUnassignedAttributes.php index d1f2f5e1eff19ed4e746ab1e8a2559be47318fc3..460d46cf55d1fca61d01ceeeacfc7e8dea29ade7 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInUnassignedAttributes.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeAbsenceInUnassignedAttributes.php @@ -13,45 +13,45 @@ use Magento\Mtf\Constraint\AbstractConstraint; /** * Class AssertProductAttributeAbsenceInUnassignedAttributes - * Checks that product attribute isn't displayed in Product template's Unassigned Attributes section + * Checks that product attribute isn't displayed in Attribute set's Unassigned Attributes section */ class AssertProductAttributeAbsenceInUnassignedAttributes extends AbstractConstraint { /** - * Assert that deleted attribute isn't displayed in Product template's Unassigned Attributes section + * Assert that deleted attribute isn't displayed in Attribute set's Unassigned Attributes section * - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @param CatalogProductSetIndex $productSetIndex * @param CatalogProductSetEdit $productSetEdit * @return void */ public function processAssert( - CatalogAttributeSet $productTemplate, + CatalogAttributeSet $attributeSet, CatalogProductSetIndex $productSetIndex, CatalogProductSetEdit $productSetEdit ) { - $filter = ['set_name' => $productTemplate->getAttributeSetName()]; + $filter = ['set_name' => $attributeSet->getAttributeSetName()]; $productSetIndex->open(); $productSetIndex->getGrid()->searchAndOpen($filter); - $attributeCode = $productTemplate + $attributeCode = $attributeSet ->getDataFieldConfig('assigned_attributes')['source'] ->getAttributes()[0] ->getAttributeCode(); \PHPUnit_Framework_Assert::assertFalse( $productSetEdit->getAttributeSetEditBlock()->checkUnassignedProductAttribute($attributeCode), - "Attribute " . $attributeCode . " is present in Unassigned Product template's section." + "Attribute " . $attributeCode . " is present in Unassigned Attribute set's section." ); } /** - * Text absent Product Attribute Unassigned Product template's section + * Text absent Product Attribute Unassigned Attribute set's section * * @return string */ public function toString() { - return "Product Attribute is absent in Unassigned Product template's section."; + return "Product Attribute is absent in Unassigned Attribute set's section."; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSaveMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSaveMessage.php index 96b39d0d964311cb38903bf3a3a9b52ce33cb5c4..97dab27640a02bffaa38f20ed772f2ba5f582cea 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSaveMessage.php @@ -14,6 +14,9 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertProductAttributeSaveMessage extends AbstractConstraint { + /** + * Product attribute success save message. + */ const SUCCESS_MESSAGE = 'You saved the product attribute.'; /** @@ -24,12 +27,13 @@ class AssertProductAttributeSaveMessage extends AbstractConstraint */ public function processAssert(CatalogProductAttributeIndex $attributeIndex) { + $actualMessage = $attributeIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $attributeIndex->getMessagesBlock()->getSuccessMessages(), + $actualMessage, 'Wrong success message is displayed.' . "\nExpected: " . self::SUCCESS_MESSAGE - . "\nActual: " . $attributeIndex->getMessagesBlock()->getSuccessMessages() + . "\nActual: " . $actualMessage ); } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php index e41e1b4ab6dd1a5990d28626bb999524a6c87fdc..c911e7f7b574c8b402728a16713114f5a297fe97 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php @@ -25,12 +25,13 @@ class AssertProductAttributeSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(CatalogProductAttributeIndex $attributeIndex) { + $actualMessage = $attributeIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $attributeIndex->getMessagesBlock()->getSuccessMessages(), + $actualMessage, 'Wrong success message is displayed.' . "\nExpected: " . self::SUCCESS_MESSAGE - . "\nActual: " . $attributeIndex->getMessagesBlock()->getSuccessMessages() + . "\nActual: " . $actualMessage ); } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessAddMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessAddMessage.php index 733c8b726597606c1a79be502085fb1eebafe0d7..20f0ee59b380c2afd6935cb68fcdfc2250bd0ff0 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessAddMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessAddMessage.php @@ -31,7 +31,7 @@ class AssertProductCompareSuccessAddMessage extends AbstractConstraint public function processAssert(CatalogProductView $catalogProductView, FixtureInterface $product) { $successMessage = sprintf(self::SUCCESS_MESSAGE, $product->getName()); - $actualMessage = $catalogProductView->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $catalogProductView->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( $successMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveAllProductsMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveAllProductsMessage.php index 9fe455b2f260a7bbf2ec0239f3c92a73b683a51b..bd63bb17bb8c86be4eb840534ca4ac81af59af72 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveAllProductsMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveAllProductsMessage.php @@ -24,7 +24,7 @@ class AssertProductCompareSuccessRemoveAllProductsMessage extends AbstractConstr */ public function processAssert(CatalogProductView $catalogProductView) { - $actualMessage = $catalogProductView->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $catalogProductView->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveMessage.php index dfe1e7530b8682a84f6eb3d14a9d317300c52379..64fa8a851e7b869e053e1b580c798d5f19a3526f 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareSuccessRemoveMessage.php @@ -28,7 +28,7 @@ class AssertProductCompareSuccessRemoveMessage extends AbstractConstraint public function processAssert(CatalogProductCompare $catalogProductCompare, FixtureInterface $product) { $successMessage = sprintf(self::SUCCESS_MESSAGE, $product->getName()); - $actualMessage = $catalogProductCompare->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $catalogProductCompare->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals($successMessage, $actualMessage, 'Wrong success message is displayed.'); } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicateMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicateMessage.php index 4c79e9f1a32629527c440a534c96722e6158acd0..1e034ca00527084dffb2572949f54f51018a5daa 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicateMessage.php @@ -28,7 +28,6 @@ class AssertProductDuplicateMessage extends AbstractConstraint public function processAssert(CatalogProductEdit $productPage) { $actualMessages = $productPage->getMessagesBlock()->getSuccessMessages(); - $actualMessages = is_array($actualMessages) ? $actualMessages : [$actualMessages]; \PHPUnit_Framework_Assert::assertContains( self::DUPLICATE_MESSAGE, $actualMessages, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicatedInGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicatedInGrid.php index 64fcf763899dc95f7d178fdc4261b07285f67b0f..59462fc83da81a765185c39886437f18f8b2a23c 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicatedInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductDuplicatedInGrid.php @@ -16,7 +16,7 @@ use Magento\Mtf\Fixture\FixtureInterface; class AssertProductDuplicatedInGrid extends AbstractConstraint { /** - * Assert that duplicated product is found by sku and has correct product type, product template, + * Assert that duplicated product is found by sku and has correct product type, attribute set, * product status disabled and out of stock * * @param FixtureInterface $product diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSaveMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSaveMessage.php index 21c5c2353c69563ccb7c4c1613295b0a127a6a20..fa73d7abeba62e53f623df53d784f81ebed65169 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSaveMessage.php @@ -28,7 +28,6 @@ class AssertProductSaveMessage extends AbstractConstraint public function processAssert(CatalogProductEdit $productPage) { $actualMessages = $productPage->getMessagesBlock()->getSuccessMessages(); - $actualMessages = is_array($actualMessages) ? $actualMessages : [$actualMessages]; \PHPUnit_Framework_Assert::assertContains( self::SUCCESS_MESSAGE, $actualMessages, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSuccessDeleteMessage.php index eb40dd8d4450c5281f01127f7f943f9b0c5263c5..17927acc9be86e4bf439a3fa25abfe4efee594b0 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductSuccessDeleteMessage.php @@ -31,7 +31,7 @@ class AssertProductSuccessDeleteMessage extends AbstractConstraint { $products = is_array($product) ? $product : [$product]; $deleteMessage = sprintf(self::SUCCESS_DELETE_MESSAGE, count($products)); - $actualMessage = $productPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $productPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( $deleteMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertUsedSuperAttributeImpossibleDeleteMessages.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertUsedSuperAttributeImpossibleDeleteMessages.php index bfd1c1bd9194ef96a2390bcd258b81a8143a0f1b..ce954986fa22ebc71b36afdcd6cf040e6adaf04e 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertUsedSuperAttributeImpossibleDeleteMessages.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertUsedSuperAttributeImpossibleDeleteMessages.php @@ -30,7 +30,7 @@ class AssertUsedSuperAttributeImpossibleDeleteMessages extends AbstractConstrain { \PHPUnit_Framework_Assert::assertEquals( self::ERROR_DELETE_MESSAGE, - $newPage->getMessagesBlock()->getErrorMessages(), + $newPage->getMessagesBlock()->getErrorMessage(), 'Wrong impossible to delete message is not displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/CustomAttribute.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/CustomAttribute.php index 1e9a5690533baef1822206cfdfa4f2d57ce134a5..d41542b0e75ac6b078ffba321f888b3c7865e6b0 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/CustomAttribute.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/CustomAttribute.php @@ -35,7 +35,12 @@ class CustomAttribute extends DataSource /** @var CatalogProductAttribute $data */ $data = $fixtureFactory->createByCode('catalogProductAttribute', ['dataset' => $data['dataset']]); } - $this->data['value'] = $this->getDefaultAttributeValue($data); + if (is_array($data) && isset($data['value'])) { + $this->data['value'] = $data['value']; + $data = $data['attribute']; + } else { + $this->data['value'] = $this->getDefaultAttributeValue($data); + } $this->data['code'] = $data->hasData('attribute_code') == false ? $this->createAttributeCode($data) : $data->getAttributeCode(); diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Product/AttributeSetId.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Product/AttributeSetId.php index 9a314c06e7d285c25dad13cf614d6317987a1d60..4865ef44562457ea5c3ef364fa1386a9b6919bac 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Product/AttributeSetId.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/Product/AttributeSetId.php @@ -11,7 +11,7 @@ use Magento\Mtf\Fixture\FixtureFactory; use Magento\Catalog\Test\Fixture\CatalogAttributeSet; /** - * Product template entity data source. + * Attribute set entity data source. * * Data keys: * - dataset diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/NavigateMenuTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/NavigateMenuTest.xml index f38ac7d9baf9c18ad79bdfb4944e4c5b358527c9..847a1f2c242e6cbc840de37609d98898dd308a48 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/NavigateMenuTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/NavigateMenuTest.xml @@ -23,8 +23,8 @@ <constraint name="Magento\Backend\Test\Constraint\AssertBackendPageIsAvailable"/> </variation> <variation name="NavigateMenuTest12"> - <data name="menuItem" xsi:type="string">Stores > Product Template</data> - <data name="pageTitle" xsi:type="string">Product Templates</data> + <data name="menuItem" xsi:type="string">Stores > Attribute Set</data> + <data name="pageTitle" xsi:type="string">Attribute Sets</data> <constraint name="Magento\Backend\Test\Constraint\AssertBackendPageIsAvailable"/> </variation> </testCase> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml index 7e106eb611f86ddb15c13da1611ed7bbbc64d3f0..2aa04810e18e1a326aeb75c87ff6995f70d97511 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AddCompareProductsTest.xml @@ -21,7 +21,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" /> </variation> <variation name="AddCompareProductsTestVariation3"> - <data name="products" xsi:type="string">configurableProduct::default</data> + <data name="products" xsi:type="string">configurableProduct::configurable_with_qty_1</data> <data name="isCustomerLoggedIn" xsi:type="string">Yes</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductCompareItemsLink" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductComparePage" /> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml index 97aee8c72ce214831cfb85b0cf9364031e8b3060..3741b98795180871fad2d9995a291d312de102dc 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml @@ -441,7 +441,6 @@ <data name="product/data/name" xsi:type="string">Simple Product %isolation%</data> <data name="product/data/sku" xsi:type="string">simple_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">10</data> - <data name="product/data/stock_data/manage_stock" xsi:type="string">Yes</data> <data name="product/data/stock_data/qty" xsi:type="string">1</data> <data name="tag" xsi:type="string">test_type:acceptance_test</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.php index 7ddb966ed99a38aed91201c7cb802a182f26d2b3..835086f15fa8d575fbfa0483ed570ee28f16bce8 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.php @@ -18,12 +18,12 @@ use Magento\Mtf\TestCase\Injectable; * * Test Flow: * 1. Log in to Backend. - * 2. Navigate to Stores > Attributes > Product Template. - * 3. Start to create new Product Template. + * 2. Navigate to Stores > Attributes > Attribute Set. + * 3. Start to create new Attribute Set. * 4. Fill out fields data according to data set. - * 5. Add created Product Attribute to Product Template. - * 6. Save new Product Template. - * 7. Verify created Product Template. + * 5. Add created Product Attribute to Attribute Set. + * 6. Save new Attribute Set. + * 7. Verify created Attribute Set. * * @group Product_Attributes_(MX) * @ZephyrId MAGETWO-25104 diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml index 68b4d38d82e36065fd6c206f58d7966f45ce8661..2db56cfeb2012c7c1c8a26487403f349d8329274 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml @@ -6,14 +6,14 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\CreateAttributeSetEntityTest" summary="Create Attribute Set (Product Template)" ticketId="MAGETWO-25104"> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\CreateAttributeSetEntityTest" summary="Create Attribute Set (Attribute Set)" ticketId="MAGETWO-25104"> <variation name="CreateAttributeSetEntityTestVariation1"> - <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplate%isolation%</data> + <data name="attributeSet/data/attribute_set_name" xsi:type="string">AttributeSet%isolation%</data> <data name="attributeSet/data/skeleton_set/dataset" xsi:type="string">default</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetSuccessSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetInGrid" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetOnProductForm" /> </variation> </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityFromProductPageTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityFromProductPageTest.xml index 007e25239d731a8a14631bec029e21a85411bcb3..d58f5e1afefbbfde16f9e47a9f562dfe561ed152 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityFromProductPageTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityFromProductPageTest.xml @@ -41,6 +41,9 @@ <data name="attribute/data/is_global" xsi:type="string">Global</data> <data name="attribute/data/is_filterable" xsi:type="string">Filterable (with results)</data> <data name="attribute/data/is_filterable_in_search" xsi:type="string">Yes</data> + <data name="assertProduct/data/name" xsi:type="string">Product name</data> + <data name="assertProduct/data/sku" xsi:type="string">product-sku</data> + <data name="assertProduct/data/price" xsi:type="string">25</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterable" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterableInSearch" /> <constraint name="Magento\ConfigurableProduct\Test\Constraint\AssertProductAttributeIsConfigurable" /> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml index b945d770fe82d5992ca0a769a3da02da2da2a10d..328d270d0c9f0fdb3dea6fad1dcad9e40044fe30 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.xml @@ -8,7 +8,7 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\CreateProductAttributeEntityTest" summary="Create Product Attribute" ticketId="MAGETWO-24767"> <variation name="CreateProductAttributeEntityTestVariation1"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Text_Field_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Text Field</data> <data name="productAttribute/data/is_required" xsi:type="string">No</data> @@ -19,7 +19,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> </variation> <variation name="CreateProductAttributeEntityTestVariation2"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Text_Field_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Text Area</data> <data name="productAttribute/data/is_required" xsi:type="string">Yes</data> @@ -41,7 +41,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsComparable" /> </variation> <variation name="CreateProductAttributeEntityTestVariation3"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Date_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Date</data> <data name="productAttribute/data/is_required" xsi:type="string">No</data> @@ -64,7 +64,7 @@ <constraint name="Magento\CatalogRule\Test\Constraint\AssertProductAttributeIsUsedPromoRules" /> </variation> <variation name="CreateProductAttributeEntityTestVariation4"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Yes/No_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Yes/No</data> <data name="productAttribute/data/is_required" xsi:type="string">Yes</data> @@ -80,7 +80,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> </variation> <variation name="CreateProductAttributeEntityTestVariation5"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Multiple_Select_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Multiple Select</data> <data name="productAttribute/data/options/dataset" xsi:type="string">default</data> @@ -109,7 +109,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeOptionsOnProductForm" /> </variation> <variation name="CreateProductAttributeEntityTestVariation6"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Dropdown_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Dropdown</data> <data name="productAttribute/data/options/dataset" xsi:type="string">default</data> @@ -126,6 +126,9 @@ <data name="productAttribute/data/is_visible_on_front" xsi:type="string">Yes</data> <data name="productAttribute/data/used_in_product_listing" xsi:type="string">Yes</data> <data name="productAttribute/data/used_for_sort_by" xsi:type="string">Yes</data> + <data name="assertProduct/data/name" xsi:type="string">Product name</data> + <data name="assertProduct/data/sku" xsi:type="string">product-sku</data> + <data name="assertProduct/data/price" xsi:type="string">25</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeForm" /> <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> @@ -142,7 +145,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeOptionsOnProductForm" /> </variation> <variation name="CreateProductAttributeEntityTestVariation7"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Price_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Price</data> <data name="productAttribute/data/is_required" xsi:type="string">No</data> @@ -154,16 +157,16 @@ <data name="productAttribute/data/is_comparable" xsi:type="string">No</data> <data name="productAttribute/data/is_filterable" xsi:type="string">Filterable (with results)</data> <data name="productAttribute/data/is_filterable_in_search" xsi:type="string">Yes</data> + <data name="attributeValue" xsi:type="number">15</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeForm" /> <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> - <constraint name="Magento\CatalogSearch\Test\Constraint\AssertAttributeSearchableByLabel" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeDisplayingOnSearchForm" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterable" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeIsFilterableInSearch" /> </variation> <variation name="CreateProductAttributeEntityTestVariation8"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Fixed_Product_Tax_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Fixed Product Tax</data> <data name="productAttribute/data/attribute_code" xsi:type="string">attr_fpt_code_%isolation%</data> @@ -173,7 +176,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> </variation> <variation name="CreateProductAttributeEntityTestVariation9"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttribute/data/frontend_label" xsi:type="string">Text_Field_Admin_%isolation%</data> <data name="productAttribute/data/frontend_input" xsi:type="string">Text Field</data> <data name="productAttribute/data/is_required" xsi:type="string">Yes</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.php index a3c0028f6e70c13d348e9db060bbf528c24209d8..32b9303f802a36ebeb4c43bc7ee4fe2cb15a2160 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.php @@ -13,7 +13,7 @@ use Magento\Mtf\TestCase\Injectable; /** * Preconditions: - * 1. Create Product template, based on Default. + * 1. Create Attribute set, based on Default. * 2. Create product attribute and add to created template. * * Test Flow: @@ -64,14 +64,14 @@ class DeleteAssignedToTemplateProductAttributeTest extends Injectable /** * Run test. * - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @return array */ - public function test(CatalogAttributeSet $productTemplate) + public function test(CatalogAttributeSet $attributeSet) { // Precondition - $productTemplate->persist(); - $attribute = $productTemplate->getDataFieldConfig('assigned_attributes')['source']->getAttributes()[0]; + $attributeSet->persist(); + $attribute = $attributeSet->getDataFieldConfig('assigned_attributes')['source']->getAttributes()[0]; // Steps $filter = ['attribute_code' => $attribute->getAttributeCode()]; @@ -80,6 +80,6 @@ class DeleteAssignedToTemplateProductAttributeTest extends Injectable $this->attributeNew->getPageActions()->delete(); $this->attributeNew->getModalBlock()->acceptAlert(); - return ['productTemplate' => $productTemplate, 'attribute' => $attribute]; + return ['attributeSet' => $attributeSet, 'attribute' => $attribute]; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.xml index 75b7694459abb5885d8dd3d12f3440888773ff2a..64961fdd6d4f3a50fbe0db726d29b4a8af1d1ee8 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAssignedToTemplateProductAttributeTest.xml @@ -8,16 +8,19 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\DeleteAssignedToTemplateProductAttributeTest" summary="Delete Assigned to Template Product Attribute" ticketId="MAGETWO-26011"> <variation name="DeleteAssignedToTemplateProductAttributeTestVariation1"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> - <data name="productTemplate/data/assigned_attributes/dataset" xsi:type="string">attribute_type_dropdown</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/data/assigned_attributes/dataset" xsi:type="string">attribute_type_dropdown</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSuccessDeleteMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeAbsenceInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeAbsenceInTemplateGroups" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeAbsenceInUnassignedAttributes" /> </variation> <variation name="DeleteAssignedToTemplateProductAttributeTestVariation2"> - <data name="productTemplate/dataset" xsi:type="string">default</data> - <data name="productTemplate/data/assigned_attributes/dataset" xsi:type="string">attribute_type_text_field</data> + <data name="attributeSet/dataset" xsi:type="string">default</data> + <data name="attributeSet/data/assigned_attributes/dataset" xsi:type="string">attribute_type_text_field</data> + <data name="assertProduct/data/name" xsi:type="string">Product name</data> + <data name="assertProduct/data/sku" xsi:type="string">product-sku</data> + <data name="assertProduct/data/price" xsi:type="string">25</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSuccessDeleteMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeAbsenceInGrid" /> <constraint name="Magento\ConfigurableProduct\Test\Constraint\AssertProductAttributeAbsenceInVariationsSearch" /> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.php index d996e70adb41097c9c62ff5f37f52c5cfb7d4760..b6c3875db64af917d5f940e0f55456bd5070bc79 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.php @@ -13,7 +13,7 @@ use Magento\Mtf\Fixture\FixtureFactory; use Magento\Mtf\TestCase\Injectable; /** - * Test Creation for Delete Attribute Set (Product Template) + * Test Creation for Delete Attribute Set (Attribute Set) * * Preconditions: * 1. An attribute is created. @@ -22,8 +22,8 @@ use Magento\Mtf\TestCase\Injectable; * * Test Flow: * 1. Log in to Backend. - * 2. Navigate to Stores > Attributes > Product Template. - * 3. Open created Product Template. + * 2. Navigate to Stores > Attributes > Attribute Set. + * 3. Open created Attribute Set. * 4. Click 'Delete' button. * 5. Perform all assertions. * @@ -70,26 +70,26 @@ class DeleteAttributeSetTest extends Injectable * Run DeleteAttributeSet test * * @param FixtureFactory $fixtureFactory - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @return array */ - public function test(FixtureFactory $fixtureFactory, CatalogAttributeSet $productTemplate) + public function test(FixtureFactory $fixtureFactory, CatalogAttributeSet $attributeSet) { // Precondition - $productTemplate->persist(); + $attributeSet->persist(); $product = $fixtureFactory->createByCode( 'catalogProductSimple', [ 'dataset' => 'default', 'data' => [ - 'attribute_set_id' => ['attribute_set' => $productTemplate], + 'attribute_set_id' => ['attribute_set' => $attributeSet], ], ] ); $product->persist(); // Steps - $filter = ['set_name' => $productTemplate->getAttributeSetName()]; + $filter = ['set_name' => $attributeSet->getAttributeSetName()]; $this->productSetIndex->open(); $this->productSetIndex->getGrid()->searchAndOpen($filter); $this->productSetEdit->getPageActions()->delete(); diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.xml index b4e1608eef6ac7612ace94d17441871b6923a2ed..b10b1444aa30daa3159fffe8cfb7fdd9141af889 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/DeleteAttributeSetTest.xml @@ -6,13 +6,13 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\DeleteAttributeSetTest" summary="Delete Attribute Set (Product Template)" ticketId="MAGETWO-25473"> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\DeleteAttributeSetTest" summary="Delete Attribute Set (Attribute Set)" ticketId="MAGETWO-25473"> <variation name="DeleteAttributeSetTestVariation1"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> - <data name="productTemplate/data/assigned_attributes/dataset" xsi:type="string">default</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/data/assigned_attributes/dataset" xsi:type="string">default</data> <data name="product/dataset" xsi:type="string">default</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessDeleteMessage" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateNotInGrid" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetSuccessDeleteMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetNotInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductNotInGrid" /> </variation> </testCase> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.php index 0939c76aadbe4c131169f2cbb7bed5ffc2d95a65..96b3e5971e1d6d661b789c8895646a22868ddd62 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.php @@ -21,12 +21,12 @@ use Magento\Mtf\TestCase\Injectable; * * Test Flow: * 1. Log in to Backend. - * 2. Navigate to Stores > Attributes > Product Template. - * 3. Open created Product Template. + * 2. Navigate to Stores > Attributes > Attribute Set. + * 3. Open created Attribute Set. * 4. Click 'Add New' button to create new group * 5. Add created Product Attribute to created group. * 6. Fill out other fields data according to data set. - * 7. Save Product Template. + * 7. Save Attribute Set. * 8. Preform all assertions. * * @group Product_Attributes_(MX) @@ -69,7 +69,7 @@ class UpdateAttributeSetTest extends Injectable } /** - * Run UpdateProductTemplate test + * Run UpdateAttributeSet test * * @param CatalogAttributeSet $attributeSet * @param CatalogAttributeSet $attributeSetOriginal diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml index 7a24dab72439588f6480959d2ee73229223140ea..4c10e0aa85c72d428c30ab8038170dc2fe766262 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml @@ -6,17 +6,17 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateAttributeSetTest" summary="Update Product Template" ticketId="MAGETWO-26251"> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateAttributeSetTest" summary="Update Attribute Set" ticketId="MAGETWO-26251"> <variation name="UpdateAttributeSetTestVariation1"> - <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplateEdit1%isolation%</data> + <data name="attributeSet/data/attribute_set_name" xsi:type="string">AttributeSetEdit1%isolation%</data> <data name="attributeSet/data/group" xsi:type="string">Custom-group%isolation%</data> <data name="attributeSetOriginal/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttributeOriginal/dataset" xsi:type="string">attribute_type_text_field</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateGroupOnProductForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetSuccessSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetInGrid" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetOnProductForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAttributeSetGroupOnProductForm" /> </variation> </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.php index 755ff5eb886e3548425a84dec20644430f4b9330..d3b51ebdce2cc33be18ba574bf2a546534f14e69 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.php @@ -18,7 +18,7 @@ use Magento\Mtf\TestCase\Injectable; * Preconditions: * Dataset : AttributeOptions * 1. Attribute is created (Attribute) - * 2. Attribute set is created (Product Template) + * 2. Attribute set is created (Attribute Set) * * Test Flow: * 1. Log in to Backend. @@ -61,7 +61,7 @@ class UpdateProductAttributeEntityTest extends Injectable * * @param CatalogProductAttribute $productAttributeOriginal * @param CatalogProductAttribute $attribute - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @param CatalogProductAttributeIndex $attributeIndex * @param CatalogProductAttributeNew $attributeNew * @param CatalogProductSimple $productSimple @@ -70,13 +70,13 @@ class UpdateProductAttributeEntityTest extends Injectable public function testUpdateProductAttribute( CatalogProductAttribute $productAttributeOriginal, CatalogProductAttribute $attribute, - CatalogAttributeSet $productTemplate, + CatalogAttributeSet $attributeSet, CatalogProductAttributeIndex $attributeIndex, CatalogProductAttributeNew $attributeNew, CatalogProductSimple $productSimple ) { //Precondition - $productTemplate->persist(); + $attributeSet->persist(); $productAttributeOriginal->persist(); $filter = [ @@ -91,7 +91,7 @@ class UpdateProductAttributeEntityTest extends Injectable $attribute = $this->prepareAttribute($attribute, $productAttributeOriginal); $productSimple->persist(); - return ['product' => $this->prepareProduct($productSimple, $attribute, $productTemplate)]; + return ['product' => $this->prepareProduct($productSimple, $attribute, $attributeSet)]; } /** @@ -99,13 +99,13 @@ class UpdateProductAttributeEntityTest extends Injectable * * @param CatalogProductSimple $product * @param CatalogProductAttribute $attribute - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @return CatalogProductSimple */ - protected function prepareProduct($product, $attribute, $productTemplate) + protected function prepareProduct($product, $attribute, $attributeSet) { $data = [ - 'attribute_set_id' => ['attribute_set' => $productTemplate], + 'attribute_set_id' => ['attribute_set' => $attributeSet], 'custom_attribute' => $attribute ]; $data = array_merge($data, $product->getData()); diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml index 63dabf015796e34f589b4ac24a2ac9188da26507..e58233de491d59dc45764d5db260528f7abc077f 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml @@ -8,7 +8,7 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateProductAttributeEntityTest" summary="Update Product Attribute" ticketId="MAGETWO-23459"> <variation name="UpdateProductAttributeEntityTestVariation1"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttributeOriginal/dataset" xsi:type="string">attribute_type_text_field</data> <data name="attribute/data/frontend_label" xsi:type="string">Text_Field_%isolation%</data> <data name="attribute/data/is_required" xsi:type="string">Yes</data> @@ -28,7 +28,7 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> </variation> <variation name="UpdateProductAttributeEntityTestVariation2"> - <data name="productTemplate/dataset" xsi:type="string">custom_attribute_set</data> + <data name="attributeSet/dataset" xsi:type="string">custom_attribute_set</data> <data name="productAttributeOriginal/dataset" xsi:type="string">attribute_type_dropdown</data> <data name="attribute/data/frontend_label" xsi:type="string">Dropdown_%isolation%</data> <data name="attribute/data/options/dataset" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/AddAttributeToProductTemplateStep.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/AddAttributeToAttributeSetStep.php similarity index 79% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/AddAttributeToProductTemplateStep.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/AddAttributeToAttributeSetStep.php index 3d5aa19186cec9f6a342ae492fd60df73e1b6f38..44126f9a153115cf82bb4374a6f78da7ccee93c5 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/AddAttributeToProductTemplateStep.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/AddAttributeToAttributeSetStep.php @@ -18,7 +18,7 @@ use Magento\Mtf\TestStep\TestStepInterface; /** * Move attribute To attribute set. */ -class AddAttributeToProductTemplateStep implements TestStepInterface +class AddAttributeToAttributeSetStep implements TestStepInterface { /** * Catalog ProductSet Index page. @@ -46,7 +46,7 @@ class AddAttributeToProductTemplateStep implements TestStepInterface * * @var CatalogAttributeSet */ - protected $productTemplate; + protected $attributeSet; /** * Catalog Product Index page. @@ -62,32 +62,42 @@ class AddAttributeToProductTemplateStep implements TestStepInterface */ protected $catalogProductEdit; + /** + * Custom attribute value to set while product creation. + * + * @var mixed + */ + protected $attributeValue; + /** * @constructor * @param CatalogProductSetIndex $catalogProductSetIndex * @param CatalogProductSetEdit $catalogProductSetEdit * @param CatalogProductAttribute $attribute - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @param FixtureFactory $fixtureFactory * @param CatalogProductIndex $catalogProductIndex * @param CatalogProductEdit $catalogProductEdit + * @param mixed $attributeValue [optional] */ public function __construct( CatalogProductSetIndex $catalogProductSetIndex, CatalogProductSetEdit $catalogProductSetEdit, CatalogProductAttribute $attribute, - CatalogAttributeSet $productTemplate, + CatalogAttributeSet $attributeSet, FixtureFactory $fixtureFactory, CatalogProductIndex $catalogProductIndex, - CatalogProductEdit $catalogProductEdit + CatalogProductEdit $catalogProductEdit, + $attributeValue = null ) { $this->catalogProductSetIndex = $catalogProductSetIndex; $this->catalogProductSetEdit = $catalogProductSetEdit; $this->attribute = $attribute; - $this->productTemplate = $productTemplate; + $this->attributeSet = $attributeSet; $this->fixtureFactory = $fixtureFactory; $this->catalogProductIndex = $catalogProductIndex; $this->catalogProductEdit = $catalogProductEdit; + $this->attributeValue = $attributeValue; } /** @@ -97,19 +107,23 @@ class AddAttributeToProductTemplateStep implements TestStepInterface */ public function run() { - $filterAttribute = ['set_name' => $this->productTemplate->getAttributeSetName()]; + $filterAttribute = ['set_name' => $this->attributeSet->getAttributeSetName()]; $this->catalogProductSetIndex->open()->getGrid()->searchAndOpen($filterAttribute); $this->catalogProductSetEdit->getAttributeSetEditBlock()->moveAttribute($this->attribute->getData()); $this->catalogProductSetEdit->getPageActions()->save(); // Create product with attribute set mentioned above: + $customAttribute = $this->attribute; + if ($this->attributeValue !== null) { + $customAttribute = ['value' => $this->attributeValue, 'attribute' => $customAttribute]; + } $product = $this->fixtureFactory->createByCode( 'catalogProductSimple', [ 'dataset' => 'product_with_category_with_anchor', 'data' => [ - 'attribute_set_id' => ['attribute_set' => $this->productTemplate], - 'custom_attribute' => $this->attribute + 'attribute_set_id' => ['attribute_set' => $this->attributeSet], + 'custom_attribute' => $customAttribute ], ] ); diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/CreateProductTemplateStep.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/CreateAttributeSetStep.php similarity index 62% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/CreateProductTemplateStep.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/CreateAttributeSetStep.php index e8b106042af164484fbc0f73c6ad92deba48eafc..d844cccdc24e195a07befafdebf90515dfa0a46a 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/CreateProductTemplateStep.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/CreateAttributeSetStep.php @@ -12,24 +12,24 @@ use Magento\Mtf\TestStep\TestStepInterface; /** * Create product attribute template using handler. */ -class CreateProductTemplateStep implements TestStepInterface +class CreateAttributeSetStep implements TestStepInterface { /** * CatalogAttributeSet fixture. * * @var string */ - protected $productTemplate; + protected $attributeSet; /** * Preparing step properties. * * @constructor - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet */ - public function __construct(CatalogAttributeSet $productTemplate) + public function __construct(CatalogAttributeSet $attributeSet) { - $this->productTemplate = $productTemplate; + $this->attributeSet = $attributeSet; } /** @@ -39,8 +39,8 @@ class CreateProductTemplateStep implements TestStepInterface */ public function run() { - $this->productTemplate->persist(); + $this->attributeSet->persist(); - return ['productTemplate' => $this->productTemplate]; + return ['attributeSet' => $this->attributeSet]; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/SaveProductTemplateStep.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/SaveAttributeSetStep.php similarity index 93% rename from dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/SaveProductTemplateStep.php rename to dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/SaveAttributeSetStep.php index 759f036f3f818a5e024b9ae80253c4d0895737eb..2b7e0ac641f20cbda67cd693cc3696d5e4ea62c4 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/SaveProductTemplateStep.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestStep/SaveAttributeSetStep.php @@ -12,7 +12,7 @@ use Magento\Mtf\TestStep\TestStepInterface; /** * Save attributeSet on attribute set page. */ -class SaveProductTemplateStep implements TestStepInterface +class SaveAttributeSetStep implements TestStepInterface { /** * Catalog ProductSet Edit page. diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml index 92c41c11a06ef9e15ec3f1f2fa85775387f59ee3..aaf0ac2bcbda12b35e15d84c59dd1cd0c8c9e0fd 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/di.xml @@ -76,22 +76,22 @@ <argument name="severity" xsi:type="string">middle</argument> </arguments> </type> - <type name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage"> + <type name="Magento\Catalog\Test\Constraint\AssertAttributeSetSuccessSaveMessage"> <arguments> <argument name="severity" xsi:type="string">high</argument> </arguments> </type> - <type name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm"> + <type name="Magento\Catalog\Test\Constraint\AssertAttributeSetForm"> <arguments> <argument name="severity" xsi:type="string">high</argument> </arguments> </type> - <type name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid"> + <type name="Magento\Catalog\Test\Constraint\AssertAttributeSetInGrid"> <arguments> <argument name="severity" xsi:type="string">high</argument> </arguments> </type> - <type name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm"> + <type name="Magento\Catalog\Test\Constraint\AssertAttributeSetOnProductForm"> <arguments> <argument name="severity" xsi:type="string">high</argument> </arguments> @@ -126,7 +126,7 @@ <argument name="severity" xsi:type="string">high</argument> </arguments> </type> - <type name="Magento\Catalog\Test\Constraint\AssertProductTemplateGroupOnProductForm"> + <type name="Magento\Catalog\Test\Constraint\AssertAttributeSetGroupOnProductForm"> <arguments> <argument name="severity" xsi:type="string">high</argument> </arguments> @@ -136,7 +136,7 @@ <argument name="severity" xsi:type="string">high</argument> </arguments> </type> - <type name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessDeleteMessage"> + <type name="Magento\Catalog\Test\Constraint\AssertAttributeSetSuccessDeleteMessage"> <arguments> <argument name="severity" xsi:type="string">high</argument> </arguments> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/testcase.xml index 4e02d8c777cdae0624fb21d771f32920a66a3c69..c1d721c45f35024071b54adffd8335758edacaa8 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/testcase.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/etc/testcase.xml @@ -16,12 +16,12 @@ <step name="setDefaultAttributeValue" module="Magento_Catalog" next="saveProduct"/> <step name="saveProduct" module="Magento_Catalog"/> </scenario> - <scenario name="CreateProductAttributeEntityTest" firstStep="createProductTemplate"> - <step name="createProductTemplate" module="Magento_Catalog" next="openProductAttributesPage"/> + <scenario name="CreateProductAttributeEntityTest" firstStep="createAttributeSet"> + <step name="createAttributeSet" module="Magento_Catalog" next="openProductAttributesPage"/> <step name="openProductAttributesPage" module="Magento_Catalog" next="addNewAttribute"/> <step name="addNewAttribute" module="Magento_Catalog" next="fillAttributeForm"/> <step name="fillAttributeForm" module="Magento_Catalog" next="saveAttribute"/> - <step name="saveAttribute" module="Magento_Catalog" next="addAttributeToProductTemplate"/> - <step name="addAttributeToProductTemplate" module="Magento_Catalog"/> + <step name="saveAttribute" module="Magento_Catalog" next="addAttributeToAttributeSet"/> + <step name="addAttributeToAttributeSet" module="Magento_Catalog"/> </scenario> </config> diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php index 889735d7f2eabbe38d02c2ba382023820e2e5d6a..813711e273f3da69b8094cc4eae19b69d85cf782 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php @@ -28,7 +28,7 @@ class AssertCatalogPriceRuleNoticeMessage extends AbstractConstraint public function processAssert( CatalogRuleIndex $pageCatalogRuleIndex ) { - $actualMessage = $pageCatalogRuleIndex->getMessagesBlock()->getNoticeMessages(); + $actualMessage = $pageCatalogRuleIndex->getMessagesBlock()->getNoticeMessage(); \PHPUnit_Framework_Assert::assertEquals( self::NOTICE_MESSAGE_RULES . self::NOTICE_MESSAGE_APPLY, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php index f8531c5540c3ff4acb4dd8bdff33042766153cec..9b0f07e848f450bf61528b61abbc72778ca9a58d 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertCatalogPriceRuleSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(CatalogRuleIndex $pageCatalogRuleIndex) { - $actualMessage = $pageCatalogRuleIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $pageCatalogRuleIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php index a1cdb0e31bd9f1ebb4e32b957d011af5dd4224f4..23418a8638b558323ebc8f4c183b9598e933ba0a 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php @@ -25,9 +25,6 @@ class AssertCatalogPriceRuleSuccessSaveMessage extends AbstractConstraint public function processAssert(CatalogRuleIndex $pageCatalogRuleIndex) { $actualMessages = $pageCatalogRuleIndex->getMessagesBlock()->getSuccessMessages(); - if (!is_array($actualMessages)) { - $actualMessages = [$actualMessages]; - } \PHPUnit_Framework_Assert::assertContains( self::SUCCESS_MESSAGE, $actualMessages, diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessDeleteMessage.php index 0177e5d8860f9307eb70b795272d727d3ec36c6b..8531933cebe683d5c1baf866f8eb5a369d274afe 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessDeleteMessage.php @@ -32,11 +32,13 @@ class AssertSearchTermSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(CatalogSearchIndex $indexPage) { - $actualMessage = $indexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $indexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, 'Wrong success message is displayed.' + . "\nExpected: " . self::SUCCESS_DELETE_MESSAGE + . "\nActual: " . $actualMessage ); } diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessMassDeleteMessage.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessMassDeleteMessage.php index 4a6a3623910a4d6edb8dbbac672d8ed230ef5f2c..425c019d942ecda02f9152cb924b06ef779e981f 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessMassDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessMassDeleteMessage.php @@ -28,12 +28,14 @@ class AssertSearchTermSuccessMassDeleteMessage extends AbstractConstraint */ public function processAssert(array $searchTerms, CatalogSearchIndex $indexPage) { - $actualMessage = $indexPage->getMessagesBlock()->getSuccessMessages(); - $successMessages = sprintf(self::SUCCESS_MESSAGE, count($searchTerms)); + $actualMessage = $indexPage->getMessagesBlock()->getSuccessMessage(); + $expectedMessage = sprintf(self::SUCCESS_MESSAGE, count($searchTerms)); \PHPUnit_Framework_Assert::assertEquals( - $successMessages, + $expectedMessage, $actualMessage, 'Wrong success message is displayed.' + . "\nExpected: " . $expectedMessage + . "\nActual: " . $actualMessage ); } diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessSaveMessage.php index d80a6eab3d89d3f5164f81f97b6477f58637cc1b..7316f846b6cb67d5abe8de3e86c4f099845af5f1 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertSearchTermSuccessSaveMessage.php @@ -28,7 +28,7 @@ class AssertSearchTermSuccessSaveMessage extends AbstractConstraint */ public function processAssert(CatalogSearchIndex $indexPage) { - $actualMessage = $indexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $indexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Sidebar/Item.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Sidebar/Item.php index 43dbd23499a0d866f2fdf999c086716d20d79a4d..f49a19118ed2526cd7e4ec9666523bc5a5f8cf46 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Sidebar/Item.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Sidebar/Item.php @@ -47,6 +47,7 @@ class Item extends Sidebar /** @var \Magento\Ui\Test\Block\Adminhtml\Modal $modal */ $modal = $this->blockFactory->create('Magento\Ui\Test\Block\Adminhtml\Modal', ['element' => $element]); $modal->acceptAlert(); + $modal->waitModalWindowToDisappear(); } /** diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertAddedProductToCartSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertAddedProductToCartSuccessMessage.php index af0f03c0247ee993f1d54f7ac3a4addcc2157507..80f275de861285aa1760d6a6c56760b0da46d187 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertAddedProductToCartSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertAddedProductToCartSuccessMessage.php @@ -32,7 +32,7 @@ class AssertAddedProductToCartSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_MESSAGE, $product->getName()), - $checkoutCart->getMessagesBlock()->getSuccessMessages() + $checkoutCart->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php index eb57e0ac4719d8257841954818bc18de7ad62d78..f3b0e8cbae186de1952c854463d71ea8ac28912d 100644 --- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php @@ -30,7 +30,7 @@ class AssertTermSuccessDeleteMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, - $agreementIndex->getMessagesBlock()->getSuccessMessages(), + $agreementIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success delete message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php index ba715ffa968962e59c6d8a4866341dd14fb1226a..c55619144c7033dd5d59d11b6be6acc2ec0fd9c8 100644 --- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php @@ -30,7 +30,7 @@ class AssertTermSuccessSaveMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_SAVE_MESSAGE, - $agreementIndex->getMessagesBlock()->getSuccessMessages(), + $agreementIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php index 965b7fe07cc7b0eabce9f99a47f54cca093bcdd9..edd10f3fe5086cc71f6098128dc4e7542fb17362 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php @@ -24,7 +24,7 @@ class AssertCmsBlockDeleteMessage extends AbstractConstraint */ public function processAssert(CmsBlockIndex $cmsBlockIndex) { - $actualMessage = $cmsBlockIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $cmsBlockIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php index 1c2696d6ed3c527b3d1cb0addc79095bf025342e..374c9b98527b49f02235f1f2735f53885499c0b5 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertCmsBlockSuccessSaveMessage extends AbstractConstraint */ public function processAssert(CmsBlockIndex $cmsBlockIndex) { - $actualMessage = $cmsBlockIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $cmsBlockIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_SAVE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDeleteMessage.php index ff01fa41f99e1990308af033ed5ba5b4c94d5ae9..7139477fb9703e264b094d8aa8b065df77f50bcd 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDeleteMessage.php @@ -24,7 +24,7 @@ class AssertCmsPageDeleteMessage extends AbstractConstraint */ public function processAssert(CmsPageIndex $cmsIndex) { - $actualMessage = $cmsIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $cmsIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDuplicateErrorMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDuplicateErrorMessage.php index 97e5247f658a8ce1d47dd5fdd62aaffb5b14ad9c..bd0af6ef0a3a2f029d09298acd64e1090a508f0c 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDuplicateErrorMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageDuplicateErrorMessage.php @@ -24,7 +24,7 @@ class AssertCmsPageDuplicateErrorMessage extends AbstractConstraint */ public function processAssert(CmsPageIndex $cmsIndex) { - $message = $cmsIndex->getMessagesBlock()->getErrorMessages(); + $message = $cmsIndex->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( self::ERROR_SAVE_MESSAGE, $message, diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php index c57528db3735163ef8a94fdf34e6370ddaf8426b..957ec384c4325ab368452c357adffa37ffaadde8 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertCmsPageSuccessSaveMessage extends AbstractConstraint */ public function processAssert(CmsPageIndex $cmsIndex) { - $actualMessage = $cmsIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $cmsIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_SAVE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config.php index 846c920cd94396e9334c550295e5506257157133..503ee7b9be2242c5c1d188755fb7b115d032eeb3 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config.php @@ -60,14 +60,21 @@ class Config extends Tab * * @var string */ - protected $attributeElement = '.entry-edit.have-price'; + protected $attributeElement = 'tr[data-row-number]'; /** * Delete variation button selector. * * @var string */ - protected $deleteVariationButton = '.action-delete'; + protected $deleteVariation = '[data-bind*="removeProduct"]'; + + /** + * Action menu + * + * @var string + */ + protected $actionMenu = '.action-select'; /** * Variations content selector. @@ -98,7 +105,7 @@ class Config extends Tab foreach ($attributesValue as $key => $value) { $attributesValue[$key] = array_merge($value, $attributes['attributes_data'][$key]); } - $this->_rootElement->find($this->createConfigurationsButton)->click(); + $this->createConfigurations(); $this->getAttributeBlock()->fillAttributes($attributesValue); if (!empty($attributes['matrix'])) { $this->generateVariations(); @@ -122,6 +129,16 @@ class Config extends Tab } } + /** + * Click 'Create Configurations' button. + * + * @return void + */ + public function createConfigurations() + { + $this->_rootElement->find($this->createConfigurationsButton)->click(); + } + /** * Generate variations. * @@ -199,9 +216,10 @@ class Config extends Tab public function deleteAttributes() { $attributeElements = $this->_rootElement->getElements($this->attributeElement); - $this->_rootElement->find($this->variationsContent)->click(); foreach (array_reverse($attributeElements) as $element) { - $element->find($this->deleteVariationButton)->click(); + $element->find($this->actionMenu)->hover(); + $element->find($this->actionMenu)->click(); + $element->find($this->deleteVariation)->click(); } } } diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php index be8653668f1d5b4e9acda2c83d357a73b8d5e762..4f1aa888773a48ccecce1ec79f612003ecb7dc22 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php @@ -160,16 +160,26 @@ class Attribute extends Form */ public function fillAttributes(array $attributes) { + $attributesFilters = []; foreach ($attributes as $attribute) { if (empty($attribute['attribute_id'])) { $this->createNewVariationSet($attribute); } + $attributesFilters[] = ['frontend_label' => $attribute['frontend_label']]; } + //select attributes + $this->getAttributesGrid()->resetFilter(); + if ($this->_rootElement->find('[class$=no-data]')->isVisible()) { + return; + } + $this->getAttributesGrid()->selectItems($attributesFilters); + + $this->browser->find($this->nextButton)->click(); + $this->getTemplateBlock()->waitLoader(); + + //update attributes options foreach ($attributes as $attribute) { - $this->getAttributesGrid()->searchAndSelect(['frontend_label' => $attribute['frontend_label']]); - $this->browser->find($this->nextButton)->click(); - $this->getTemplateBlock()->waitLoader(); $this->updateOptions($attribute); } @@ -181,7 +191,7 @@ class Attribute extends Form /** * @return \Magento\Ui\Test\Block\Adminhtml\DataGrid */ - protected function getAttributesGrid() + public function getAttributesGrid() { return $this->blockFactory->create( 'Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\AttributesGrid', @@ -272,6 +282,7 @@ class Attribute extends Form $label = isset($option['admin']) ? $option['admin'] : $option['label']; $optionContainer = $attributeBlock->find(sprintf($this->attributeOptionByName, $label)); + //Create option if (!$optionContainer->isVisible()) { $mapping = $this->dataMapping($option); $attributeBlock->find($this->addOption)->click(); @@ -282,6 +293,11 @@ class Attribute extends Form ->setValue($mapping['label']['value']); $this->getTemplateBlock()->waitLoader(); $optionContainer->find('[data-action=save]')->click(); + $optionContainer = $attributeBlock->find(sprintf($this->attributeOptionByName, $label)); + } + //Select option + if (!$optionContainer->find('[type="checkbox"]')->isSelected()) { + $optionContainer->find('[type="checkbox"]')->click(); } } } diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php index 4d2bf2cb8268168557df928f63a3cb0b8cde12c8..e41ef61382f754f87f1f142616f2d5974cd0d540 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php @@ -7,7 +7,6 @@ namespace Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute; use Magento\Mtf\Client\Element\SuggestElement; -use Magento\Catalog\Test\Fixture\CatalogProductAttribute; /** * Form Attribute Search on Product page. @@ -32,15 +31,4 @@ class AttributeSelector extends SuggestElement // that causes disappearing of result suggest list. } } - - /** - * Checking exist configurable attribute in search result. - * - * @param CatalogProductAttribute $productAttribute - * @return bool - */ - public function isExistAttributeInSearchResult(CatalogProductAttribute $productAttribute) - { - return $this->isExistValueInSearchResult($productAttribute->getFrontendLabel()); - } } diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertChildProductsInGrid.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertChildProductsInGrid.php index 923e439e0394017ca49bb428ae9b6597799a1304..07dd93b51eef6f34ceac9230352481eb2be38d50 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertChildProductsInGrid.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertChildProductsInGrid.php @@ -31,14 +31,14 @@ class AssertChildProductsInGrid extends AbstractConstraint public function processAssert(CatalogProductIndex $productGrid, ConfigurableProduct $product) { $configurableAttributesData = $product->getConfigurableAttributesData(); - $productType = $product->getProductHasWeight() === "Yes" ? 'Simple Product' : 'Virtual Product'; $errors = []; $productGrid->open(); foreach ($configurableAttributesData['matrix'] as $variation) { $filter = [ 'name' => $variation['name'], - 'type' => $productType, + 'type' => (isset($variation['weight']) && (int)$variation['weight'] > 0) + ? 'Simple Product' : 'Virtual Product', 'sku' => $variation['sku'], 'visibility' => self::NOT_VISIBLE_INDIVIDUALLY, ]; diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php index 246f73bb739ee11861f91af0a088cfec9ca31370..f635ef7cc29d3cd15024f8a25048ce84ac2adf17 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php @@ -47,7 +47,7 @@ class AssertConfigurableProductPage extends AssertProductPage if ($fixturePrice != $formPrice) { return "Displayed product price on product page(front-end) not equals passed from fixture. " - . "Actual: {$fixturePrice}, expected: {$formPrice}."; + . "Actual: {$formPrice}, expected: {$fixturePrice}."; } return null; } diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeAbsenceInVariationsSearch.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeAbsenceInVariationsSearch.php index 1c7edf16fe5f56fa2bbca505492f728c8a8e3063..e2adc6353c3157e4cc0c94c9e2861764bd4d0a72 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeAbsenceInVariationsSearch.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeAbsenceInVariationsSearch.php @@ -11,29 +11,31 @@ use Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Conf use Magento\Catalog\Test\Fixture\CatalogProductAttribute; use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex; use Magento\Catalog\Test\Page\Adminhtml\CatalogProductNew; +use Magento\ConfigurableProduct\Test\Fixture\ConfigurableProduct; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Class AssertProductAttributeAbsenceInVariationsSearch - * Check that deleted attribute can't be added to product template on Product Page via Add Attribute control + * Check that deleted attribute can't be added to attribute set on Product Page via Add Attribute control. */ class AssertProductAttributeAbsenceInVariationsSearch extends AbstractConstraint { /** - * Label "Variations" tab + * Label "Variations" tab. */ const TAB_VARIATIONS = 'variations'; /** - * Assert that deleted attribute can't be added to product template on Product Page via Add Attribute control + * Assert that deleted attribute can't be added to attribute set on Product Page via Add Attribute control. * * @param CatalogProductAttribute $productAttribute + * @param ConfigurableProduct $assertProduct * @param CatalogProductIndex $productGrid * @param CatalogProductNew $newProductPage * @return void */ public function processAssert( CatalogProductAttribute $productAttribute, + ConfigurableProduct $assertProduct, CatalogProductIndex $productGrid, CatalogProductNew $newProductPage ) { @@ -41,18 +43,19 @@ class AssertProductAttributeAbsenceInVariationsSearch extends AbstractConstraint $productGrid->getGridPageActionBlock()->addProduct('simple'); /** @var VariationsTab $variationsTab */ + $newProductPage->getProductForm()->fill($assertProduct); $variationsTab = $newProductPage->getProductForm()->getTab(self::TAB_VARIATIONS); $variationsTab->showContent(); - /** @var AttributeBlock $attributesBlock */ - $attributesBlock = $variationsTab->getAttributeBlock(); + $variationsTab->createConfigurations(); + $attributesGrid = $variationsTab->getAttributeBlock()->getAttributesGrid(); \PHPUnit_Framework_Assert::assertFalse( - $attributesBlock->getAttributeSelector()->isExistAttributeInSearchResult($productAttribute), + $attributesGrid->isRowVisible(['frontend_label' => $productAttribute->getFrontendLabel()]), "Product attribute found in Attribute Search form." ); } /** - * Text absent Product Attribute in Attribute Search form + * Text absent Product Attribute in Attribute Search form. * * @return string */ diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeIsConfigurable.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeIsConfigurable.php index e088a33cf703d48927bed5a0bcb4ca8597713438..2c9d735450f50f9070d96233a2e35acafe70abae 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeIsConfigurable.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertProductAttributeIsConfigurable.php @@ -10,6 +10,7 @@ use Magento\Catalog\Test\Fixture\CatalogProductAttribute; use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex; use Magento\Catalog\Test\Page\Adminhtml\CatalogProductNew; use Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config as TabVariation; +use Magento\ConfigurableProduct\Test\Fixture\ConfigurableProduct; use Magento\Mtf\Constraint\AbstractConstraint; /** @@ -21,23 +22,27 @@ class AssertProductAttributeIsConfigurable extends AbstractConstraint * Assert check whether the attribute is used to create a configurable products. * * @param CatalogProductAttribute $attribute + * @param ConfigurableProduct $assertProduct * @param CatalogProductIndex $productGrid * @param CatalogProductNew $newProductPage */ public function processAssert( CatalogProductAttribute $attribute, + ConfigurableProduct $assertProduct, CatalogProductIndex $productGrid, CatalogProductNew $newProductPage ) { $productGrid->open(); $productGrid->getGridPageActionBlock()->addProduct('configurable'); $productBlockForm = $newProductPage->getProductForm(); + $productBlockForm->fill($assertProduct); $productBlockForm->openTab('variations'); - /** @var TabVariation $tabVariation */ - $tabVariation = $productBlockForm->getTab('variations'); - $configurableAttributeSelector = $tabVariation->getAttributeBlock()->getAttributeSelector(); + /** @var \Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config $variationsTab */ + $variationsTab = $productBlockForm->getTab('variations'); + $variationsTab->createConfigurations(); + $attributesGrid = $variationsTab->getAttributeBlock()->getAttributesGrid(); \PHPUnit_Framework_Assert::assertTrue( - $configurableAttributeSelector->isExistAttributeInSearchResult($attribute), + $attributesGrid->isRowVisible(['frontend_label' => $attribute->getFrontendLabel()]), "Product attribute is absent on the product page." ); } diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateConfigurableProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateConfigurableProductEntityTest.xml index b7fdd48cd1642c4b5403197f1c784c39b7d36854..ff225f5ef37e68b7328aa3f3e5eef04a670b6b5c 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateConfigurableProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateConfigurableProductEntityTest.xml @@ -14,7 +14,6 @@ <data name="product/data/checkout_data/dataset" xsi:type="string">configurable_two_options</data> <data name="product/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="product/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="product/data/price/value" xsi:type="string">100</data> <data name="product/data/price/dataset" xsi:type="string">default</data> <data name="product/data/category_ids/dataset" xsi:type="string">default_subcategory</data> <data name="product/data/short_description" xsi:type="string">Configurable short description</data> @@ -39,7 +38,7 @@ <data name="product/data/checkout_data/dataset" xsi:type="string">configurable_two_options</data> <data name="product/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="product/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="product/data/price/value" xsi:type="string">100</data> + <data name="product/data/price/dataset" xsi:type="string">default</data> <data name="product/data/short_description" xsi:type="string">Configurable short description</data> <data name="product/data/description" xsi:type="string">Configurable Product description %isolation%</data> <data name="product/data/weight" xsi:type="string">2</data> @@ -60,7 +59,6 @@ <data name="product/data/checkout_data/dataset" xsi:type="string">configurable_two_new_options_with_special_price</data> <data name="product/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="product/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="product/data/price/value" xsi:type="string">100</data> <data name="product/data/special_price" xsi:type="string">10</data> <data name="product/data/short_description" xsi:type="string">Configurable short description</data> <data name="product/data/description" xsi:type="string">Configurable Product description %isolation%</data> @@ -83,7 +81,7 @@ <data name="product/data/checkout_data/dataset" xsi:type="string">configurable_two_options_with_assigned_product</data> <data name="product/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="product/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="product/data/price/value" xsi:type="string">100</data> + <data name="product/data/price/dataset" xsi:type="string">default</data> <data name="product/data/short_description" xsi:type="string">Configurable short description</data> <data name="product/data/description" xsi:type="string">Configurable Product description %isolation%</data> <data name="product/data/weight" xsi:type="string">2</data> @@ -102,7 +100,6 @@ <data name="product/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="product/data/sku" xsi:type="string">configurable_sku_%isolation%</data> <data name="product/data/tax_class_id" xsi:type="string">Taxable Goods</data> - <data name="product/data/price/value" xsi:type="string">10</data> <data name="product/data/price/dataset" xsi:type="string">MAGETWO-12620</data> <data name="product/data/category_ids/dataset" xsi:type="string">default_subcategory</data> <data name="product/data/weight" xsi:type="string">1</data> @@ -116,7 +113,6 @@ <data name="product/data/configurable_attributes_data/dataset" xsi:type="string">two_searchable_options</data> <data name="product/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="product/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="product/data/price/value" xsi:type="string">100</data> <data name="product/data/price/dataset" xsi:type="string">default</data> <data name="product/data/category_ids/new_category" xsi:type="string">no</data> <data name="product/data/category_ids/dataset" xsi:type="string">default_subcategory</data> diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml index 543ffade21f0bcb02dc019a46f655fe4dcdc46f4..e57a8d0a7c29502f8c56fac6090eae518780b12e 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml @@ -17,7 +17,6 @@ <data name="updatedProduct/data/checkout_data/cartItem/price" xsi:type="string">153</data> <data name="updatedProduct/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="updatedProduct/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="updatedProduct/data/price/value" xsi:type="string">99</data> <data name="updatedProduct/data/category_ids/dataset" xsi:type="string">default_subcategory</data> <data name="updatedProduct/data/short_description" xsi:type="string">Configurable short description</data> <data name="updatedProduct/data/description" xsi:type="string">Configurable Product description %isolation%</data> @@ -42,7 +41,6 @@ <data name="updatedProduct/data/checkout_data/cartItem/price" xsi:type="string">154</data> <data name="updatedProduct/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="updatedProduct/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="updatedProduct/data/price/value" xsi:type="string">99</data> <data name="updatedProduct/data/short_description" xsi:type="string">Configurable short description</data> <data name="updatedProduct/data/description" xsi:type="string">Configurable Product description %isolation%</data> <data name="updatedProduct/data/weight" xsi:type="string">3</data> @@ -65,7 +63,6 @@ <data name="updatedProduct/data/checkout_data/cartItem/price" xsi:type="string">112</data> <data name="updatedProduct/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="updatedProduct/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="updatedProduct/data/price/value" xsi:type="string">99</data> <data name="updatedProduct/data/category_ids/dataset" xsi:type="string">default_subcategory</data> <data name="updatedProduct/data/short_description" xsi:type="string">Configurable short description</data> <data name="updatedProduct/data/description" xsi:type="string">Configurable Product description %isolation%</data> @@ -88,7 +85,6 @@ <data name="updatedProduct/data/checkout_data/dataset" xsi:type="string">configurable_two_attributes</data> <data name="updatedProduct/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="updatedProduct/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="updatedProduct/data/price/value" xsi:type="string">99</data> <data name="updatedProduct/data/short_description" xsi:type="string">Configurable short description</data> <data name="updatedProduct/data/description" xsi:type="string">Configurable Product description %isolation%</data> <data name="updatedProduct/data/weight" xsi:type="string">3</data> @@ -106,7 +102,6 @@ <data name="updatedProduct/data/configurable_attributes_data/dataset" xsi:type="string">one_new_options</data> <data name="updatedProduct/data/name" xsi:type="string">Configurable Product %isolation%</data> <data name="updatedProduct/data/sku" xsi:type="string">configurable_sku_%isolation%</data> - <data name="updatedProduct/data/price/value" xsi:type="string">99</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\ConfigurableProduct\Test\Constraint\AssertConfigurableProductPage" /> </variation> diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php index 912106f71bb7542d0f0ffb5339e73657b65d23f2..113e4774672ea446a80443a923e4ed79f42698bc 100644 --- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php @@ -25,7 +25,7 @@ class AssertCurrencySymbolSuccessSaveMessage extends AbstractConstraint */ public function processAssert(SystemCurrencySymbolIndex $currencySymbolIndex) { - $actualMessage = $currencySymbolIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $currencySymbolIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_SAVE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/CustomerGrid.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/CustomerGrid.php index c82af6b00edfd7d847fc37ce5be745a4f7e4b243..93b3d1b7c16b73921e70c0ed31ad61e769b9544f 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/CustomerGrid.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/CustomerGrid.php @@ -39,10 +39,10 @@ class CustomerGrid extends DataGrid 'input' => 'select', ], 'entity_id_from' => [ - 'selector' => '[name="filters[entity_id][from]"]', + 'selector' => '[name="entity_id[from]"]', ], 'entity_id_to' => [ - 'selector' => '[name="filters[entity_id][to]"]', + 'selector' => '[name="entity_id[to]"]', ], ]; } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php index 48c58b1c316d96ceedc389c57252ce684f91e05a..cfe0d1f61cdddd23f3098dd98bee261a8d23130c 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php @@ -30,7 +30,7 @@ class AssertChangePasswordFailMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::FAIL_MESSAGE, - $customerAccountEdit->getMessages()->getErrorMessages() + $customerAccountEdit->getMessages()->getErrorMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php index 9dbf30c353e9d1fde84b182da0a63f35123390b7..195f0df3ca3f628f4930e199b4ca04a86d2db969 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php @@ -28,7 +28,7 @@ class AssertCustomerAddressSuccessSaveMessage extends AbstractConstraint */ public function processAssert(CustomerAccountIndex $customerAccountIndex) { - $successMessage = $customerAccountIndex->getMessages()->getSuccessMessages(); + $successMessage = $customerAccountIndex->getMessages()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $successMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerBackendDuplicateErrorMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerBackendDuplicateErrorMessage.php index 27394f8e074ecc7fc0238a58285d8d4ed364fd16..f17dbafe7e21948bc48fa552780c794b0b54319a 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerBackendDuplicateErrorMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerBackendDuplicateErrorMessage.php @@ -27,7 +27,7 @@ class AssertCustomerBackendDuplicateErrorMessage extends AbstractConstraint */ public function processAssert(CustomerIndex $customerIndexPage) { - $actualMessage = $customerIndexPage->getMessagesBlock()->getErrorMessages(); + $actualMessage = $customerIndexPage->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( self::ERROR_SAVE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerFailRegisterMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerFailRegisterMessage.php index 2cb983b4bbc3a8b7a33b1acce819b91f35bf9fef..a37e68ed7f12f893060514bb9f2e0e6e4363f87a 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerFailRegisterMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerFailRegisterMessage.php @@ -22,7 +22,7 @@ class AssertCustomerFailRegisterMessage extends AbstractConstraint */ public function processAssert(CustomerAccountCreate $registerPage) { - $errorMessage = $registerPage->getMessagesBlock()->getErrorMessages(); + $errorMessage = $registerPage->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertNotEmpty( $errorMessage, 'No error message is displayed.' diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerForgotPasswordSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerForgotPasswordSuccessMessage.php index 318b5e531a92e1ac37715a2e724bdac4f3277e78..c06a121ff20e3a051148efdfad3dcd347b25a0df 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerForgotPasswordSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerForgotPasswordSuccessMessage.php @@ -29,14 +29,9 @@ class AssertCustomerForgotPasswordSuccessMessage extends AbstractConstraint CustomerAccountLogin $customerLogin, Customer $customer ) { - $message = sprintf( - self::SUCCESS_MESSAGE, - $customer->getEmail() - ); - \PHPUnit_Framework_Assert::assertEquals( - $message, - $customerLogin->getMessages()->getSuccessMessages(), + sprintf(self::SUCCESS_MESSAGE, $customer->getEmail()), + $customerLogin->getMessages()->getSuccessMessage(), 'Wrong forgot password message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupAlreadyExists.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupAlreadyExists.php index 6796c9aa0874f79897c424739b68817eed3595d5..50982fc8a6aa9c1d5d5ff41583972443127688fd 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupAlreadyExists.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupAlreadyExists.php @@ -24,7 +24,7 @@ class AssertCustomerGroupAlreadyExists extends AbstractConstraint */ public function processAssert(CustomerGroupNew $customerGroupNew) { - $actualMessage = $customerGroupNew->getMessagesBlock()->getErrorMessages(); + $actualMessage = $customerGroupNew->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( self::ERROR_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php index 81b3fc72b63d9cfdfaf3cbc15b50a6f8e3a40f97..8173d3cde87760debb60da3e9f866850f8e7785c 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php @@ -24,12 +24,13 @@ class AssertCustomerGroupSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(CustomerGroupIndex $customerGroupIndex) { + $actualMessage = $customerGroupIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, - $customerGroupIndex->getMessagesBlock()->getSuccessMessages(), + $actualMessage, 'Wrong message is displayed.' . "\nExpected: " . self::SUCCESS_DELETE_MESSAGE - . "\nActual: " . $customerGroupIndex->getMessagesBlock()->getSuccessMessages() + . "\nActual: " . $actualMessage ); } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php index 9069acfce812b0c2bd116eb486d1a0faa36b312f..6ae95ea7f4d7ace5f8e3817ce3c6d9620df7ac7f 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertCustomerGroupSuccessSaveMessage extends AbstractConstraint */ public function processAssert(CustomerGroupIndex $customerGroupIndex) { - $actualMessage = $customerGroupIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $customerGroupIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php index 6396afca4ba5dc0faa10e3f0bd6987d3baed04cd..6a8d9c06ee2bef2d885867c8d20312b4539fa397 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php @@ -28,7 +28,7 @@ class AssertCustomerInfoSuccessSavedMessage extends AbstractConstraint */ public function processAssert(CustomerAccountIndex $customerAccountIndex) { - $successMessage = $customerAccountIndex->getMessages()->getSuccessMessages(); + $successMessage = $customerAccountIndex->getMessages()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $successMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInvalidEmail.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInvalidEmail.php index 37ad42ad921973e40c74b4549abf3923c876b6c7..922310e227e2cc99199bc056b2091ad8a593d38b 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInvalidEmail.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInvalidEmail.php @@ -29,7 +29,7 @@ class AssertCustomerInvalidEmail extends AbstractConstraint public function processAssert(Customer $customer, CustomerIndexNew $pageCustomerIndexNew) { $expectMessage = str_replace('%email%', $customer->getEmail(), self::ERROR_EMAIL_MESSAGE); - $actualMessage = $pageCustomerIndexNew->getMessagesBlock()->getErrorMessages(); + $actualMessage = $pageCustomerIndexNew->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteSuccessMessage.php index c18c312e8855b412a9b97a9b724cd460ddc5aaed..3ac60cd83f990978dc131f01dae0a955d3843d51 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteSuccessMessage.php @@ -31,7 +31,7 @@ class AssertCustomerMassDeleteSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_DELETE_MESSAGE, $customersQtyToDelete), - $customerIndexPage->getMessagesBlock()->getSuccessMessages(), + $customerIndexPage->getMessagesBlock()->getSuccessMessage(), 'Wrong delete message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessDeleteMessage.php index 632ab54f8f34e12617258325ffe2cca6bd08d478..36474ed8b9a1ae6c0721a5b911d429183f5fc6fd 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertCustomerSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(CustomerIndex $customerIndexPage) { - $actualMessage = $customerIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $customerIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessRegisterMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessRegisterMessage.php index bf70b9806347fbe9f410a2dba27ce1d283114b2f..7d6cc8d277861bf87b75b8009707228941cf4db2 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessRegisterMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessRegisterMessage.php @@ -24,7 +24,7 @@ class AssertCustomerSuccessRegisterMessage extends AbstractConstraint */ public function processAssert(CustomerAccountCreate $registerPage) { - $actualMessage = $registerPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $registerPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessSaveMessage.php index 47e8faddaf56033fe026bbf131bc95de8a3e40fc..ca217f7a63e47a421ff0598b95f3ba59dcbfc493 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessSaveMessage.php @@ -25,7 +25,7 @@ class AssertCustomerSuccessSaveMessage extends AbstractConstraint */ public function processAssert(CustomerIndex $pageCustomerIndex) { - $actualMessage = $pageCustomerIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $pageCustomerIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertMassActionSuccessUpdateMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertMassActionSuccessUpdateMessage.php index 1d14f0995f6dd5a409bb5968facd1a5534bc2f6e..8b3c727bd0e94a018c6642ec688da37877720442 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertMassActionSuccessUpdateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertMassActionSuccessUpdateMessage.php @@ -35,9 +35,8 @@ class AssertMassActionSuccessUpdateMessage extends AbstractConstraint public function processAssert($customer, CustomerIndex $pageCustomerIndex) { $customers = is_array($customer) ? $customer : [$customer]; - $customerCount = count($customers); - $actualMessage = $pageCustomerIndex->getMessagesBlock()->getSuccessMessages(); - \PHPUnit_Framework_Assert::assertEquals(sprintf(self::UPDATE_MESSAGE, $customerCount), $actualMessage); + $actualMessage = $pageCustomerIndex->getMessagesBlock()->getSuccessMessage(); + \PHPUnit_Framework_Assert::assertEquals(sprintf(self::UPDATE_MESSAGE, count($customers)), $actualMessage); } /** diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Page/Adminhtml/CustomerIndexEdit.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Page/Adminhtml/CustomerIndexEdit.xml index 7dfacbc495c1259f286bfca6677d7339e280503a..d491bb75ab488143e45e401d04b970f631e4d37a 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Page/Adminhtml/CustomerIndexEdit.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Page/Adminhtml/CustomerIndexEdit.xml @@ -7,11 +7,11 @@ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> <page name="CustomerIndexEdit" area="Adminhtml" mca="customer/index/edit" module="Magento_Customer"> - <block name="titleBlock" class="Magento\Theme\Test\Block\Html\Title" locator=".page-title-wrapper .page-title" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - <block name="pageActionsBlock" class="Magento\Customer\Test\Block\Adminhtml\Edit\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="customerForm" class="Magento\Customer\Test\Block\Adminhtml\Edit\CustomerForm" locator="[id='page:main-container']" strategy="css selector"/> - <block name="configureProductBlock" class="Magento\Catalog\Test\Block\Adminhtml\Product\Composite\Configure" locator="//*[@role='dialog' and ./*[@id='product_composite_configure'] and contains(@style,'display: block')]" strategy="xpath"/> - <block name="modalBlock" class="Magento\Ui\Test\Block\Adminhtml\Modal" locator="._show[data-role=modal]" strategy="css selector"/> + <block name="titleBlock" class="Magento\Theme\Test\Block\Html\Title" locator=".page-title-wrapper .page-title" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + <block name="pageActionsBlock" class="Magento\Customer\Test\Block\Adminhtml\Edit\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="customerForm" class="Magento\Customer\Test\Block\Adminhtml\Edit\CustomerForm" locator="[id='page:main-container']" strategy="css selector" /> + <block name="configureProductBlock" class="Magento\Catalog\Test\Block\Adminhtml\Product\Composite\Configure" locator="[data-role='modal']._show" strategy="css selector" /> + <block name="modalBlock" class="Magento\Ui\Test\Block\Adminhtml\Modal" locator="._show[data-role=modal]" strategy="css selector" /> </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassAssignCustomerGroupTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassAssignCustomerGroupTest.php index d253c87f9ffad16877f91c2d79bc3127ab7112d8..fa144a9b396ebd58d5dd16d8d1246d547cc30f64 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassAssignCustomerGroupTest.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassAssignCustomerGroupTest.php @@ -91,7 +91,8 @@ class MassAssignCustomerGroupTest extends Injectable $this->customerIndex->open(); $this->customerIndex->getCustomerGridBlock()->massaction( [['email' => $customer->getEmail()]], - [$this->customersGridActions => $customerGroup->getCustomerGroupCode()] + [$this->customersGridActions => $customerGroup->getCustomerGroupCode()], + true ); } } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.php index 1bb9544c621d6a0a1591fe8edd7e186776e4b462..95684cb07b8761464ca50aec34f25aa341fbade6 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.php @@ -13,15 +13,16 @@ use Magento\Customer\Test\Page\Adminhtml\CustomerIndexEdit; use Magento\Mtf\TestCase\Injectable; /** - * Test Creation for UpdateCustomerBackendEntity + * Precondition: + * 1. Create customer. * - * General Flow: - * 1. Login to backend as admin - * 2. Navigate to CUSTOMERS->All Customers - * 3. Open from grid test customer - * 4. Edit some values, if addresses fields are not presented click 'Add New Address' button - * 5. Click 'Save' button - * 6. Perform all assertions + * Steps: + * 1. Login to backend as admin. + * 2. Navigate to CUSTOMERS->All Customers. + * 3. Open from grid test customer. + * 4. Edit some values, if addresses fields are not presented click 'Add New Address' button. + * 5. Click 'Save' button. + * 6. Perform all assertions. * * @ZephyrId MAGETWO-23881 */ @@ -33,18 +34,25 @@ class UpdateCustomerBackendEntityTest extends Injectable /* end tags */ /** + * Customer grid page. + * * @var CustomerIndex */ protected $customerIndexPage; /** + * Customer edit page. + * * @var CustomerIndexEdit */ protected $customerIndexEditPage; /** + * Inject pages. + * * @param CustomerIndex $customerIndexPage * @param CustomerIndexEdit $customerIndexEditPage + * @return void */ public function __inject( CustomerIndex $customerIndexPage, @@ -55,19 +63,19 @@ class UpdateCustomerBackendEntityTest extends Injectable } /** + * Run update customer test. + * * @param Customer $initialCustomer * @param Customer $customer - * @param Address $address + * @param Address $address [optional] + * @return void */ public function testUpdateCustomerBackendEntity( Customer $initialCustomer, Customer $customer, - Address $address + Address $address = null ) { - // Prepare data - $address = $address->hasData() ? $address : null; - - // Preconditions: + // Precondition $initialCustomer->persist(); // Steps diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.xml index afe288811e96d22ab5a8aea245054f54154d0b6e..0193f9cb8fa9f5aed64cf77921d61a11168941d5 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest.xml @@ -19,37 +19,13 @@ <data name="customer/data/dob" xsi:type="string">01/08/1986</data> <data name="customer/data/taxvat" xsi:type="string">123456789001</data> <data name="customer/data/gender" xsi:type="string">Male</data> - <data name="address/data/prefix" xsi:type="string">-</data> - <data name="address/data/firstname" xsi:type="string">-</data> - <data name="address/data/middlename" xsi:type="string">-</data> - <data name="address/data/lastname" xsi:type="string">-</data> - <data name="address/data/suffix" xsi:type="string">-</data> - <data name="address/data/company" xsi:type="string">-</data> - <data name="address/data/street" xsi:type="string">-</data> - <data name="address/data/city" xsi:type="string">-</data> - <data name="address/data/country_id" xsi:type="string">-</data> - <data name="address/data/region_id" xsi:type="string">-</data> - <data name="address/data/region" xsi:type="string">-</data> - <data name="address/data/postcode" xsi:type="string">-</data> - <data name="address/data/telephone" xsi:type="string">-</data> - <data name="address/data/fax" xsi:type="string">-</data> - <data name="address/data/vat_id" xsi:type="string">-</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage" /> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerForm" /> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerInGrid" /> </variation> <variation name="UpdateCustomerBackendEntityTestVariation2"> <data name="initialCustomer/dataset" xsi:type="string">default</data> - <data name="customer/data/group_id/dataset" xsi:type="string">-</data> - <data name="customer/data/prefix" xsi:type="string">-</data> - <data name="customer/data/firstname" xsi:type="string">-</data> - <data name="customer/data/middlename" xsi:type="string">-</data> - <data name="customer/data/lastname" xsi:type="string">-</data> - <data name="customer/data/suffix" xsi:type="string">-</data> <data name="customer/data/email" xsi:type="string">-</data> - <data name="customer/data/dob" xsi:type="string">-</data> - <data name="customer/data/taxvat" xsi:type="string">-</data> - <data name="customer/data/gender" xsi:type="string">-</data> <data name="address/data/prefix" xsi:type="string">Prefix%isolation%_</data> <data name="address/data/firstname" xsi:type="string">Doe%isolation%</data> <data name="address/data/middlename" xsi:type="string">Middle Name %isolation%</data> @@ -60,10 +36,8 @@ <data name="address/data/city" xsi:type="string">Dothan</data> <data name="address/data/country_id" xsi:type="string">United States</data> <data name="address/data/region_id" xsi:type="string">Alabama</data> - <data name="address/data/region" xsi:type="string">-</data> <data name="address/data/postcode" xsi:type="string">36303</data> <data name="address/data/telephone" xsi:type="string">334-200-4060</data> - <data name="address/data/fax" xsi:type="string">555-666-777-8910</data> <data name="address/data/vat_id" xsi:type="string">U1234567890</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage" /> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerForm" /> @@ -90,11 +64,9 @@ <data name="address/data/street" xsi:type="string">39 Northgate Street</data> <data name="address/data/city" xsi:type="string">BICKTON</data> <data name="address/data/country_id" xsi:type="string">United Kingdom</data> - <data name="address/data/region_id" xsi:type="string">-</data> <data name="address/data/region" xsi:type="string">PINMINNOCH</data> <data name="address/data/postcode" xsi:type="string">KA26 1PF</data> <data name="address/data/telephone" xsi:type="string">999-777-111-2345</data> - <data name="address/data/fax" xsi:type="string">-</data> <data name="address/data/vat_id" xsi:type="string">987654321</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage" /> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerForm" /> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.xml index 8d70104f70ab7b6fbe4dc11a009750e9e6498090..9398ab7ae74257ca7fc32ada8079b06dd2ae85aa 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.xml @@ -19,9 +19,7 @@ <data name="address/data/city" xsi:type="string">City %isolation%</data> <data name="address/data/country_id" xsi:type="string">United States</data> <data name="address/data/region_id" xsi:type="string">Colorado</data> - <data name="address/data/region" xsi:type="string">-</data> <data name="address/data/telephone" xsi:type="string">555-888-111-999</data> - <data name="address/data/fax" xsi:type="string">161-999-8888</data> <data name="address/data/postcode" xsi:type="string">12345</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerAddressSuccessSaveMessage" /> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerDefaultAddresses" /> @@ -37,10 +35,8 @@ <data name="address/data/street" xsi:type="string">Some street %isolation%</data> <data name="address/data/city" xsi:type="string">City %isolation%</data> <data name="address/data/country_id" xsi:type="string">United Kingdom</data> - <data name="address/data/region_id" xsi:type="string">-</data> <data name="address/data/region" xsi:type="string">Region %isolation%</data> <data name="address/data/telephone" xsi:type="string">0123456789-02134567</data> - <data name="address/data/fax" xsi:type="string">5555-874-99634</data> <data name="address/data/postcode" xsi:type="string">12345</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerAddressSuccessSaveMessage" /> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerDefaultAddresses" /> @@ -57,9 +53,7 @@ <data name="address/data/city" xsi:type="string">Quintin</data> <data name="address/data/country_id" xsi:type="string">France</data> <data name="address/data/region_id" xsi:type="string">Côtes-d'Armor</data> - <data name="address/data/region" xsi:type="string">-</data> <data name="address/data/telephone" xsi:type="string">555-888-111-999</data> - <data name="address/data/fax" xsi:type="string">161-999-8888</data> <data name="address/data/postcode" xsi:type="string">12345</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerAddressSuccessSaveMessage" /> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerDefaultAddresses" /> @@ -75,9 +69,7 @@ <data name="address/data/city" xsi:type="string">Culver City</data> <data name="address/data/country_id" xsi:type="string">United States</data> <data name="address/data/region_id" xsi:type="string">California</data> - <data name="address/data/region" xsi:type="string">-</data> <data name="address/data/telephone" xsi:type="string">555-55-555-55</data> - <data name="address/data/fax" xsi:type="string">-</data> <data name="address/data/postcode" xsi:type="string">90230</data> <data name="tag" xsi:type="string">test_type:acceptance_test</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerAddressSuccessSaveMessage" /> diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateSuccessSaveMessage.php index 3a9f7e82a3943e73ece72d72fbefb3bc2e720ca5..2ce8cb0878d660a9433f756c52e02432a5495215 100644 --- a/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Directory/Test/Constraint/AssertCurrencyRateSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertCurrencyRateSuccessSaveMessage extends AbstractConstraint */ public function processAssert(SystemCurrencyIndex $currencyIndexPage) { - $actualMessage = $currencyIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $currencyIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.xml index bd1e9e70f43f105f410210cefdb87a358a4ab8dd..6d6f3231f3e8e71c9b51474a8d4dbf3f5801c0cf 100644 --- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.xml +++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.xml @@ -14,7 +14,7 @@ <links_purchased_separately> <selector>[name="product[links_purchased_separately]"]</selector> <strategy>css selector</strategy> - <input>select</input> + <input>checkbox</input> </links_purchased_separately> </fields> </mapping> diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Product/ProductForm.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Product/ProductForm.xml index 1924503587941faaae969c94b103b69fb2eb541a..57aef81a070fa60cd4ba149a3d16509a29e09698 100644 --- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Product/ProductForm.xml +++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Block/Adminhtml/Product/ProductForm.xml @@ -8,7 +8,7 @@ <tabs> <downloadable_information> <class>\Magento\Downloadable\Test\Block\Adminhtml\Catalog\Product\Edit\Tab\Downloadable</class> - <selector>#product_info_tabs_downloadable_items</selector> + <selector>#product_info_tabs_product-details</selector> <strategy>css selector</strategy> </downloadable_information> </tabs> diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Constraint/AbstractAssertTaxRuleIsAppliedToAllPricesDownloadable.php b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Constraint/AbstractAssertTaxRuleIsAppliedToAllPricesDownloadable.php index 20dd5579d0e28a11fb03d5f80fffd6a078c9e0d1..7fd9a4523240ac00dc671189ce795593fa8823b6 100644 --- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/Constraint/AbstractAssertTaxRuleIsAppliedToAllPricesDownloadable.php +++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/Constraint/AbstractAssertTaxRuleIsAppliedToAllPricesDownloadable.php @@ -66,6 +66,7 @@ abstract class AbstractAssertTaxRuleIsAppliedToAllPricesDownloadable extends Abs $actualPrices = $this->getProductPagePrices($actualPrices); $catalogProductView->getViewBlock()->clickAddToCart(); $catalogProductView->getMessagesBlock()->waitSuccessMessage(); + $checkoutCart->open(); $actualPrices = $this->getCartPrices($product, $actualPrices); $actualPrices = $this->getTotals($actualPrices); //Prices verification diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/CreateDownloadableProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/CreateDownloadableProductEntityTest.xml index 89234e4b9a12c71824d2c7017e485202f061a813..5874e8b5074995e2754179693cb43fbcaf5f70dd 100644 --- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/CreateDownloadableProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/CreateDownloadableProductEntityTest.xml @@ -10,6 +10,8 @@ <variation name="CreateDownloadableProductEntityTestVariation1" summary="Create Downloadable Product with Required Fields Only and Assign it to the Category" ticketId="MAGETWO-13595"> <data name="product/data/name" xsi:type="string">DownloadableProduct_%isolation%</data> <data name="product/data/sku" xsi:type="string">DownloadableProduct_%isolation%</data> + <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">10</data> + <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> <data name="product/data/price/value" xsi:type="string">1</data> <data name="product/data/category" xsi:type="string">category %isolation%</data> <data name="product/data/downloadable_links/dataset" xsi:type="string">one_separately_link</data> @@ -128,7 +130,6 @@ <data name="product/data/tax_class_id/dataset" xsi:type="string">taxable_goods</data> <data name="product/data/product_has_weight" xsi:type="string">No</data> <data name="product/data/category" xsi:type="string">Default Category</data> - <data name="product/data/stock_data/manage_stock" xsi:type="string">Yes</data> <data name="product/data/stock_data/qty" xsi:type="string">123</data> <data name="product/data/stock_data/use_config_min_qty" xsi:type="string">No</data> <data name="product/data/stock_data/min_qty" xsi:type="string">123</data> diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml index 8a5230fce71e3e4b8aa5d9be21cc025f8c170fe0..45fa48eb78cec1a4a8be575bb6cd67a02dedc940 100644 --- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml @@ -54,7 +54,6 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">123</data> <data name="product/data/product_has_weight" xsi:type="string">No</data> <data name="product/data/category" xsi:type="string">Default Category</data> - <data name="product/data/stock_data/manage_stock" xsi:type="string">Yes</data> <data name="product/data/stock_data/use_config_min_qty" xsi:type="string">No</data> <data name="product/data/stock_data/min_qty" xsi:type="string">123</data> <data name="isRequired" xsi:type="string">No</data> diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php index fd8184a473a931c9b2504de28c5226000842ffd9..8d36b92575f18bf51910afd988c5ad9eb8c217d8 100644 --- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php +++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Catalog/Product/View.php @@ -20,7 +20,7 @@ class View extends ParentView * * @var string */ - protected $groupedProductBlock = '.table-wrapper.grouped'; + protected $groupedProductBlock = '[class="table-wrapper grouped"]'; /** * This member holds the class name of the tier price block. @@ -81,8 +81,7 @@ class View extends ParentView */ public function getOptions(FixtureInterface $product) { - $groupedOptions = $this->getGroupedProductBlock()->getOptions($product); - return ['grouped_options' => $groupedOptions] + parent::getOptions($product); + return ['grouped_options' => $this->getGroupedProductBlock()->getOptions($product)]; } /** diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml index c3b207ff397ba001775f2a30e333a83ce7de18da..003d21fdf59eca856ecec1fb4c895848a016997f 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml @@ -38,7 +38,7 @@ <variation name="InstallTestVariation4"> <data name="description" xsi:type="string">Install with table prefix.</data> <data name="user/dataset" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">prefix1_</data> + <data name="install/dbTablePrefix" xsi:type="string">pref_</data> <data name="install/storeLanguage" xsi:type="string">Chinese (China)</data> <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/ResourcesPopup.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/ResourcesPopup.php index 9c25994a869647e89195d2c271c6adb4839318b7..2436c28e37cebc723b9d5b2fcb70b9ec26636ac6 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/ResourcesPopup.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/ResourcesPopup.php @@ -23,7 +23,7 @@ class ResourcesPopup extends Form * * @var string */ - protected $allowButtonSelector = '[data-row-dialog="tokens"][role="button"]'; + protected $allowButtonSelector = '[data-row-dialog="tokens"][type="button"]'; /** * Selector for "Reauthorize" button. diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/TokensPopup.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/TokensPopup.php index e7307befb7482bb4d7774ddc5857989d9731aadc..2fecf03fc4db9effda32c84e59d5b4f0e8c02a1c 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/TokensPopup.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Block/Adminhtml/Integration/IntegrationGrid/TokensPopup.php @@ -18,7 +18,7 @@ class TokensPopup extends Form * * @var string */ - protected $doneButtonSelector = '.action-primary[role="button"]'; + protected $doneButtonSelector = '.action-primary[type="button"]'; /** * Click Done button on Integration tokens popup window. diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationNameDuplicationErrorMessage.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationNameDuplicationErrorMessage.php index 99613bf462381746c8b9d377ae059439d3c30d60..c3d21a5f0a421ff473cb7633b0ba0f6d271d8186 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationNameDuplicationErrorMessage.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationNameDuplicationErrorMessage.php @@ -29,7 +29,7 @@ class AssertIntegrationNameDuplicationErrorMessage extends AbstractConstraint Integration $integration ) { $expectedMessage = sprintf(self::ERROR_DUPLICATE_INTEGRATION_NAME, $integration->getName()); - $actualMessage = $integrationIndexPage->getMessagesBlock()->getErrorMessages(); + $actualMessage = $integrationIndexPage->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectedMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessActivationMessage.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessActivationMessage.php index ea11e6add5dcbc136dce6349d672232ee044bf1f..f4df100da9484332661344bfb24a1e64af984e43 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessActivationMessage.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessActivationMessage.php @@ -30,7 +30,7 @@ class AssertIntegrationSuccessActivationMessage extends AbstractConstraint Integration $integration ) { $expectedMessage = sprintf(self::SUCCESS_ACTIVATION_MESSAGE, $integration->getName()); - $actualMessage = $integrationIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $integrationIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectedMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessDeleteMessage.php index 65bc5bb66afabcfe808f4c5d400332055af1fbed..8cefafe433dccb6695dbd0cebf08bfa2b0a25002 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessDeleteMessage.php @@ -28,7 +28,7 @@ class AssertIntegrationSuccessDeleteMessage extends AbstractConstraint public function processAssert(IntegrationIndex $integrationIndexPage, Integration $integration) { $expectedMessage = sprintf(self::SUCCESS_DELETE_MESSAGE, $integration->getName()); - $actualMessage = $integrationIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $integrationIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectedMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessReauthorizeMessage.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessReauthorizeMessage.php index 485acdb7c321f81dd3f11af50947daa65b495731..71960784c17d593ac6b0666affe598b1eea57c1f 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessReauthorizeMessage.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessReauthorizeMessage.php @@ -34,7 +34,7 @@ class AssertIntegrationSuccessReauthorizeMessage extends AbstractConstraint ) { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_REAUTHORIZE_MESSAGE, $integration->getName()), - $integrationIndexPage->getMessagesBlock()->getSuccessMessages(), + $integrationIndexPage->getMessagesBlock()->getSuccessMessage(), "Wrong success message is displayed." ); } diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessage.php index 02563ed4cc2db74013b04f758bf95adf939b65a8..ca55d860c72267072ce6fbac8f6bd427ae14f9ed 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessage.php @@ -35,7 +35,7 @@ class AssertIntegrationSuccessSaveMessage extends AbstractConstraint ? $initialIntegration->getName() : $integration->getName(); $expectedMessage = sprintf(self::SUCCESS_SAVE_MESSAGE, $name); - $actualMessage = $integrationIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $integrationIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectedMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessageNotPresent.php b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessageNotPresent.php index ac23f60261388be7ae31bb5bdb1b019c7f4327c9..ab9f15ae7b9d443c60afebaf19f7c53c3534cbfe 100644 --- a/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessageNotPresent.php +++ b/dev/tests/functional/tests/app/Magento/Integration/Test/Constraint/AssertIntegrationSuccessSaveMessageNotPresent.php @@ -26,7 +26,7 @@ class AssertIntegrationSuccessSaveMessageNotPresent extends AbstractConstraint $noSuccessMessage = false; if ($integrationIndex->getMessagesBlock()->isVisible()) { try { - $integrationIndex->getMessagesBlock()->getSuccessMessages(); + $integrationIndex->getMessagesBlock()->getSuccessMessage(); } catch (\PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) { $noSuccessMessage = true; } diff --git a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Constraint/AssertNewsletterSuccessCreateMessage.php b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Constraint/AssertNewsletterSuccessCreateMessage.php index 0a71b2cc8ae57f78277e7df3e469c1f44bd9f3f2..0a006d9cb5d8162fd62289c790773edef75ce431 100644 --- a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Constraint/AssertNewsletterSuccessCreateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Constraint/AssertNewsletterSuccessCreateMessage.php @@ -29,7 +29,7 @@ class AssertNewsletterSuccessCreateMessage extends AbstractConstraint */ public function processAssert(TemplateIndex $templateIndex) { - $actualMessage = $templateIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $templateIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertInvoiceReportResult.php b/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertInvoiceReportResult.php index 0bf83c62bc8a22e1a9d4c797632e680857921a66..c8efec8aec2585d309722d6796d70e84a8cd95c5 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertInvoiceReportResult.php +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertInvoiceReportResult.php @@ -55,7 +55,7 @@ abstract class AbstractAssertInvoiceReportResult extends AbstractConstraint protected function searchInInvoiceReportGrid(array $invoiceReport) { $this->salesInvoiceReport->open(); - $this->salesInvoiceReport->getMessagesBlock()->clickLinkInMessages('notice', 'here'); + $this->salesInvoiceReport->getMessagesBlock()->clickLinkInMessage('notice', 'here'); $this->salesInvoiceReport->getFilterForm()->viewsReport($invoiceReport); $this->salesInvoiceReport->getActionBlock()->showReport(); } diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertSalesReportResult.php b/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertSalesReportResult.php index 16af632c450ab59a2e803b609454d6d832064d32..d4f5bdda3b2f6074bb6519263f70843d114d8c42 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertSalesReportResult.php +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/Constraint/AbstractAssertSalesReportResult.php @@ -39,7 +39,7 @@ abstract class AbstractAssertSalesReportResult extends AbstractConstraint protected function searchInSalesReportGrid(array $salesReport) { $this->salesReportPage->open(); - $this->salesReportPage->getMessagesBlock()->clickLinkInMessages('notice', 'here'); + $this->salesReportPage->getMessagesBlock()->clickLinkInMessage('notice', 'here'); $this->salesReportPage->getFilterBlock()->viewsReport($salesReport); $this->salesReportPage->getActionBlock()->showReport(); } diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/BestsellerProductsReportEntityTest.php b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/BestsellerProductsReportEntityTest.php index 1ad8d1b3356f731e3c677d3bced986eabe846662..dc532d027d518fd5990f088304c2a3950aad4ad9 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/BestsellerProductsReportEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/BestsellerProductsReportEntityTest.php @@ -64,7 +64,7 @@ class BestsellerProductsReportEntityTest extends Injectable // Preconditions $order->persist(); $this->bestsellers->open(); - $this->bestsellers->getMessagesBlock()->clickLinkInMessages('notice', 'here'); + $this->bestsellers->getMessagesBlock()->clickLinkInMessage('notice', 'here'); // Steps $this->bestsellers->getFilterBlock()->viewsReport($bestsellerReport); diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesInvoiceReportEntityTest.php b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesInvoiceReportEntityTest.php index 895f48a9ecac2c44f74b7f3171305e6f40cc327b..1bc9125d8c747158ddcbdee4c6c93b4f11a11816 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesInvoiceReportEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesInvoiceReportEntityTest.php @@ -52,7 +52,7 @@ class SalesInvoiceReportEntityTest extends Injectable { // Preconditions $salesInvoiceReport->open(); - $salesInvoiceReport->getMessagesBlock()->clickLinkInMessages('notice', 'here'); + $salesInvoiceReport->getMessagesBlock()->clickLinkInMessage('notice', 'here'); $salesInvoiceReport->getFilterForm()->viewsReport($invoiceReport); $salesInvoiceReport->getActionBlock()->showReport(); $initialInvoiceResult = $salesInvoiceReport->getGridBlock()->getLastResult(); diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesOrderReportEntityTest.php b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesOrderReportEntityTest.php index ec395cc8e3fd6a3cb27e4188198d6482fc7de0ae..7dde2c26f72f28b2d6998a175aef9fc5d7a839e3 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesOrderReportEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesOrderReportEntityTest.php @@ -69,7 +69,7 @@ class SalesOrderReportEntityTest extends Injectable { // Preconditions $this->salesReport->open(); - $this->salesReport->getMessagesBlock()->clickLinkInMessages('notice', 'here'); + $this->salesReport->getMessagesBlock()->clickLinkInMessage('notice', 'here'); $this->salesReport->getFilterBlock()->viewsReport($salesReport); $this->salesReport->getActionBlock()->showReport(); $initialSalesResult = $this->salesReport->getGridBlock()->getLastResult(); diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesRefundsReportEntityTest.php b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesRefundsReportEntityTest.php index f174f4243cd5f2e978ebd2963725c5d9f565a380..f41995615c7583b088f7a704c460ddcd4ccb28ae 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesRefundsReportEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/SalesRefundsReportEntityTest.php @@ -68,7 +68,7 @@ class SalesRefundsReportEntityTest extends Injectable { // Preconditions $this->refundsReport->open(); - $this->refundsReport->getMessagesBlock()->clickLinkInMessages('notice', 'here'); + $this->refundsReport->getMessagesBlock()->clickLinkInMessage('notice', 'here'); $this->refundsReport->getFilterBlock()->viewsReport($refundsReport); $this->refundsReport->getActionBlock()->showReport(); $initialRefundsResult = $this->refundsReport->getGridBlock()->getLastResult(); diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/ViewedProductsReportEntityTest.php b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/ViewedProductsReportEntityTest.php index 6a75582c9a76c7990bab54c1634aa83037147419..93e38fd650b7bec8268e647ef088076d2e235fad 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/ViewedProductsReportEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/ViewedProductsReportEntityTest.php @@ -100,7 +100,7 @@ class ViewedProductsReportEntityTest extends Injectable $productsList = $this->prepareProducts($products); $this->openProducts($productsList, $total); $this->productReportView->open(); - $this->productReportView->getMessagesBlock()->clickLinkInMessages('notice', 'here'); + $this->productReportView->getMessagesBlock()->clickLinkInMessage('notice', 'here'); // Steps $this->productReportView->getFilterBlock()->viewsReport($viewsReport); diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessDeleteMessage.php index 55975ed6c27e89febdbe99e0f906d444bd072206..b8d61581e43905a953bbc15426ead2ecaa175f64 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertProductRatingSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(RatingIndex $ratingIndex) { - $actualMessage = $ratingIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $ratingIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessSaveMessage.php index c443e4be423e41713febcca715cbbdeef2c1715f..355f480d1cac437a909ec9a52a559386d847de5a 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductRatingSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertProductRatingSuccessSaveMessage extends AbstractConstraint */ public function processAssert(RatingIndex $ratingIndex) { - $actualMessage = $ratingIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $ratingIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewBackendSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewBackendSuccessSaveMessage.php index f4491856b535a8a2aef8a886ec73818f861e8c94..851cd6baebfbda234ae7379053c931706a5e627f 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewBackendSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewBackendSuccessSaveMessage.php @@ -30,7 +30,7 @@ class AssertProductReviewBackendSuccessSaveMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $reviewIndex->getMessagesBlock()->getSuccessMessages(), + $reviewIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessDeleteMessage.php index cf57f87ba429c9e5774e75163ce75c5403ab5da9..7d7acd1c1b1fb6f6ec5c92042ad4f2bbca2f08dc 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessDeleteMessage.php @@ -38,7 +38,7 @@ class AssertProductReviewMassActionSuccessDeleteMessage extends AbstractConstrai $deleteMessage = sprintf(self::SUCCESS_DELETE_MESSAGE, count($reviews)); \PHPUnit_Framework_Assert::assertEquals( $deleteMessage, - $reviewIndex->getMessagesBlock()->getSuccessMessages(), + $reviewIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessMessage.php index af2b135f82f08f080aa13f8b48468612e25e5dbf..8bed779b1ad4e0cef91a51d8826006cd328a0896 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewMassActionSuccessMessage.php @@ -34,7 +34,7 @@ class AssertProductReviewMassActionSuccessMessage extends AbstractConstraint $successMessage = sprintf(self::SUCCESS_MESSAGE, count($reviews)); \PHPUnit_Framework_Assert::assertEquals( $successMessage, - $reviewIndex->getMessagesBlock()->getSuccessMessages(), + $reviewIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php index a5b7e25733f420421ffd57e851a0a9fda9ffa063..c582f325845cbdaa18e2f85a4371a1ba0d44fa71 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php @@ -27,7 +27,7 @@ class AssertReviewCreationSuccessMessage extends AbstractConstraint */ public function processAssert(CatalogProductView $catalogProductView) { - $actualMessage = $catalogProductView->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $catalogProductView->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewSuccessSaveMessage.php index 6804156e9d589738e0efe3b17a7d9bb8e5fbdae1..a8b1ebe03117763411dfb7e11833ac6278d539ad 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertReviewSuccessSaveMessage extends AbstractConstraint */ public function processAssert(ReviewIndex $reviewIndex) { - $actualMessage = $reviewIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $reviewIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/CreditMemo/Grid.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/CreditMemo/Grid.php index 0dad1ed84c3b2484dde3660cf131e98f63c9463f..9138b869cad40c889d84eeac1459e569f43ea568 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/CreditMemo/Grid.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/CreditMemo/Grid.php @@ -25,16 +25,16 @@ class Grid extends \Magento\Ui\Test\Block\Adminhtml\DataGrid */ protected $filters = [ 'id' => [ - 'selector' => 'input[name="filters[increment_id]"]', + 'selector' => 'input[name="increment_id"]', ], 'order_id' => [ - 'selector' => 'input[name="filters[order_increment_id]"]', + 'selector' => 'input[name="order_increment_id"]', ], 'grand_total_from' => [ - 'selector' => 'input[name="filters[base_grand_total][from]"]', + 'selector' => 'input[name="base_grand_total[from]"]', ], 'grand_total_to' => [ - 'selector' => 'input[name="filters[base_grand_total][to]"]', + 'selector' => 'input[name="base_grand_total[to]"]', ], ]; } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Invoice/Grid.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Invoice/Grid.php index 7c2761340796d9158f9de223a92c8dffe8e68b68..2a38e9d0d3426840fe551da97f0293446f65157b 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Invoice/Grid.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Invoice/Grid.php @@ -18,16 +18,16 @@ class Grid extends \Magento\Ui\Test\Block\Adminhtml\DataGrid */ protected $filters = [ 'id' => [ - 'selector' => 'input[name="filters[increment_id]"]', + 'selector' => 'input[name="increment_id"]', ], 'order_id' => [ - 'selector' => 'input[name="filters[order_increment_id]"]', + 'selector' => 'input[name="order_increment_id"]', ], 'grand_total_from' => [ - 'selector' => 'input[name="filters[grand_total][from]"]', + 'selector' => 'input[name="grand_total[from]"]', ], 'grand_total_to' => [ - 'selector' => 'input[name="filters[grand_total][to]"]', + 'selector' => 'input[name="grand_total[to]"]', ], ]; diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceSuccessCreateMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceSuccessCreateMessage.php index ef323a4757680d2052e0bc3e283c946f87bc36b2..561694c682f30f520a12b25a8e5ef1266d58cfb4 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceSuccessCreateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceSuccessCreateMessage.php @@ -29,7 +29,7 @@ class AssertInvoiceSuccessCreateMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_CREATE_MESSAGE, - $salesOrderView->getMessagesBlock()->getSuccessMessages() + $salesOrderView->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceWithShipmentSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceWithShipmentSuccessMessage.php index 871f4f3616077701974e5c91a224bca7c1b052cd..47d1bd6e6de6316778d36493440c9ee6346a6d65 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceWithShipmentSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceWithShipmentSuccessMessage.php @@ -29,7 +29,7 @@ class AssertInvoiceWithShipmentSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $salesOrderView->getMessagesBlock()->getSuccessMessages() + $salesOrderView->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionFailMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionFailMessage.php index 45b0e38c91731ea99677a353605816c59e37d1d4..da0c9e71baec2887923c6a499dba2c13a153c29b 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionFailMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionFailMessage.php @@ -30,7 +30,7 @@ class AssertOrderCancelMassActionFailMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::FAIL_CANCEL_MESSAGE, - $orderIndex->getMessagesBlock()->getErrorMessages() + $orderIndex->getMessagesBlock()->getErrorMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionSuccessMessage.php index 6aa1f29bcbd481b2bb8056a887030817b63420cc..30e2417ac69cca3a601e0117d42184e3934d49e1 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelMassActionSuccessMessage.php @@ -31,7 +31,7 @@ class AssertOrderCancelMassActionSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_CANCEL_MESSAGE, $ordersCount), - $orderIndex->getMessagesBlock()->getSuccessMessages() + $orderIndex->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelSuccessMessage.php index fe5bc74d63c8d6c3e66e685cfc16dff1ab50f2e3..7672d7296106ab5be56509f5a50c5b680602baa6 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderCancelSuccessMessage.php @@ -29,7 +29,7 @@ class AssertOrderCancelSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_CANCEL_MESSAGE, - $salesOrderView->getMessagesBlock()->getSuccessMessages() + $salesOrderView->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderMassOnHoldSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderMassOnHoldSuccessMessage.php index 1f1508c0c422ae9e061dfcc4cd6f005bbd1a914b..d3ae442b81e92bf33285f8dcc9c4bd173818481a 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderMassOnHoldSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderMassOnHoldSuccessMessage.php @@ -35,7 +35,7 @@ class AssertOrderMassOnHoldSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_ON_HOLD_MESSAGE, $ordersCount), - $orderIndex->getMessagesBlock()->getSuccessMessages() + $orderIndex->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldFailMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldFailMessage.php index f86e9757adf419d706b22e423ab14429ce580a44..7a016fc7be8cade905d5e680b0791d622e7c2e83 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldFailMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldFailMessage.php @@ -30,7 +30,7 @@ class AssertOrderOnHoldFailMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::FAIL_ON_HOLD_MESSAGE, - $orderIndex->getMessagesBlock()->getErrorMessages() + $orderIndex->getMessagesBlock()->getErrorMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldSuccessMessage.php index 38d9ff38c11a4c93434c20511d5361444194daca..befab64fec1ed4a51f3631bb6e6f4561793ac081 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderOnHoldSuccessMessage.php @@ -44,7 +44,7 @@ class AssertOrderOnHoldSuccessMessage extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( $successOnHoldMessage, - $orderIndex->getMessagesBlock()->getSuccessMessages() + $orderIndex->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseFailMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseFailMessage.php index 26b1fadf28eff554b9c0fcff053e3bf0da886054..ccd34d2cc7492762471edbe00ef77a0cdc7b4fdb 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseFailMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseFailMessage.php @@ -30,7 +30,7 @@ class AssertOrderReleaseFailMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::FAIL_RELEASE_MESSAGE, - $orderIndex->getMessagesBlock()->getErrorMessages() + $orderIndex->getMessagesBlock()->getErrorMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseSuccessMessage.php index 5ceebe7a11de8d1341dca68553d6e67d882baa92..4de44d6b18a588817c64863ce55a9037eafe9074 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderReleaseSuccessMessage.php @@ -31,7 +31,7 @@ class AssertOrderReleaseSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_RELEASE_MESSAGE, $ordersCount), - $orderIndex->getMessagesBlock()->getSuccessMessages() + $orderIndex->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusDuplicateStatus.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusDuplicateStatus.php index 4ab58755f5ea3ac1d3ae5cafabf22356400407e5..eeed99ee0c85b1071a28801bbb752a7918582a95 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusDuplicateStatus.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusDuplicateStatus.php @@ -25,7 +25,7 @@ class AssertOrderStatusDuplicateStatus extends AbstractConstraint */ public function processAssert(OrderStatusNew $orderStatusNewPage) { - $actualMessage = $orderStatusNewPage->getMessagesBlock()->getErrorMessages(); + $actualMessage = $orderStatusNewPage->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( self::DUPLICATE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php index b20839bba30cd73e682177330a2bfb000b4f369e..cd9c9249ac485a2b8064fdb1c6c697f1701d0b2e 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php @@ -30,7 +30,7 @@ class AssertOrderStatusSuccessAssignMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $orderStatusIndexPage->getMessagesBlock()->getSuccessMessages() + $orderStatusIndexPage->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php index 0e6e63eb9f18507493187c9b7d1311d9455b25d4..f7f63595f92618b0c4238dfb54449be4380a0b4d 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php @@ -29,7 +29,7 @@ class AssertOrderStatusSuccessCreateMessage extends AbstractConstraint */ public function processAssert(OrderStatusIndex $orderStatusIndexPage) { - $actualMessage = $orderStatusIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $orderStatusIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessUnassignMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessUnassignMessage.php index 1526b66c4a76f56c4366a422b491f892e410160c..9ba8c02a704717ba2a910ad5dc45f66d8b24eed9 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessUnassignMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessUnassignMessage.php @@ -30,7 +30,7 @@ class AssertOrderStatusSuccessUnassignMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $orderStatusIndexPage->getMessagesBlock()->getSuccessMessages() + $orderStatusIndexPage->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderSuccessCreateMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderSuccessCreateMessage.php index 16315c537bf0f3b775190fd965ca7e762f1c8b17..cc24dcbabcb86005b93eddd4b23db7b5b4665586 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderSuccessCreateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderSuccessCreateMessage.php @@ -33,7 +33,7 @@ class AssertOrderSuccessCreateMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $salesOrderView->getMessagesBlock()->getSuccessMessages(), + $salesOrderView->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundSuccessCreateMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundSuccessCreateMessage.php index 9131c7e77eb032abfa73cb8be40aabbf6a8d012b..b425142c00a692683c48db88b643df029ec9ff78 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundSuccessCreateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertRefundSuccessCreateMessage.php @@ -29,7 +29,7 @@ class AssertRefundSuccessCreateMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_CREATE_MESSAGE, - $salesOrderView->getMessagesBlock()->getSuccessMessages() + $salesOrderView->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Webapi.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Webapi.php index a1e89784737ae43635a12599a3ff534ed65c86c4..bdfbc3b5d157ddb23c3b4b9fab69c1abf2d27738 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Webapi.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Handler/OrderInjectable/Webapi.php @@ -31,6 +31,7 @@ class Webapi extends AbstractWebapi implements OrderInjectableInterface ], 'country_id' => [ 'United States' => 'US', + 'United Kingdom' => 'GB', ], ]; diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php index 2cf4cfb37d7591c67c41fb0a4db26eec88ec3860..be22d6b72bb536097a5e8119def9748b75f70d61 100644 --- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php @@ -28,7 +28,7 @@ class AssertCartPriceRuleSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(PromoQuoteIndex $promoQuoteIndex) { - $actualMessage = $promoQuoteIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $promoQuoteIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php index 6c0484f965e26af8788efebd59abcd6a6527af5b..278952390ad481c88bfe0c9162dcf29ad02ac74b 100644 --- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertCartPriceRuleSuccessSaveMessage extends AbstractConstraint */ public function processAssert(PromoQuoteIndex $promoQuoteIndex) { - $actualMessage = $promoQuoteIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $promoQuoteIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml index 4c384ea3f8853265fa0ba9877a56492a871914dc..c75becfb6b45fd1b54a25031a6d17f0d94586d4c 100644 --- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/TestCase/CreateSalesRuleEntityTest.xml @@ -249,7 +249,7 @@ <data name="salesRule/data/website_ids/0" xsi:type="string">Main Website</data> <data name="salesRule/data/customer_group_ids/0" xsi:type="string">NOT LOGGED IN</data> <data name="salesRule/data/coupon_type" xsi:type="string">No Coupon</data> - <data name="salesRule/data/conditions_serialized" xsi:type="string">{Product attribute combination:[Product Template|is|Default]}</data> + <data name="salesRule/data/conditions_serialized" xsi:type="string">{Product attribute combination:[Attribute Set|is|Default]}</data> <data name="salesRule/data/simple_action" xsi:type="string">Percent of product price discount</data> <data name="salesRule/data/discount_amount" xsi:type="string">50</data> <data name="salesRule/data/apply_to_shipping" xsi:type="string">No</data> diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Shipment/Grid.php b/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Shipment/Grid.php index b77443423773ba216acc535fecde78adae54dd59..d094c186e3108382afd5d1f99df76409650fe124 100644 --- a/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Shipment/Grid.php +++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Shipment/Grid.php @@ -27,16 +27,16 @@ class Grid extends GridInterface */ protected $filters = [ 'id' => [ - 'selector' => 'input[name="filters[increment_id]"]', + 'selector' => 'input[name="increment_id"]', ], 'order_id' => [ - 'selector' => 'input[name="filters[order_increment_id]"]', + 'selector' => 'input[name="order_increment_id"]', ], 'total_qty_from' => [ - 'selector' => 'input[name="filters[total_qty][from]"]', + 'selector' => 'input[name="total_qty[from]"', ], 'total_qty_to' => [ - 'selector' => 'input[name="filters[total_qty][to]"]', + 'selector' => 'input[name="total_qty][to]"', ], ]; } diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/Constraint/AssertShipmentSuccessCreateMessage.php b/dev/tests/functional/tests/app/Magento/Shipping/Test/Constraint/AssertShipmentSuccessCreateMessage.php index f2fcaf7697c5692da1ad95d0698f796316879af3..4c09a5d1ca7da213006d86e9357268d88bb1e08f 100644 --- a/dev/tests/functional/tests/app/Magento/Shipping/Test/Constraint/AssertShipmentSuccessCreateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/Constraint/AssertShipmentSuccessCreateMessage.php @@ -29,7 +29,7 @@ class AssertShipmentSuccessCreateMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $salesOrderView->getMessagesBlock()->getSuccessMessages() + $salesOrderView->getMessagesBlock()->getSuccessMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailFolderSaveMessage.php b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailFolderSaveMessage.php index da7884f1f17ee3aabcf65809fa4a9bde1d536ada..8f27a314d13b4840c3119afab5ccc32435f3026c 100644 --- a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailFolderSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailFolderSaveMessage.php @@ -26,7 +26,7 @@ class AssertSitemapFailFolderSaveMessage extends AbstractConstraint */ public function processAssert(SitemapIndex $sitemapPage, Sitemap $sitemap) { - $actualMessage = $sitemapPage->getMessagesBlock()->getErrorMessages(); + $actualMessage = $sitemapPage->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( sprintf(self::FAIL_FOLDER_MESSAGE, $sitemap->getSitemapPath()), $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailPathSaveMessage.php b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailPathSaveMessage.php index 82217a2d958c40b30c02a1c9f56e0c3dbfc6e5f0..8a188d6880eb7f82a1de27045826921b43a994e1 100644 --- a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailPathSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapFailPathSaveMessage.php @@ -26,7 +26,7 @@ class AssertSitemapFailPathSaveMessage extends AbstractConstraint */ public function processAssert(SitemapIndex $sitemapPage, Sitemap $sitemap) { - $actualMessage = $sitemapPage->getMessagesBlock()->getErrorMessages(); + $actualMessage = $sitemapPage->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( sprintf(self::FAIL_PATH_MESSAGE, $sitemap->getSitemapFilename()), $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessDeleteMessage.php index 0209c3f0a7659e98be796329a23705070ff61edb..f02734b53949517da91d125039602bce6c820fc8 100644 --- a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertSitemapSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(SitemapIndex $sitemapPage) { - $actualMessage = $sitemapPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $sitemapPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessGenerateMessage.php b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessGenerateMessage.php index 77e58ce48e148638de09e08d987d87efd097bc31..b8178bf6b85ac1e5e97a1ae5ad88111db5d580a5 100644 --- a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessGenerateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessGenerateMessage.php @@ -32,7 +32,7 @@ class AssertSitemapSuccessGenerateMessage extends AbstractConstraint SitemapIndex $sitemapPage, Sitemap $sitemap ) { - $actualMessage = $sitemapPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $sitemapPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_GENERATE_MESSAGE, $sitemap->getSitemapFilename()), $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessSaveMessage.php index e0e4efc80694dfa9901040e5b5ffec1610424782..e25e8eec6bdbbe10184d52e37db04e7b7e6920a3 100644 --- a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Constraint/AssertSitemapSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertSitemapSuccessSaveMessage extends AbstractConstraint */ public function processAssert(SitemapIndex $sitemapPage) { - $actualMessage = $sitemapPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $sitemapPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php index ea9be6f761b102f359cc1edd0a5ee16564c077f2..d74e39c143582c62bb18100953230a8dac75b1c2 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php @@ -30,7 +30,7 @@ class AssertStoreGroupSuccessDeleteMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, - $storeIndex->getMessagesBlock()->getSuccessMessages(), + $storeIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success delete message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php index 5be639d9d9279bca28978d4af48012a9ab2722a8..f9d2aafc57a6ea4cb7d3ffbab491be53b7de6d33 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php @@ -30,7 +30,7 @@ class AssertStoreGroupSuccessSaveMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $storeIndex->getMessagesBlock()->getSuccessMessages(), + $storeIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php index 82dd5459f8ba49c1d9e98ce71cd79d002438b07f..957357f71e5e55a055f6beda12fc65c822bfb35d 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php @@ -30,7 +30,7 @@ class AssertStoreSuccessDeleteMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, - $storeIndex->getMessagesBlock()->getSuccessMessages(), + $storeIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success delete message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php index cf467e88cb587ebfe66c9c9049448a8eb1208b67..ac66a3412b7a499bf46dcbb1d977e205fcd98cfc 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php @@ -30,7 +30,7 @@ class AssertStoreSuccessSaveMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $storeIndex->getMessagesBlock()->getSuccessMessages(), + $storeIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php index 11d54478e8df7fbb28c202d1b62fffb54a59e162..076d7daaa32616977e2a7edaff83673f7ce70492 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php @@ -30,7 +30,7 @@ class AssertWebsiteSuccessDeleteMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, - $storeIndex->getMessagesBlock()->getSuccessMessages(), + $storeIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success delete message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php index 2078e611262bc4022a42a8f0d37fc09d8534dbaf..60dde78e3eb59139ec70f184be88361a91943f3e 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php @@ -30,7 +30,7 @@ class AssertWebsiteSuccessSaveMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $storeIndex->getMessagesBlock()->getSuccessMessages(), + $storeIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessDeleteMessage.php index f956e5c82b97bd87c08c3fec8f158fd995dfb9cb..f8ae7822c5783859ecd0a255a56c4ba7249c5cec 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertTaxRateSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(TaxRateIndex $taxRateIndex) { - $actualMessage = $taxRateIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $taxRateIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessSaveMessage.php index 165e9a7aeb65f2be2fd5a9a13903e6e793fae7ee..79a9b63ea942da615336b45dd42d04ddf24e6bb4 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertTaxRateSuccessSaveMessage extends AbstractConstraint */ public function processAssert(TaxRateIndex $taxRateIndexPage) { - $actualMessage = $taxRateIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $taxRateIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessDeleteMessage.php index 44c3367d48e34c54f0f4b534f4f34c7600190691..5a7872a6373c2c5ca03ee0a43f8e0c10d37f5893 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertTaxRuleSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(TaxRuleIndex $taxRuleIndex) { - $actualMessage = $taxRuleIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $taxRuleIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessSaveMessage.php index 73e32f4f8b151902bef7d3702bc9462b25080852..8234673ee1cdefdc70911cbdfd531bba2f96fe62 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleSuccessSaveMessage.php @@ -28,7 +28,7 @@ class AssertTaxRuleSuccessSaveMessage extends AbstractConstraint */ public function processAssert(TaxRuleIndex $taxRuleIndex) { - $actualMessage = $taxRuleIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $taxRuleIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml index c54201720c84b9766e0fb00f52f673e9ee4ec7f6..52dea03715a3677a424eddae35e4a7bf4eee26ec 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml @@ -19,7 +19,7 @@ <data name="customerGroup" xsi:type="string">valid_intra_union_group</data> <data name="cart/data/subtotal" xsi:type="string">10</data> <data name="cart/data/tax_amount" xsi:type="string">2</data> - <data name="cart/data/grand_total" xsi:type="string">12</data> + <data name="cart/data/grand_total" xsi:type="string">17</data> <data name="prices" xsi:type="array"> <item name="grandTotal" xsi:type="string">17</item> </data> diff --git a/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php b/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php index 5757bf446e6eecf0bf13ea8c2e9253e3166ae137..849b1d7a3f45e920bf42a9f02ab4e0533beecaf7 100644 --- a/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php +++ b/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/DataGrid.php @@ -128,6 +128,20 @@ class DataGrid extends Grid */ protected $alertModal = '._show[data-role=modal]'; + /** + * Locator for 'Sort' link. + * + * @var string + */ + protected $sortLink = "//th[contains(@class, '%s')]/span[contains(text(), '%s')]"; + + /** + * Current page input. + * + * @var string + */ + protected $currentPage = '#pageCurrent'; + /** * Clear all applied Filters. * @@ -139,6 +153,7 @@ class DataGrid extends Grid if ($chipsHolder->isVisible()) { parent::resetFilter(); } + $this->waitLoader(); } /** @@ -239,23 +254,23 @@ class DataGrid extends Grid if ($this->_rootElement->find($this->noRecords)->isVisible()) { return; } - if (!is_array($action)) { - $action = [$action => '-']; - } - foreach ($items as $item) { - $this->searchAndSelect($item); - } + $this->selectItems($items); if ($massActionSelection) { $this->_rootElement->find($this->massActionToggleButton)->click(); $this->_rootElement ->find(sprintf($this->massActionToggleList, $massActionSelection), Locator::SELECTOR_XPATH) ->click(); } - $actionType = key($action); + $actionType = is_array($action) ? key($action) : $action; $this->_rootElement->find($this->massActionButton)->click(); $this->_rootElement ->find(sprintf($this->massActionToggleList, $actionType), Locator::SELECTOR_XPATH) ->click(); + if (is_array($action)) { + $this->_rootElement + ->find(sprintf($this->massActionToggleList, end($action)), Locator::SELECTOR_XPATH) + ->click(); + } if ($acceptAlert) { $element = $this->browser->find($this->alertModal); /** @var \Magento\Ui\Test\Block\Adminhtml\Modal $modal */ @@ -264,6 +279,49 @@ class DataGrid extends Grid } } + /** + * Select items without using grid search. + * + * @param array $items + * @return void + * @throws \Exception + */ + public function selectItems(array $items) + { + $this->sortGridByField('ID'); + foreach ($items as $item) { + $this->_rootElement->find($this->currentPage)->setValue(''); + $this->waitLoader(); + $selectItem = $this->getRow($item)->find($this->selectItem); + do { + if ($selectItem->isVisible() && !$selectItem->isSelected()) { + $selectItem->click(); + break; + } + } while ($this->nextPage()); + if (!$selectItem->isVisible()) { + throw new \Exception('Searched item was not found.'); + } + } + } + + /** + * Sort grid by field. + * + * @param string $field + * @param string $sort + * @return void + */ + public function sortGridByField($field, $sort = "desc") + { + $reverseSort = $sort == 'desc' ? 'asc' : 'desc'; + $sortBlock = $this->_rootElement->find(sprintf($this->sortLink, $reverseSort, $field), Locator::SELECTOR_XPATH); + if ($sortBlock->isVisible()) { + $sortBlock->click(); + $this->waitLoader(); + } + } + /** * @param string $columnLabel */ diff --git a/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/Modal.php b/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/Modal.php index 96ed46ae296cd0ec50cb90259929c9d87d068e5d..f2ecfee702bdf66380b8ce8a7a3a9a6af5e9222f 100644 --- a/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/Modal.php +++ b/dev/tests/functional/tests/app/Magento/Ui/Test/Block/Adminhtml/Modal.php @@ -41,6 +41,13 @@ class Modal extends Block */ protected $inputFieldSelector = '[data-role="promptField"]'; + /** + * Modal overlay selector. + * + * @var string + */ + protected $modalOverlay = '.modals-overlay'; + /** * Press OK on an alert, confirm, prompt a dialog. * @@ -91,4 +98,18 @@ class Modal extends Block { $this->_rootElement->find($this->inputFieldSelector)->setValue($text); } + + /** + * Wait until modal window will disapper. + * + * @return void + */ + public function waitModalWindowToDisappear() + { + $this->browser->waitUntil( + function () { + return $this->browser->find($this->modalOverlay)->isVisible() == false ? true : null; + } + ); + } } diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php index ac453e2ebdc40642ed3d948c5663aaec5bd9d9a7..c27afd627bfb8250014f6142b13b2a31afdda6a7 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php @@ -28,7 +28,7 @@ class AssertUrlRewriteDeletedMessage extends AbstractConstraint */ public function processAssert(UrlRewriteIndex $index) { - $actualMessage = $index->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $index->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteSaveMessage.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteSaveMessage.php index 97d8c67ce5e53fe5a918ef914a5e8f9e258b1054..5d3e4a547d5f613cb57bf1a64cb800b71aac28ac 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteSaveMessage.php @@ -25,7 +25,7 @@ class AssertUrlRewriteSaveMessage extends AbstractConstraint */ public function processAssert(UrlRewriteIndex $index) { - $actualMessage = $index->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $index->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Block/Adminhtml/Role/Tab/User/Grid.php b/dev/tests/functional/tests/app/Magento/User/Test/Block/Adminhtml/Role/Tab/User/Grid.php index ab1ea537ea6431ed7aaa7fd9b5a352b6b5bf0edc..ec0c365b817127c7f08b869a2e531d7090336e9c 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Block/Adminhtml/Role/Tab/User/Grid.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Block/Adminhtml/Role/Tab/User/Grid.php @@ -30,5 +30,5 @@ class Grid extends AbstractGrid * * @var string */ - protected $selectItem = '.col-in_role_users > input'; + protected $selectItem = '.col-in_role_users input'; } diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertAccessTokensErrorRevokeMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertAccessTokensErrorRevokeMessage.php index b8110526b398ecc7a2697da3dd0aac72c4881801..58920c5edeec0612f80af4e4759f7373889c51de 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertAccessTokensErrorRevokeMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertAccessTokensErrorRevokeMessage.php @@ -30,7 +30,7 @@ class AssertAccessTokensErrorRevokeMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::ERROR_MESSAGE, - $userEdit->getMessagesBlock()->getErrorMessages() + $userEdit->getMessagesBlock()->getErrorMessage() ); } diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnAccount.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnAccount.php index 89169bcf80ef342c0cfb63250e486c3cfa793ffe..b66e275b4795c6e24c4c11bf5058c6b0d16dcd6e 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnAccount.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnAccount.php @@ -24,7 +24,7 @@ class AssertImpossibleDeleteYourOwnAccount extends AbstractConstraint */ public function processAssert(UserEdit $userEdit) { - $errorMessage = $userEdit->getMessagesBlock()->getErrorMessages(); + $errorMessage = $userEdit->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( self::ERROR_MESSAGE, $errorMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnRole.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnRole.php index c469966dc940a9b08cd70f1a051881c3d2495321..06d525e2b4a666ba0b6cb5237c19b61207a32b49 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnRole.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertImpossibleDeleteYourOwnRole.php @@ -24,7 +24,7 @@ class AssertImpossibleDeleteYourOwnRole extends AbstractConstraint */ public function processAssert(UserRoleEditRole $rolePage) { - $errorMessage = $rolePage->getMessagesBlock()->getErrorMessages(); + $errorMessage = $rolePage->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( self::ERROR_MESSAGE, $errorMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessDeleteMessage.php index 943acd3b521fcc50631d1c6310c82f77138297a2..8d828ceb237b860ed2d8c8cfb6a98e2928b02a0e 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertRoleSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(UserRoleIndex $rolePage) { - $successMessage = $rolePage->getMessagesBlock()->getSuccessMessages(); + $successMessage = $rolePage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $successMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessSaveMessage.php index 4487b76954a4f6b6d5ea4974bf30aed9712cee72..402234f7b48a36e3b267a29c93beaab13fa9aeec 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertRoleSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertRoleSuccessSaveMessage extends AbstractConstraint */ public function processAssert(UserRoleIndex $rolePage) { - $successMessage = $rolePage->getMessagesBlock()->getSuccessMessages(); + $successMessage = $rolePage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $successMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserDuplicateMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserDuplicateMessage.php index 66e1d6b432aa6447126165e1002b939895cdc8b0..99c6e89ad0a35e7194f2bc8e929f4e63fa5f9dcb 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserDuplicateMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserDuplicateMessage.php @@ -24,7 +24,7 @@ class AssertUserDuplicateMessage extends AbstractConstraint */ public function processAssert(UserEdit $userEdit) { - $failedMessage = $userEdit->getMessagesBlock()->getErrorMessages(); + $failedMessage = $userEdit->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( self::ERROR_MESSAGE, $failedMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginByPermissionMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginByPermissionMessage.php index db943e911a3d0c3c695cecd9e7372f4e86ebf869..2454f53eb0f6a0d6e3793e51dc387aae35a10dfe 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginByPermissionMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginByPermissionMessage.php @@ -32,7 +32,7 @@ class AssertUserFailedLoginByPermissionMessage extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( self::FAILED_LOGIN_MESSAGE, - $adminAuth->getMessagesBlock()->getErrorMessages(), + $adminAuth->getMessagesBlock()->getErrorMessage(), 'Message "' . self::FAILED_LOGIN_MESSAGE . '" is not visible.' ); } diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginMessage.php index e01aa9a9cd0cdfe0af16c3c74c6f32cfdbe8f669..c57af1f5abb1a186b2c6136505812161a1aa0d1a 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserFailedLoginMessage.php @@ -34,7 +34,7 @@ class AssertUserFailedLoginMessage extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( self::FAILED_LOGIN_MESSAGE, - $adminAuth->getMessagesBlock()->getErrorMessages(), + $adminAuth->getMessagesBlock()->getErrorMessage(), 'Message "' . self::FAILED_LOGIN_MESSAGE . '" is not visible.' ); } diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailHostnameMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailHostnameMessage.php index 74af3f80cd78f038dcd04a1e76d4a23dd0013fe3..117857a23fc2352dcb6c386ed83c6f276d3db8c8 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailHostnameMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailHostnameMessage.php @@ -33,7 +33,7 @@ class AssertUserInvalidEmailHostnameMessage extends AbstractConstraint $email = $user->getEmail(); $hostname = substr($email, strpos($email, '@')+1); $expectedMessage = sprintf(self::ERROR_MESSAGE, $hostname, $email); - $actualMessage = $userEdit->getMessagesBlock()->getErrorMessages(); + $actualMessage = $userEdit->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectedMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailMessage.php index 431b9f13c71cc8838efebd393e61f2b311276733..f9c878f6889a98e16b770f931989a31e9392cf9f 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserInvalidEmailMessage.php @@ -31,7 +31,7 @@ class AssertUserInvalidEmailMessage extends AbstractConstraint public function processAssert(UserEdit $userEdit, User $user) { $expectedMessage = sprintf(self::ERROR_MESSAGE, $user->getEmail()); - $actualMessage = $userEdit->getMessagesBlock()->getErrorMessages(); + $actualMessage = $userEdit->getMessagesBlock()->getErrorMessage(); \PHPUnit_Framework_Assert::assertEquals( $expectedMessage, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessDeleteMessage.php index c6f7e9e69495c0d3530e7db93cd670b00490a279..a6ba344c97fb76200f62a6069b1dc0a9cbd98701 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessDeleteMessage.php @@ -28,7 +28,7 @@ class AssertUserSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(UserIndex $userIndex) { - $successMessage = $userIndex->getMessagesBlock()->getSuccessMessages(); + $successMessage = $userIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $successMessage, diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessSaveMessage.php index e8f4e5f55715a9968559d193c3c49c5e12cec5a3..8cf031d5694da7ca29d553d4ba72465bb4c75a14 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertUserSuccessSaveMessage extends AbstractConstraint */ public function processAssert(UserIndex $userIndex) { - $successMessage = $userIndex->getMessagesBlock()->getSuccessMessages(); + $successMessage = $userIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $successMessage, diff --git a/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessDeleteMessage.php index 596577190cab66e24fd31bac364975fdbcc263b2..d4a73859e76cb28fb4d397443b6876ef025fc614 100644 --- a/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessDeleteMessage.php @@ -24,7 +24,7 @@ class AssertCustomVariableSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(SystemVariableIndex $systemVariableIndexPage) { - $actualMessage = $systemVariableIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $systemVariableIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessSaveMessage.php index dd723c012ab74497e12a3fcb10f853d8ed8e49f7..67117ed950bacaefb62f16544f8f9a4a4a400421 100644 --- a/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Variable/Test/Constraint/AssertCustomVariableSuccessSaveMessage.php @@ -24,7 +24,7 @@ class AssertCustomVariableSuccessSaveMessage extends AbstractConstraint */ public function processAssert(SystemVariableIndex $systemVariableIndexPage) { - $actualMessage = $systemVariableIndexPage->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $systemVariableIndexPage->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_SAVE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Weee/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/Weee/Test/Repository/ConfigData.xml index c78a826e8500caf6b191ff38d58a0c84d7d7c76e..95d06f6d4074a56ab81a458d552c424ab698bd47 100644 --- a/dev/tests/functional/tests/app/Magento/Weee/Test/Repository/ConfigData.xml +++ b/dev/tests/functional/tests/app/Magento/Weee/Test/Repository/ConfigData.xml @@ -92,19 +92,19 @@ <field name="tax/weee/display_list" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display_sales" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/apply_vat" xsi:type="array"> @@ -242,19 +242,19 @@ <field name="tax/weee/display_list" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display_sales" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/apply_vat" xsi:type="array"> @@ -392,19 +392,19 @@ <field name="tax/weee/display_list" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display_sales" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/apply_vat" xsi:type="array"> @@ -467,19 +467,19 @@ <field name="tax/weee/display_list" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display_sales" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/apply_vat" xsi:type="array"> @@ -542,19 +542,19 @@ <field name="tax/weee/display_list" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/display_sales" xsi:type="array"> <item name="scope" xsi:type="string">tax</item> <item name="scope_id" xsi:type="number">1</item> - <item name="label" xsi:type="string">Excluding FPT, FPT description, final price</item> + <item name="label" xsi:type="string">Excluding FPT. Including FPT description and final price</item> <item name="value" xsi:type="number">2</item> </field> <field name="tax/weee/apply_vat" xsi:type="array"> diff --git a/dev/tests/functional/tests/app/Magento/Weee/Test/TestCase/CreateTaxWithFptTest.php b/dev/tests/functional/tests/app/Magento/Weee/Test/TestCase/CreateTaxWithFptTest.php index 1bdedf647cb0b99bd7ccfff33cd1ed1782eec882..ce13fcc374129d215af42f18ccd4cb4c8423ba5a 100644 --- a/dev/tests/functional/tests/app/Magento/Weee/Test/TestCase/CreateTaxWithFptTest.php +++ b/dev/tests/functional/tests/app/Magento/Weee/Test/TestCase/CreateTaxWithFptTest.php @@ -24,15 +24,15 @@ use Magento\Mtf\TestCase\Injectable; * 7. Go to Stores > Attributes > Product and add new attribute. * 8. Select Fixed Product Tax type and fill attribute label. * 9. Save attribute. - * 10. Go to Stores > Attributes > Product Template. - * 11. Add new product template based on default. + * 10. Go to Stores > Attributes > Attribute Set. + * 11. Add new attribute set based on default. * 12. Add created FPT attribute to Product Details group and fill set name. * 13. Save attribute set. * * Steps: * 1. Go to Products > Catalog. * 2. Add new product. - * 3. Select created product template. + * 3. Select created attribute set. * 4. Fill data according to dataset. * 5. Save product. * 6. Go to Stores > Configuration. @@ -69,12 +69,12 @@ class CreateTaxWithFptTest extends Injectable $this->fixtureFactory = $fixtureFactory; $customer = $fixtureFactory->createByCode('customer', ['dataset' => 'johndoe_with_addresses']); $customer->persist(); - $productTemplate = $this->fixtureFactory + $attributeSet = $this->fixtureFactory ->createByCode('catalogAttributeSet', ['dataset' => 'custom_attribute_set_with_fpt']); - $productTemplate->persist(); + $attributeSet->persist(); return [ 'customer' => $customer, - 'productTemplate' => $productTemplate + 'attributeSet' => $attributeSet ]; } @@ -97,7 +97,7 @@ class CreateTaxWithFptTest extends Injectable * * @param string $configData * @param Customer $customer - * @param CatalogAttributeSet $productTemplate + * @param CatalogAttributeSet $attributeSet * @param array $productData * @return array */ @@ -105,12 +105,12 @@ class CreateTaxWithFptTest extends Injectable $productData, $configData, Customer $customer, - CatalogAttributeSet $productTemplate + CatalogAttributeSet $attributeSet ) { $this->fixtureFactory->createByCode('taxRule', ['dataset' => 'tax_rule_default'])->persist(); $product = $this->fixtureFactory->createByCode( 'catalogProductSimple', - ['dataset' => $productData, 'data' => ['attribute_set_id' => ['attribute_set' => $productTemplate]]] + ['dataset' => $productData, 'data' => ['attribute_set_id' => ['attribute_set' => $attributeSet]]] ); $product->persist(); $this->objectManager->create( diff --git a/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessDeleteMessage.php index 57b6aa9da7af7d99f866c253d16378166dc0ac51..687205faabf60d5d45c33a0fac5919b919077af8 100644 --- a/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessDeleteMessage.php @@ -31,7 +31,7 @@ class AssertWidgetSuccessDeleteMessage extends AbstractConstraint */ public function processAssert(WidgetInstanceIndex $widgetInstanceIndex) { - $actualMessage = $widgetInstanceIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $widgetInstanceIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::DELETE_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessSaveMessage.php index dae56dc5d3e44a9c7bf7b249e3f288b7d480464d..4ebfac7c9cf6e9ed3a7c35597df11ae358323f26 100644 --- a/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetSuccessSaveMessage.php @@ -31,7 +31,7 @@ class AssertWidgetSuccessSaveMessage extends AbstractConstraint */ public function processAssert(WidgetInstanceIndex $widgetInstanceIndex) { - $actualMessage = $widgetInstanceIndex->getMessagesBlock()->getSuccessMessages(); + $actualMessage = $widgetInstanceIndex->getMessagesBlock()->getSuccessMessage(); \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, $actualMessage, diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertAddProductToWishlistSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertAddProductToWishlistSuccessMessage.php index ead94063b609e1b9b3f162859196441aded573db..3199d2a356ab8ed3932a1855a0dfe6872c75c970 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertAddProductToWishlistSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertAddProductToWishlistSuccessMessage.php @@ -36,7 +36,7 @@ class AssertAddProductToWishlistSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_MESSAGE, $product->getName()), - $wishlistIndex->getMessagesBlock()->getSuccessMessages(), + $wishlistIndex->getMessagesBlock()->getSuccessMessage(), "Expected success message doesn't match actual." ); } diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertMoveProductToWishlistSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertMoveProductToWishlistSuccessMessage.php index 88a588fe6309f0f7aa70c7bf380598a8effad1ed..fe4fc287c831aa59088d443610f6899e2242ee61 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertMoveProductToWishlistSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertMoveProductToWishlistSuccessMessage.php @@ -32,7 +32,7 @@ class AssertMoveProductToWishlistSuccessMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( sprintf(self::SUCCESS_MESSAGE, $product->getName()), - $wishlistIndex->getMessagesBlock()->getSuccessMessages(), + $wishlistIndex->getMessagesBlock()->getSuccessMessage(), "Expected success move to wish list message doesn't match actual." ); } diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertWishlistShareMessage.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertWishlistShareMessage.php index 7013691e59cbf853b1fe18f596ea5375c3576638..5d7e9dc5f2bd40183194f8f3f448af95ec9632ab 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertWishlistShareMessage.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertWishlistShareMessage.php @@ -34,7 +34,7 @@ class AssertWishlistShareMessage extends AbstractConstraint { \PHPUnit_Framework_Assert::assertEquals( self::SUCCESS_MESSAGE, - $wishlistIndex->getMessagesBlock()->getSuccessMessages(), + $wishlistIndex->getMessagesBlock()->getSuccessMessage(), 'Wrong success message is displayed.' ); } diff --git a/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractConfigFiles.php b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractConfigFiles.php index b6accb73fb6620a9124e58ba6ad939ca749be4ea..086b657047d964331b353c6498cfee0a4dbec341 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractConfigFiles.php +++ b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractConfigFiles.php @@ -51,7 +51,7 @@ abstract class AbstractConfigFiles extends \PHPUnit_Framework_TestCase $validateStateMock = $this->getMockBuilder( 'Magento\Framework\Config\ValidationStateInterface' )->disableOriginalConstructor()->getMock(); - $validateStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validateStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $this->_reader = $this->_objectManager->create( $this->_getReaderClassName(), @@ -79,7 +79,11 @@ abstract class AbstractConfigFiles extends \PHPUnit_Framework_TestCase if ($skip) { $this->markTestSkipped('There are no xml files in the system for this test.'); } - $domConfig = new \Magento\Framework\Config\Dom($file); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(false); + $domConfig = new \Magento\Framework\Config\Dom($file, $validationStateMock); + $errors = []; $result = $domConfig->validate($this->_schemaFile, $errors); $message = "Invalid XML-file: {$file}\n"; foreach ($errors as $error) { diff --git a/dev/tests/integration/testsuite/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/PlaceTest.php b/dev/tests/integration/testsuite/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/PlaceTest.php index 85b6564400494dbe437a8170d74c4426db8e6928..d970637f4181672d549510a9c99f6bfda9e16347 100644 --- a/dev/tests/integration/testsuite/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/PlaceTest.php +++ b/dev/tests/integration/testsuite/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment/PlaceTest.php @@ -13,7 +13,7 @@ class PlaceTest extends \Magento\TestFramework\TestCase\AbstractBackendControlle /** * Test requestToAuthorizenetData returning */ - public function testExecuteAuthorizenetDataReturning() + public function testExecuteInternalAuthorizenetDataReturning() { $requestToAuthorizenetData = ['Authorizenet' => 'data']; @@ -56,11 +56,12 @@ class PlaceTest extends \Magento\TestFramework\TestCase\AbstractBackendControlle ] ); + /** @var \Magento\Authorizenet\Controller\Adminhtml\Authorizenet\Directpost\Payment\PlaceTesting $controller */ $controller = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( 'Magento\Authorizenet\Controller\Adminhtml\Authorizenet\Directpost\Payment\PlaceTesting', ['context' => $context] ); - $controller->execute(); + $controller->executeInternal(); $this->assertContains(json_encode($requestToAuthorizenetData), $this->getResponse()->getBody()); } diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/AuthTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/AuthTest.php index 6d0b535d0c615357944904d508aa28f24df61d55..6ae9fb368c2f18a2052c6d4a9ccbe0141b38ac17 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/AuthTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/AuthTest.php @@ -58,7 +58,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractController /** * Check not logged state - * @covers \Magento\Backend\Controller\Adminhtml\Auth\Login::execute + * @covers \Magento\Backend\Controller\Adminhtml\Auth\Login::executeInternal */ public function testNotLoggedLoginAction() { @@ -72,7 +72,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractController /** * Check logged state - * @covers \Magento\Backend\Controller\Adminhtml\Auth\Login::execute + * @covers \Magento\Backend\Controller\Adminhtml\Auth\Login::executeInternal * @magentoDbIsolation enabled */ public function testLoggedLoginAction() @@ -120,7 +120,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractController } /** - * @covers \Magento\Backend\Controller\Adminhtml\Auth\Logout::execute + * @covers \Magento\Backend\Controller\Adminhtml\Auth\Logout::executeInternal * @magentoDbIsolation enabled */ public function testLogoutAction() @@ -138,7 +138,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractController } /** - * @covers \Magento\Backend\Controller\Adminhtml\Auth\DeniedJson::execute + * @covers \Magento\Backend\Controller\Adminhtml\Auth\DeniedJson::executeInternal * @covers \Magento\Backend\Controller\Adminhtml\Auth\DeniedJson::_getDeniedJson * @magentoDbIsolation enabled */ @@ -158,7 +158,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractController } /** - * @covers \Magento\Backend\Controller\Adminhtml\Auth\DeniedIframe::execute + * @covers \Magento\Backend\Controller\Adminhtml\Auth\DeniedIframe::executeInternal * @covers \Magento\Backend\Controller\Adminhtml\Auth\DeniedIframe::_getDeniedIframe * @magentoDbIsolation enabled */ diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php index 6575448913a4f7344c1d018423f20c9acd733bf3..c5c1c1da1a4785b5ea853f77275f41efb1f5fd55 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php @@ -12,7 +12,7 @@ class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendControlle { /** * Check not logged state - * @covers \Magento\Backend\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Backend\Controller\Adminhtml\Index\Index::executeInternal */ public function testNotLoggedIndexAction() { @@ -27,7 +27,7 @@ class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendControlle /** * Check logged state - * @covers \Magento\Backend\Controller\Adminhtml\Index\Index::execute + * @covers \Magento\Backend\Controller\Adminhtml\Index\Index::executeInternal * @magentoDbIsolation enabled */ public function testLoggedIndexAction() @@ -37,7 +37,7 @@ class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendControlle } /** - * @covers \Magento\Backend\Controller\Adminhtml\Index\GlobalSearch::execute + * @covers \Magento\Backend\Controller\Adminhtml\Index\GlobalSearch::executeInternal */ public function testGlobalSearchAction() { diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/View/OptionsTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/View/OptionsTest.php index 5f715b8c67472816cb1938cc0f57a2e0dca7a5b5..5d7fd4623aa104907733591ba78ddae7012c41fa 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/View/OptionsTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/View/OptionsTest.php @@ -7,8 +7,6 @@ namespace Magento\Catalog\Block\Product\View; /** * Test class for \Magento\Catalog\Block\Product\View\Options. - * - * @magentoDataFixture Magento/Catalog/_files/product_simple.php */ class OptionsTest extends \PHPUnit_Framework_TestCase { @@ -39,6 +37,9 @@ class OptionsTest extends \PHPUnit_Framework_TestCase ); } + /** + * @magentoDataFixture Magento/Catalog/_files/product_simple.php + */ public function testSetGetProduct() { $this->assertSame($this->_product, $this->_block->getProduct()); @@ -50,11 +51,17 @@ class OptionsTest extends \PHPUnit_Framework_TestCase $this->assertSame($product, $this->_block->getProduct()); } + /** + * @magentoDataFixture Magento/Catalog/_files/product_simple.php + */ public function testGetGroupOfOption() { $this->assertEquals('default', $this->_block->getGroupOfOption('test')); } + /** + * @magentoDataFixture Magento/Catalog/_files/product_simple.php + */ public function testGetOptions() { $options = $this->_block->getOptions(); @@ -64,15 +71,52 @@ class OptionsTest extends \PHPUnit_Framework_TestCase } } + /** + * @magentoDataFixture Magento/Catalog/_files/product_simple.php + */ public function testHasOptions() { $this->assertTrue($this->_block->hasOptions()); } + /** + * @magentoDataFixture Magento/Catalog/_files/product_with_dropdown_option.php + */ public function testGetJsonConfig() { - $config = json_decode($this->_block->getJsonConfig()); - $this->assertNotNull($config); - $this->assertNotEmpty($config); + $config = json_decode($this->_block->getJsonConfig(), true); + $configValues = array_values($config); + $this->assertEquals($this->getExpectedJsonConfig(), array_values($configValues[0])); + } + + /** + * Expected data for testGetJsonConfig + * + * @return array + */ + private function getExpectedJsonConfig() + { + return [ + 0 => + ['prices' => + ['oldPrice' => + ['amount' => 10, 'adjustments' => []], + 'basePrice' => ['amount' => 10], + 'finalPrice' => ['amount' => 10] + ], + 'type' => 'fixed', + 'name' => 'drop_down option 1', + ], + 1 => + ['prices' => + ['oldPrice' => + ['amount' => 40, 'adjustments' => []], + 'basePrice' => ['amount' => 40], + 'finalPrice' => ['amount' => 40], + ], + 'type' => 'percent', + 'name' => 'drop_down option 2', + ], + ]; } } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php index 276f752779f224cedd35b06359147952c5961d69..9f501e36fef65cfde64647a4370511026f8cb6b8 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php @@ -11,7 +11,7 @@ namespace Magento\Catalog\Controller\Adminhtml\Product\Action; class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** - * @covers \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Save::execute + * @covers \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Save::executeInternal * * @magentoDataFixture Magento/Catalog/_files/product_simple.php */ @@ -46,7 +46,7 @@ class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendContr } /** - * @covers \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Validate::execute + * @covers \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Validate::executeInternal * * @dataProvider validateActionDataProvider * diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php index 007c4939d78885013937f86f1424a8f2f8ab71e9..479ffa633c865bd8e462f2a4e30b7adb84a90d8a 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php @@ -7,6 +7,7 @@ namespace Magento\Catalog\Controller\Adminhtml\Product; /** * @magentoAppArea adminhtml + * @magentoDbIsolation enabled */ class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendController { @@ -248,7 +249,7 @@ class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendContr protected function _getAttributeData() { return [ - 'is_global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, + 'is_global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'default_value_text' => '0', 'default_value_yesno' => '0', 'default_value_date' => '', diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php index 6fdab58458c5d43ee1840d57a5d6e120487d090f..ddd37fc1cb63f24d3dc7d601856bc80a1d7a97ee 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php @@ -21,7 +21,7 @@ class DeleteTest extends \Magento\TestFramework\TestCase\AbstractBackendControll $this->assertNull($this->getAttributeSetByName('empty_attribute_set')); $this->assertSessionMessages( - $this->equalTo(['The product template has been removed.']), + $this->equalTo(['The attribute set has been removed.']), MessageInterface::TYPE_SUCCESS ); $this->assertRedirect($this->stringContains('catalog/product_set/index/')); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/CategoryTest.php index 15afc0d3e638d21f49d2971b3ec9bf266a78c791..b3de66e5e90cc0d11a617d27530066de7a84e2ae 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/CategoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/CategoryTest.php @@ -25,7 +25,7 @@ class CategoryTest extends \Magento\TestFramework\TestCase\AbstractController return [ 'category without children' => [ 'categoryId' => 5, - ['catalog_category_view_type_default', 'catalog_category_view_type_default_without_children'], + ['catalog_category_view_type_layered', 'catalog_category_view_type_layered_without_children'], [ '%acategorypath-category-1-category-1-1-category-1-1-1%a', '%acategory-category-1-1-1%a', diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/Stub/ProductControllerStub.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/Stub/ProductControllerStub.php index f4d8df15724a1484f9e0dadfe11ab6fb89753f16..87dc9a7363b96931264b9ff00f6f65dfef6c06aa 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/Stub/ProductControllerStub.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/Stub/ProductControllerStub.php @@ -8,7 +8,7 @@ namespace Magento\Catalog\Helper\Product\Stub; class ProductControllerStub extends \Magento\Catalog\Controller\Product { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php index 47a06f0b79160d62b4fa968def65a092a4fd96ce..3b12d91a0fd298122f1de25f8c4453cdd7516cf6 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php @@ -161,7 +161,7 @@ class CategoryTreeTest extends \PHPUnit_Framework_TestCase public function testGetAnchorsAbove() { $this->_model->load(4); - $this->assertEmpty($this->_model->getAnchorsAbove()); + $this->assertContains(3, $this->_model->getAnchorsAbove()); $this->_model->load(5); $this->assertContains(4, $this->_model->getAnchorsAbove()); } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php index ac6c6a79899cea59978b597e65545b0d162747e8..b7f3e22a82a93ad29477ead91d43d82d70d03157 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php @@ -73,7 +73,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->assertTrue((bool)$this->productResource->canBeShowInCategory($product, $categoryId)); } - $this->assertFalse( + $this->assertTrue( (bool)$this->productResource->canBeShowInCategory($product, $categoryThird->getParentId()) ); } @@ -187,12 +187,12 @@ class ProductTest extends \PHPUnit_Framework_TestCase $productThird->setCategoryIds([$categorySixth->getId()]); $productThird->save(); - $categories = [self::DEFAULT_ROOT_CATEGORY, $categorySixth->getId()]; + $categories = [self::DEFAULT_ROOT_CATEGORY, $categorySixth->getId(), $categoryFifth->getId()]; foreach ($categories as $categoryId) { $this->assertTrue((bool)$this->productResource->canBeShowInCategory($productThird, $categoryId)); } - $categories = [$categoryFifth->getId(), $categorySecond->getId()]; + $categories = [$categorySecond->getId()]; foreach ($categories as $categoryId) { $this->assertFalse((bool)$this->productResource->canBeShowInCategory($productThird, $categoryId)); } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/CategoryTest.php index 40f61ec7a56125c63f3d16d614c4936ab5831c26..e9bd1c492e059af5abcf92de4be03b57658d3dd6 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/CategoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/CategoryTest.php @@ -109,6 +109,6 @@ class CategoryTest extends \PHPUnit_Framework_TestCase $this->assertSame($modelApplied, $item->getFilter()); $this->assertEquals('Category 1.1', $item->getLabel()); $this->assertEquals(4, $item->getValue()); - $this->assertEquals(1, $item->getCount()); + $this->assertEquals(2, $item->getCount()); } } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/PriceTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/PriceTest.php index 5a8a484ac6ef31d7d20d101ee772c46517fda0a4..1ba80dc05c41e4a0fc66f9bf86d04f2115fa7afb 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/PriceTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/PriceTest.php @@ -36,12 +36,12 @@ class PriceTest extends \PHPUnit_Framework_TestCase { /* validate result of setAttribute */ $this->assertEquals( - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, $this->_model->getAttribute()->getIsGlobal() ); $this->_model->setScope($this->_model->getAttribute()); $this->assertEquals( - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_GLOBAL, + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, $this->_model->getAttribute()->getIsGlobal() ); } @@ -53,7 +53,7 @@ class PriceTest extends \PHPUnit_Framework_TestCase { $this->_model->setScope($this->_model->getAttribute()); $this->assertEquals( - \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_WEBSITE, + \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, $this->_model->getAttribute()->getIsGlobal() ); } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php index 611e8c839d477cf9ad31672dbf27f387b61d4d14..b005c52813a7b987df53f64d5083c8a43f1434d9 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php @@ -16,7 +16,7 @@ class ValidatorFileTest extends \PHPUnit_Framework_TestCase protected $model; /** - * @var \Magento\Framework\ObjectManager + * @var \Magento\Framework\ObjectManagerInterface */ protected $objectManager; @@ -241,8 +241,8 @@ class ValidatorFileTest extends \PHPUnit_Framework_TestCase return [ 'type' => 'image/jpeg', 'title' => 'test.jpg', - 'quote_path' => 'pub/media/custom_options/quote/t/e/e1d601731b4b1a84163cd0e9370a4fcb.jpg', - 'order_path' => 'pub/media/custom_options/order/t/e/e1d601731b4b1a84163cd0e9370a4fcb.jpg', + 'quote_path' => 'custom_options/quote/t/e/e1d601731b4b1a84163cd0e9370a4fcb.jpg', + 'order_path' => 'custom_options/order/t/e/e1d601731b4b1a84163cd0e9370a4fcb.jpg', 'size' => '3300', 'width' => 136, 'height' => 131, diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/PriceTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/PriceTest.php index aac0f56cff805401e27386dbdf0aba7f13f89fce..cfdc01a16e4bea37f5dff153d38f16963aeab552 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/PriceTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/PriceTest.php @@ -5,6 +5,8 @@ */ namespace Magento\Catalog\Model\Product\Type; +use Magento\Catalog\Model\Product; + /** * @magentoDataFixture Magento/Catalog/_files/product_simple.php */ @@ -29,7 +31,7 @@ class PriceTest extends \PHPUnit_Framework_TestCase public function testGetFinalPrice() { - /** @var $product \Magento\Catalog\Model\Product */ + /** @var $product Product */ $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( 'Magento\Catalog\Model\Product' ); @@ -42,12 +44,14 @@ class PriceTest extends \PHPUnit_Framework_TestCase $this->assertEquals(5.0, $this->_model->getFinalPrice(5, $product)); // with options - $product->addCustomOption('option_ids', implode(',', array_keys($product->getOptions()))); + $buyRequest = $this->prepareBuyRequest($product); + $product->getTypeInstance()->prepareForCart($buyRequest, $product); - foreach ($product->getOptions() as $id => $option) { - $product->addCustomOption("option_{$id}", $option->getValue()); - } - $this->assertEquals(16.0, $this->_model->getFinalPrice(1, $product)); + //product price + options price(10+1+2+3+3) + $this->assertEquals(19.0, $this->_model->getFinalPrice(1, $product)); + + //product tier price + options price(5+1+2+3+3) + $this->assertEquals(14.0, $this->_model->getFinalPrice(5, $product)); } public function testGetFormatedPrice() @@ -82,4 +86,32 @@ class PriceTest extends \PHPUnit_Framework_TestCase { $this->assertTrue($this->_model->isTierPriceFixed()); } + + /** + * Build buy request based on product custom options + * + * @param Product $product + * @return \Magento\Framework\DataObject + */ + private function prepareBuyRequest(Product $product) + { + $options = []; + /** @var $option \Magento\Catalog\Model\Product\Option */ + foreach ($product->getOptions() as $option) { + switch ($option->getGroupByType()) { + case \Magento\Catalog\Model\Product\Option::OPTION_GROUP_DATE: + $value = ['year' => 2013, 'month' => 8, 'day' => 9, 'hour' => 13, 'minute' => 35]; + break; + case \Magento\Catalog\Model\Product\Option::OPTION_GROUP_SELECT: + $value = key($option->getValues()); + break; + default: + $value = 'test'; + break; + } + $options[$option->getId()] = $value; + } + + return new \Magento\Framework\DataObject(['qty' => 1, 'options' => $options]); + } } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_dropdown_option.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_dropdown_option.php new file mode 100644 index 0000000000000000000000000000000000000000..36ef0b4931fd7670e8a62888cb601e794dac8e4f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_dropdown_option.php @@ -0,0 +1,60 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** @var $product \Magento\Catalog\Model\Product */ +$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Catalog\Model\Product'); +$product->setTypeId( + 'simple' +)->setId( + 1 +)->setAttributeSetId( + 4 +)->setWebsiteIds( + [1] +)->setName( + 'Simple Product With Custom Options' +)->setSku( + 'simple_dropdown_option' +)->setPrice( + 200 +)->setMetaTitle( + 'meta title' +)->setMetaKeyword( + 'meta keyword' +)->setMetaDescription( + 'meta description' +)->setVisibility( + \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH +)->setStatus( + \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED +)->setCanSaveCustomOptions( + true +)->setProductOptions( + [ + [ + 'title' => 'drop_down option', + 'type' => 'drop_down', + 'is_require' => true, + 'sort_order' => 4, + 'values' => [ + [ + 'title' => 'drop_down option 1', + 'price' => 10, + 'price_type' => 'fixed', + 'sku' => 'drop_down option 1 sku', + 'sort_order' => 1, + ], + [ + 'title' => 'drop_down option 2', + 'price' => 20, + 'price_type' => 'percent', + 'sku' => 'drop_down option 2 sku', + 'sort_order' => 2, + ], + ], + ] + ] +)->save(); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_dropdown_option_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_dropdown_option_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..5bc5625837db01d3b60d68f7482ed5eb78141b10 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_dropdown_option_rollback.php @@ -0,0 +1,21 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** @var \Magento\Framework\Registry $registry */ +$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry'); + +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', true); + +/** @var $product \Magento\Catalog\Model\Product */ +$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Catalog\Model\Product'); +$product->load(1); +if ($product->getId()) { + $product->delete(); +} + +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', false); diff --git a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Config/Backend/ManagestockTest.php b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Config/Backend/ManagestockTest.php index 07fcc69d89ca9fae58b1b6e7855aca81c06181de..8f63143bddcd5d90b041a5ece677b8fc677bd624 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Config/Backend/ManagestockTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Config/Backend/ManagestockTest.php @@ -54,6 +54,7 @@ class ManagestockTest extends \PHPUnit_Framework_TestCase Bootstrap::getObjectManager()->get('Magento\Framework\Model\Context'), Bootstrap::getObjectManager()->get('Magento\Framework\Registry'), Bootstrap::getObjectManager()->get('Magento\Framework\App\Config\ScopeConfigInterface'), + Bootstrap::getObjectManager()->get('Magento\Framework\App\Cache\TypeListInterface'), $stockManagement, Bootstrap::getObjectManager()->get('Magento\CatalogInventory\Model\Indexer\Stock\Processor'), Bootstrap::getObjectManager()->get('Magento\Config\Model\ResourceModel\Config') diff --git a/dev/tests/integration/testsuite/Magento/Config/Model/Config/Backend/Image/AdapterTest.php b/dev/tests/integration/testsuite/Magento/Config/Model/Config/Backend/Image/AdapterTest.php index fc7c961049df6834b616e499bbd2759904b3dba3..3bdc1817762a2b56bbb4d599d58b537dabe9517d 100644 --- a/dev/tests/integration/testsuite/Magento/Config/Model/Config/Backend/Image/AdapterTest.php +++ b/dev/tests/integration/testsuite/Magento/Config/Model/Config/Backend/Image/AdapterTest.php @@ -18,6 +18,7 @@ class AdapterTest extends \PHPUnit_Framework_TestCase $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( 'Magento\Config\Model\Config\Backend\Image\Adapter' ); + $this->_model->setPath('path'); } /** diff --git a/dev/tests/integration/testsuite/Magento/Cookie/Model/Config/Backend/DomainTest.php b/dev/tests/integration/testsuite/Magento/Cookie/Model/Config/Backend/DomainTest.php index 7f469f42e7bdb607c5abe58f9277b4a1e9eeb342..5f24039ee0560f55c49713d24469311fad18144c 100644 --- a/dev/tests/integration/testsuite/Magento/Cookie/Model/Config/Backend/DomainTest.php +++ b/dev/tests/integration/testsuite/Magento/Cookie/Model/Config/Backend/DomainTest.php @@ -27,6 +27,7 @@ class DomainTest extends \PHPUnit_Framework_TestCase 'Magento\Cookie\Model\Config\Backend\Domain' ); $domain->setValue($value); + $domain->setPath('path'); try { $domain->save(); if ($exceptionMessage) { diff --git a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php index f170ad50089fcf44ae3add9c1ff078f0fb027e06..7e845870171ff0f072b8e5720d80f2c93f4d5f43 100644 --- a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php +++ b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php @@ -121,6 +121,6 @@ class FetchRatesTest extends \Magento\TestFramework\TestCase\AbstractBackendCont $context, $registry ); - $action->execute(); + $action->executeInternal(); } } diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php index 65c3aae162bf6ebbf6a8e1a66613c99bb5f8cfac..077f18fbe2cf355d3e95bf698df3e7234d101647 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php @@ -587,7 +587,6 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase 'email' => $email, 'firstname' => $firstName, 'lastname' => $lastName, - 'created_in' => 'Admin', 'id' => null ] ); @@ -603,7 +602,6 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase $this->assertEquals($email, $customerAfter->getEmail()); $this->assertEquals($firstName, $customerAfter->getFirstname()); $this->assertEquals($lastName, $customerAfter->getLastname()); - $this->assertEquals('Admin', $customerAfter->getCreatedIn()); $this->accountManagement->authenticate( $customerAfter->getEmail(), 'aPassword' @@ -807,7 +805,6 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase $customerEntity->setEmail($email) ->setFirstname($firstName) ->setLastname($lastname) - ->setCreatedIn('Admin') ->setId(null); $customer = $this->accountManagement->createAccount($customerEntity, 'aPassword'); @@ -815,7 +812,6 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase $this->assertEquals($email, $customer->getEmail()); $this->assertEquals($firstName, $customer->getFirstname()); $this->assertEquals($lastname, $customer->getLastname()); - $this->assertEquals('Admin', $customer->getCreatedIn()); $this->accountManagement->authenticate( $customer->getEmail(), 'aPassword', diff --git a/dev/tests/integration/testsuite/Magento/Developer/Model/Config/Backend/AllowedIpsTest.php b/dev/tests/integration/testsuite/Magento/Developer/Model/Config/Backend/AllowedIpsTest.php index d34c64a96dc8291d63d71ad5a62f66e890e1cf99..3b23c65d06b6c37a99dd90bbb14ad1f9ba50e057 100644 --- a/dev/tests/integration/testsuite/Magento/Developer/Model/Config/Backend/AllowedIpsTest.php +++ b/dev/tests/integration/testsuite/Magento/Developer/Model/Config/Backend/AllowedIpsTest.php @@ -22,6 +22,7 @@ class AllowedIpsTest extends \PHPUnit_Framework_TestCase 'Magento\Developer\Model\Config\Backend\AllowedIps' ); $model->setValue($value); + $model->setPath('path'); $model->beforeSave(); $model->save(); $this->assertEquals($expected, $model->getValue()); diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php index 48d237cd8d627ad9f0614ff20e0e7bda9af7aa7b..5680b57d0fc2c33cde82ddad0da453523c5c12b1 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php +++ b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php @@ -122,17 +122,19 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ->getArea(Area::AREA_FRONTEND) ->load(); - $this->setNotDefaultThemeForFixtureStore(); $expectedViewUrl = 'static/frontend/Magento/blank/en_US/Magento_Theme/favicon.ico'; - $this->model->setTemplateText('{{view url="Magento_Theme::favicon.ico"}}'); - $this->assertStringEndsNotWith($expectedViewUrl, $this->model->getProcessedTemplate()); $this->model->setDesignConfig([ 'area' => 'frontend', 'store' => $this->objectManager->get('Magento\Store\Model\StoreManagerInterface') ->getStore('fixturestore') ->getId(), ]); + $this->model->setTemplateText('{{view url="Magento_Theme::favicon.ico"}}'); + $this->setNotDefaultThemeForFixtureStore(); + $this->assertStringEndsNotWith($expectedViewUrl, $this->model->getProcessedTemplate()); + + $this->setDefaultThemeForFixtureStore(); $this->assertStringEndsWith($expectedViewUrl, $this->model->getProcessedTemplate()); } @@ -529,6 +531,28 @@ class TemplateTest extends \PHPUnit_Framework_TestCase */ protected function setNotDefaultThemeForFixtureStore() { + /** @var \Magento\Framework\View\Design\ThemeInterface $theme */ + $theme = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( + 'Magento\Framework\View\Design\ThemeInterface' + ); + $theme->load('Magento/luma', 'theme_path'); + \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( + 'Magento\Framework\App\Config\MutableScopeConfigInterface' + )->setValue( + \Magento\Framework\View\DesignInterface::XML_PATH_THEME_ID, + $theme->getId(), + \Magento\Store\Model\ScopeInterface::SCOPE_STORE, + 'fixturestore' + ); + } + + /** + * Set 'Magento/blank' for the 'fixturestore' store. + * Application isolation is required, if a test uses this method. + */ + protected function setDefaultThemeForFixtureStore() + { + /** @var \Magento\Framework\View\Design\ThemeInterface $theme */ $theme = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( 'Magento\Framework\View\Design\ThemeInterface' ); @@ -554,10 +578,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ->getArea(Area::AREA_FRONTEND) ->load(); - $this->setNotDefaultThemeForFixtureStore(); $expectedViewUrl = 'static/frontend/Magento/blank/en_US/Magento_Theme/favicon.ico'; $this->model->setTemplateSubject('{{view url="Magento_Theme::favicon.ico"}}'); - $this->assertStringEndsNotWith($expectedViewUrl, $this->model->getProcessedTemplateSubject([])); $this->model->setDesignConfig([ 'area' => 'frontend', 'store' => $this->objectManager->get('Magento\Store\Model\StoreManagerInterface') @@ -565,6 +587,10 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ->getId(), ]); + $this->setNotDefaultThemeForFixtureStore(); + $this->assertStringEndsNotWith($expectedViewUrl, $this->model->getProcessedTemplateSubject([])); + + $this->setDefaultThemeForFixtureStore(); $this->assertStringEndsWith($expectedViewUrl, $this->model->getProcessedTemplateSubject([])); } diff --git a/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php b/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php index e31201caf943440ce75a00725b65c79cde471c29..81fcb128903e1059ea0190b5b6d63b137c448d9d 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php @@ -95,7 +95,9 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase // This test is only valid if the factory created the object if Autoloader did not pick it up automatically if (\Magento\Framework\Code\Generator::GENERATION_SUCCESS == $generatorResult) { $content = $this->_clearDocBlock( - file_get_contents($this->_ioObject->getResultFileName(self::CLASS_NAME_WITH_NAMESPACE . 'Factory')) + file_get_contents( + $this->_ioObject->generateResultFileName(self::CLASS_NAME_WITH_NAMESPACE . 'Factory') + ) ); $expectedContent = $this->_clearDocBlock( file_get_contents(__DIR__ . '/_expected/SourceClassWithNamespaceFactory.php.sample') @@ -120,7 +122,7 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase // This test is only valid if the factory created the object if Autoloader did not pick it up automatically if (\Magento\Framework\Code\Generator::GENERATION_SUCCESS == $generatorResult) { $content = $this->_clearDocBlock( - file_get_contents($this->_ioObject->getResultFileName(self::CLASS_NAME_WITH_NAMESPACE . '\Proxy')) + file_get_contents($this->_ioObject->generateResultFileName(self::CLASS_NAME_WITH_NAMESPACE . '\Proxy')) ); $expectedContent = $this->_clearDocBlock( file_get_contents(__DIR__ . '/_expected/SourceClassWithNamespaceProxy.php.sample') @@ -142,7 +144,7 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase if (\Magento\Framework\Code\Generator::GENERATION_SUCCESS == $generatorResult) { $content = $this->_clearDocBlock( file_get_contents( - $this->_ioObject->getResultFileName(self::CLASS_NAME_WITH_NAMESPACE . '\Interceptor') + $this->_ioObject->generateResultFileName(self::CLASS_NAME_WITH_NAMESPACE . '\Interceptor') ) ); $expectedContent = $this->_clearDocBlock( diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json index 438e99d692d5e6c60eaba83c77070dce74e7f184..437b304fa9884a0421dda0c95970dae157b1c3bd 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json @@ -37,13 +37,7 @@ "tubalmartin/cssmin": "2.4.8-p4", "magento/magento-composer-installer": "*", "phpseclib/phpseclib": "~0.3", - "symfony/console": "~2.3" - }, - "require-dev": { - "phpunit/phpunit": "4.1.0", - "squizlabs/php_codesniffer": "1.5.3", - "phpmd/phpmd": "@stable", - "pdepend/pdepend": "2.0.6", + "symfony/console": "~2.3", "lib-libxml": "*", "ext-ctype": "*", "ext-gd": "*", @@ -54,7 +48,13 @@ "ext-hash": "*", "ext-curl": "*", "ext-iconv": "*", - "ext-intl": "*", + "ext-intl": "*" + }, + "require-dev": { + "phpunit/phpunit": "4.1.0", + "squizlabs/php_codesniffer": "1.5.3", + "phpmd/phpmd": "@stable", + "pdepend/pdepend": "2.0.6", "sjparkinson/static-review": "~4.1", "fabpot/php-cs-fixer": "~1.2", "lusitanian/oauth": "~0.3" diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json index e7403b54be9c387bbdac395b49136ac004ff2c89..7ca0399b8ce5f485d466eea343b17b7837de846a 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json @@ -15,17 +15,6 @@ "squizlabs/php_codesniffer": "1.5.3", "phpmd/phpmd": "@stable", "pdepend/pdepend": "2.0.6", - "lib-libxml": "*", - "ext-ctype": "*", - "ext-gd": "*", - "ext-spl": "*", - "ext-dom": "*", - "ext-simplexml": "*", - "ext-mcrypt": "*", - "ext-hash": "*", - "ext-curl": "*", - "ext-iconv": "*", - "ext-intl": "*", "sjparkinson/static-review": "~4.1", "fabpot/php-cs-fixer": "~1.2", "lusitanian/oauth": "~0.3" diff --git a/dev/tests/integration/testsuite/Magento/Paypal/Controller/Billing/AgreementTest.php b/dev/tests/integration/testsuite/Magento/Paypal/Controller/Billing/AgreementTest.php index 4a606bea53b3769508525f3314b38937e6b3ca69..1b098debc33f502aca6a1b0b62c26bbdfd346975 100644 --- a/dev/tests/integration/testsuite/Magento/Paypal/Controller/Billing/AgreementTest.php +++ b/dev/tests/integration/testsuite/Magento/Paypal/Controller/Billing/AgreementTest.php @@ -106,7 +106,7 @@ class AgreementTest extends \Magento\TestFramework\TestCase\AbstractController $customerSession->setCustomerId($fixtureCustomerId); /** Execute SUT */ - $billingAgreementController->execute(); + $billingAgreementController->executeInternal(); /** Ensure that billing agreement record was created in the DB */ /** @var \Magento\Paypal\Model\ResourceModel\Billing\Agreement\Collection $billingAgreementCollection */ diff --git a/dev/tests/integration/testsuite/Magento/Paypal/Model/Config/Structure/Reader/ReaderTest.php b/dev/tests/integration/testsuite/Magento/Paypal/Model/Config/Structure/Reader/ReaderTest.php index 03d1d6f24718867de52f59606aec56fb92ec32e0..274825a41ca5addef387d465c7d45f34ed881e1b 100644 --- a/dev/tests/integration/testsuite/Magento/Paypal/Model/Config/Structure/Reader/ReaderTest.php +++ b/dev/tests/integration/testsuite/Magento/Paypal/Model/Config/Structure/Reader/ReaderTest.php @@ -62,7 +62,7 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->fileUtility = \Magento\Framework\App\Utility\Files::init(); $this->validationStateMock = $this->getMockBuilder('Magento\Framework\Config\ValidationStateInterface') - ->setMethods(['isValidated']) + ->setMethods(['isValidationRequired']) ->getMockForAbstractClass(); $this->schemaLocatorMock = $this->getMockBuilder('Magento\Config\Model\Config\SchemaLocator') ->disableOriginalConstructor() @@ -72,7 +72,7 @@ class ReaderTest extends \PHPUnit_Framework_TestCase ->getMockForAbstractClass(); $this->validationStateMock->expects($this->atLeastOnce()) - ->method('isValidated') + ->method('isValidationRequired') ->willReturn(false); $this->schemaLocatorMock->expects($this->atLeastOnce()) ->method('getPerFileSchema') diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/ipn.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/ipn.php index 5c27950d64f00760345068372d780397163c04f0..3949117079b68d8ecc8a93bcd86dac4a886b87ce 100644 --- a/dev/tests/integration/testsuite/Magento/Paypal/_files/ipn.php +++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/ipn.php @@ -8,6 +8,7 @@ return [ 'mc_gross' => '100.00', 'invoice' => '100000001', 'payment_status' => 'Completed', + 'auth_status' => 'Completed', 'mc_currency' => 'USD', 'receiver_email' => 'merchant_2012050718_biz@example.com' ]; diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php index cc659a62b1eb2361855aa61bfeb812ff92966c2d..9fbab06028d7988f983157325c5f8e64fdb38eec 100644 --- a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php +++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php @@ -18,30 +18,21 @@ $shippingAddress->setId(null)->setAddressType('shipping'); $payment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order\Payment'); $payment->setMethod(\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS); -$order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order'); -$order - ->setCustomerEmail('co@co.co') - ->setIncrementId( - '100000001' -)->setSubtotal( - 100 -)->setBaseSubtotal( - 100 -)->setBaseGrandTotal( - 100 -)->setBaseCurrencyCode( - 'USD' -)->setCustomerIsGuest( - true -)->setStoreId( - 1 -)->setEmailSent( - 1 -)->setBillingAddress( - $billingAddress -)->setShippingAddress( - $shippingAddress -)->setPayment( - $payment -); +$amount = 100; + +/** @var \Magento\Sales\Model\Order $order */ +$order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(Magento\Sales\Model\Order::class); +$order->setCustomerEmail('co@co.co') + ->setIncrementId('100000001') + ->setSubtotal($amount) + ->setBaseSubtotal($amount) + ->setBaseGrandTotal($amount) + ->setGrandTotal($amount) + ->setBaseCurrencyCode('USD') + ->setCustomerIsGuest(true) + ->setStoreId(1) + ->setEmailSent(true) + ->setBillingAddress($billingAddress) + ->setShippingAddress($shippingAddress) + ->setPayment($payment); $order->save(); diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/Stub/OrderCreateStub.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/Stub/OrderCreateStub.php index 39153b5837067d058f67daa6eaaaf720ea3a3cbf..0169bf3ff26aa7869b889ec74206a7bd63f9edbe 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/Stub/OrderCreateStub.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/Stub/OrderCreateStub.php @@ -8,7 +8,7 @@ namespace Magento\Sales\Controller\Adminhtml\Order\Stub; class OrderCreateStub extends \Magento\Sales\Controller\Adminhtml\Order\Create { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/dev/tests/integration/testsuite/Magento/Setup/Console/Command/I18nCollectPhrasesCommandTest.php b/dev/tests/integration/testsuite/Magento/Setup/Console/Command/I18nCollectPhrasesCommandTest.php index 924853df6bc0c75cb219ec88afb42317c33d4f1d..2d5e9026ceefe6e4853e08e3e3859b681e6ab6ea 100644 --- a/dev/tests/integration/testsuite/Magento/Setup/Console/Command/I18nCollectPhrasesCommandTest.php +++ b/dev/tests/integration/testsuite/Magento/Setup/Console/Command/I18nCollectPhrasesCommandTest.php @@ -46,17 +46,19 @@ class I18nCollectPhrasesCommandTest extends \PHPUnit_Framework_TestCase public function testExecuteCsvOutput() { - $outputPath = BP . '/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/output/output.csv'; + $outputPath = BP . '/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/output/phrases.csv'; $this->tester->execute( [ - 'directory' => BP . '/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/', + 'directory' => BP . '/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/phrases/', '--output' => $outputPath, ] ); $handle = fopen($outputPath, 'r'); $output = fread($handle, filesize($outputPath)); - $expected = '"Hello world","Hello world"' . PHP_EOL . '"Foo bar","Foo bar"' . PHP_EOL; + $expected = file_get_contents( + BP . '/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/expectedPhrases.csv' + ); $this->assertEquals($expected, $output); unlink($outputPath); } diff --git a/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/Magento/TestModule/Phrases.php b/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/Magento/TestModule/Phrases.php deleted file mode 100644 index d55885ff96f2b8da7acce4f97c505fa2a6b8aa76..0000000000000000000000000000000000000000 --- a/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/Magento/TestModule/Phrases.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -$a = __("Hello world"); -$b = __("Foo bar"); diff --git a/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/expectedPhrases.csv b/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/expectedPhrases.csv new file mode 100644 index 0000000000000000000000000000000000000000..43c331ecb48d6faa3e12d04eccb53d992779e907 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/expectedPhrases.csv @@ -0,0 +1,19 @@ +"simple text","simple text" +"simple text with 1 string literal placeholder %1","simple text with 1 string literal placeholder %1" +"simple text with 1 variable placeholder %1","simple text with 1 variable placeholder %1" +"simple text with multiple placeholders %1 %2","simple text with multiple placeholders %1 %2" +"first part second part","first part second part" +"first part second part third part","first part second part third part" +"first part second part with one string literal placeholder %1","first part second part with one string literal placeholder %1" +"first part of concat second part with one variable placeholder %1","first part of concat second part with one variable placeholder %1" +"first part of concat second part with two placeholders %1, %2","first part of concat second part with two placeholders %1, %2" +"first part of concat second part third part with one placeholder %1","first part of concat second part third part with one placeholder %1" +"first part of concat second part third part with two placeholders %1, %2","first part of concat second part third part with two placeholders %1, %2" +"string with escaped 'single quotes'","string with escaped 'single quotes'" +"string with placeholder in escaped single quotes '%1'","string with placeholder in escaped single quotes '%1'" +"string with ""double quotes""","string with ""double quotes""" +"string with placeholder in double quotes ""%1""","string with placeholder in double quotes ""%1""" +"string with 'single quotes'","string with 'single quotes'" +"string with placeholder in single quotes '%1'","string with placeholder in single quotes '%1'" +"string with escaped ""double quotes""","string with escaped ""double quotes""" +"string with placeholder in escaped double quotes ""%1""","string with placeholder in escaped double quotes ""%1""" diff --git a/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/phrases/TestPhrases.php b/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/phrases/TestPhrases.php new file mode 100644 index 0000000000000000000000000000000000000000..f3306a521add5a671e626d3cd49c19c9a6640c5f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Setup/Console/Command/_files/phrases/TestPhrases.php @@ -0,0 +1,87 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +use Magento\Framework\Phrase; + +/** + * @SuppressWarnings(PHPMD) + */ +class TestPhrases +{ + public function awesomeFunction() + { + $str1 = 'str1'; + $str2 = 'str2'; + + // Simple + $simpleCases = [ + new Phrase('simple text'), + new Phrase('simple text with 1 string literal placeholder %1', 'arg'), + new Phrase('simple text with 1 variable placeholder %1', $str1), + new Phrase('simple text with multiple placeholders %1 %2', $str1, $str2), + ]; + + // Phrase objects + $phraseObjects = [ + // Single concatenation + new Phrase('first part' . ' second part'), + new Phrase('first part' . ' second part' . ' third part'), + + // Multiple concatenation + new Phrase('first part' . ' second part with one string literal placeholder %1', 'arg'), + new Phrase('first part of concat' . ' second part with one variable placeholder %1', $str1), + new Phrase('first part of concat' . ' second part with two placeholders %1, %2', $str1, $str2), + new Phrase('first part of concat' . ' second part' . ' third part with one placeholder %1', 'arg'), + new Phrase('first part of concat' . ' second part' . ' third part with two placeholders %1, %2', $str1, $str2), + + // Escaped quotes + new Phrase('string with escaped \'single quotes\''), + new Phrase('string with placeholder in escaped single quotes \'%1\'', 'arg'), + new Phrase('string with "double quotes"'), + new Phrase('string with placeholder in double quotes "%1"', 'arg'), + ]; + + $singleQuoteTranslateFunctions = [ + // Single concatenation + __('first part' . ' second part'), + __('first part' . ' second part' . ' third part'), + + // Multiple concatenation + __('first part' . ' second part with one string literal placeholder %1', 'arg'), + __('first part of concat' . ' second part with one variable placeholder %1', $str1), + __('first part of concat' . ' second part with two placeholders %1, %2', $str1, $str2), + __('first part of concat' . ' second part' . ' third part with one placeholder %1', 'arg'), + __('first part of concat' . ' second part' . ' third part with two placeholders %1, %2', $str1, $str2), + + // Escaped quotes + __('string with escaped \'single quotes\''), + __('string with placeholder in escaped single quotes \'%1\'', 'arg'), + __('string with "double quotes"'), + __('string with placeholder in double quotes "%1"', 'arg'), + ]; + + $doubleQuoteTranslateFunctions = [ + // Single concatenation + __("first part" . " second part"), + __("first part" . " second part" . " third part"), + + // Multiple concatenation + __("first part" . " second part with one string literal placeholder %1", "arg"), + __("first part of concat" . " second part with one variable placeholder %1", $str1), + __("first part of concat" . " second part with two placeholders %1, %2", $str1, $str2), + __("first part of concat" . " second part" . " third part with one placeholder %1", "arg"), + __("first part of concat" . " second part" . " third part with two placeholders %1, %2", $str1, $str2), + + // Escaped quotes + __("string with 'single quotes'"), + __("string with placeholder in single quotes '%1'", "arg"), + __("string with escaped \"double quotes\""), + __("string with placeholder in escaped double quotes \"%1\"", "arg"), + ]; + } +} diff --git a/dev/tests/integration/testsuite/Magento/Setup/Module/I18n/Dictionary/_files/expected/with_context.csv b/dev/tests/integration/testsuite/Magento/Setup/Module/I18n/Dictionary/_files/expected/with_context.csv index 0895edb09f36d9517729c3538d70811015e50acb..6c873fee5c89b7146fd2b97044fb7c169f024562 100644 --- a/dev/tests/integration/testsuite/Magento/Setup/Module/I18n/Dictionary/_files/expected/with_context.csv +++ b/dev/tests/integration/testsuite/Magento/Setup/Module/I18n/Dictionary/_files/expected/with_context.csv @@ -1,9 +1,11 @@ Helper,Helper,module,Magento_FirstModule -Model,Model,module,"Magento_FirstModule,Magento_SecondModule" +Model,Model,module,Magento_FirstModule "Module template","Module template",module,Magento_FirstModule +Model,Model,module,Magento_SecondModule "Theme template","Theme template",theme,adminhtml/default/backend "Module js","Module js",module,Magento_FirstModule -"Lib js","Lib js",lib,"lib/web/mage/file.js,lib/web/varien/file.js" +"Lib js","Lib js",lib,lib/web/mage/file.js +"Lib js","Lib js",lib,lib/web/varien/file.js "Module layout label","Module layout label",module,Magento_FirstModule "Module layout title","Module layout title",module,Magento_FirstModule "Theme layout label","Theme layout label",theme,adminhtml/default/backend diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php b/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php index 730eca1e7404b4a65d31a9476470bd66b46b2aba..8c432d03e7948ba495aab016959ad166d5486fa4 100644 --- a/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php +++ b/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php @@ -6,20 +6,17 @@ use Magento\TestFramework\Helper\Bootstrap; +/** @var \Magento\Store\Model\StoreManagerInterface $storeManager */ +$storeManager = Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface'); + +/** @var \Magento\Store\Model\Store $store */ $store = Bootstrap::getObjectManager()->create('Magento\Store\Model\Store'); $storeCode = 'fixturestore'; -if (!$store->load($storeCode)->getId()) { - $websiteId = Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface') - ->getWebsite() - ->getId(); - - $groupId = Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface') - ->getWebsite() - ->getDefaultGroupId(); +if (!$store->load($storeCode)->getId()) { $store->setCode($storeCode) - ->setWebsiteId($websiteId) - ->setGroupId($groupId) + ->setWebsiteId($storeManager->getWebsite()->getId()) + ->setGroupId($storeManager->getWebsite()->getDefaultGroupId()) ->setName('Fixture Store') ->setSortOrder(10) ->setIsActive(1); diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index.php b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index.php new file mode 100644 index 0000000000000000000000000000000000000000..88c3f333e12ec916499f59830b32967ce10949b5 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index.php @@ -0,0 +1,31 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +use Magento\TestFramework\Helper\Bootstrap; + +/** @var \Magento\Store\Model\StoreManagerInterface $storeManager */ +$storeManager = Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface'); + +/** @var \Magento\Store\Model\Store $store */ +$store = Bootstrap::getObjectManager()->create('Magento\Store\Model\Store'); +$storeCode = 'fixturestore'; + +if (!$store->load($storeCode)->getId()) { + $store->setCode($storeCode) + ->setWebsiteId($storeManager->getWebsite()->getId()) + ->setGroupId($storeManager->getWebsite()->getDefaultGroupId()) + ->setName('Fixture Store') + ->setSortOrder(10) + ->setIsActive(1); + $store->save(); + + Bootstrap::getObjectManager() + ->get('Magento\Framework\Event\ManagerInterface') + ->dispatch('store_add', ['store' => $store]); + + /* Refresh stores memory cache */ + Bootstrap::getObjectManager()->get('Magento\Store\Model\StoreManagerInterface')->reinitStores(); +} diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..08a8af6a68e62fb7eb57df32daddd2c19a97ba14 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index_rollback.php @@ -0,0 +1,22 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** @var \Magento\Framework\Registry $registry */ +$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry'); + +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', true); + +/** @var \Magento\Store\Model\Store $store */ +$store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Store\Model\Store'); +$storeCode = 'fixturestore'; +$store->load($storeCode); +if ($store->getId()) { + $store->delete(); +} + +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', false); diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AbstractMergedConfigTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AbstractMergedConfigTest.php index bc0518559ba9d332cff758ce27ac6dc197116b4c..051b7e891ace187b27a3620a6bbc0da886fe207a 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AbstractMergedConfigTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AbstractMergedConfigTest.php @@ -39,15 +39,28 @@ abstract class AbstractMergedConfigTest extends \PHPUnit_Framework_TestCase $invalidFiles = []; $files = $this->getConfigFiles(); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(false); $mergedConfig = new \Magento\Framework\Config\Dom( '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></config>', + $validationStateMock, $this->getIdAttributes() ); foreach ($files as $file) { $content = file_get_contents($file[0]); try { - new \Magento\Framework\Config\Dom($content, $this->getIdAttributes()); + $validationStateMock = $this->getMock( + '\Magento\Framework\Config\ValidationStateInterface', + [], + [], + '', + false + ); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + new \Magento\Framework\Config\Dom($content, $validationStateMock, $this->getIdAttributes()); //merge won't be performed if file is invalid because of exception thrown $mergedConfig->merge($content); } catch (\Magento\Framework\Config\Dom\ValidationException $e) { diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php index c998094fc963a3b525515d662743fbea282d8e82..9b66e0702c056d3acf2a0fdd48d6b7d6fb48ea1d 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php @@ -35,7 +35,10 @@ class AclConfigFilesTest extends \PHPUnit_Framework_TestCase */ public function testAclConfigFile($file) { - $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $domConfig->validate($this->_schemeFile, $errors); $message = "Invalid XML-file: {$file}\n"; foreach ($errors as $error) { diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/CacheFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/CacheFilesTest.php index 430cced2f1a2e629d5ff66d25788609a6f851a9b..25051e023a5bf767c92d80bfb9002955ea6e90fb 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/CacheFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/CacheFilesTest.php @@ -14,7 +14,7 @@ class CacheFilesTest extends \PHPUnit_Framework_TestCase public function testCacheConfig($area) { $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/DiConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/DiConfigFilesTest.php index 42b6a74d7e06d84479dcb2fc13326905dedaf2c1..b9c4c7cbb94711404fa8edf4fbe330a3d570b8cb 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/DiConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/DiConfigFilesTest.php @@ -108,7 +108,7 @@ class DiConfigFilesTest extends \PHPUnit_Framework_TestCase $fileResolverMock = $this->getMock('Magento\Framework\Config\FileResolverInterface'); $fileResolverMock->expects($this->any())->method('read')->will($this->returnValue($files)); $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); /** @var \Magento\Framework\ObjectManager\Config\SchemaLocator $schemaLocator */ $schemaLocator = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EavAttributesConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EavAttributesConfigFilesTest.php index 03111c820d6eddb6c7d44a423eebc730675b98ab..0a290d04abd5311363246cd63ee038e04de1f227 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EavAttributesConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EavAttributesConfigFilesTest.php @@ -25,7 +25,7 @@ class EavAttributesConfigFilesTest extends \PHPUnit_Framework_TestCase ); $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $fileResolverMock = $this->getMock('Magento\Framework\Config\FileResolverInterface'); $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($xmlFiles)); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EventConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EventConfigFilesTest.php index f81c30cc0407c34a0a90113f8ce25d65527272dc..d1f2fef8a815b84fbe3c7eb5775913bc4f9be726 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EventConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/EventConfigFilesTest.php @@ -25,7 +25,10 @@ class EventConfigFilesTest extends \PHPUnit_Framework_TestCase public function testEventConfigFiles($file) { $errors = []; - $dom = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $dom->validate($this->_schemaFile, $errors); $message = "Invalid XML-file: {$file}\n"; foreach ($errors as $error) { diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ExportConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ExportConfigFilesTest.php index 6229b7d06c013bc7ea2964d76b658e6b69fb665a..00eb532d6b90fde66b6ecec72f695bddbb221fbb 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ExportConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ExportConfigFilesTest.php @@ -25,7 +25,7 @@ class ExportConfigFilesTest extends \PHPUnit_Framework_TestCase ); $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $fileResolverMock = $this->getMock('Magento\Framework\Config\FileResolverInterface'); $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($xmlFiles)); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ImportConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ImportConfigFilesTest.php index dd31a3287fce1622f0bfd9574e603e75fe3f51dc..61c6c66f79cf51c77fed8fee764991123f60815e 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ImportConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ImportConfigFilesTest.php @@ -25,7 +25,7 @@ class ImportConfigFilesTest extends \PHPUnit_Framework_TestCase ); $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $fileResolverMock = $this->getMock('Magento\Framework\Config\FileResolverInterface'); $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($xmlFiles)); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/IndexerConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/IndexerConfigFilesTest.php index f12917f9c456deeea853cda63ec8005182bec8ee..3f16450ae3e12d4e199fd649ec3be25b4d50ad0c 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/IndexerConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/IndexerConfigFilesTest.php @@ -36,7 +36,10 @@ class IndexerConfigFilesTest extends \PHPUnit_Framework_TestCase */ public function testIndexerConfigFile($file) { - $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $domConfig->validate($this->schemaFile, $errors); $message = "Invalid XML-file: {$file}\n"; foreach ($errors as $error) { diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Catalog/AttributeConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Catalog/AttributeConfigFilesTest.php index a0aaff1b95386c49a9042a24be1175933b508b22..1e4ceac5e7db03c3e2bdc43dbadc1765cf27cb20 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Catalog/AttributeConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Catalog/AttributeConfigFilesTest.php @@ -26,7 +26,10 @@ class AttributeConfigFilesTest extends \PHPUnit_Framework_TestCase */ public function testFileFormat($file) { - $dom = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $dom->validate($this->_schemaFile, $errors); $this->assertTrue($result, print_r($errors, true)); } diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Customer/AddressFormatsFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Customer/AddressFormatsFilesTest.php index e503a543247f87609e72db7a4686c048ad17c23c..7cad3da12a066edd5104a8af9b582123f58f92ad 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Customer/AddressFormatsFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Customer/AddressFormatsFilesTest.php @@ -27,7 +27,10 @@ class AddressFormatsFilesTest extends \PHPUnit_Framework_TestCase */ public function testFileFormat($file) { - $dom = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $dom->validate($this->_schemaFile, $errors); $this->assertTrue($result, print_r($errors, true)); } diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Email/EmailTemplateConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Email/EmailTemplateConfigFilesTest.php index 8c667e6d38c4916f1f8fc9086f10cbd8283fe0b1..546db270e1bbf08f60bfd395d2facf13b2c735fb 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Email/EmailTemplateConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Email/EmailTemplateConfigFilesTest.php @@ -17,7 +17,10 @@ class EmailTemplateConfigFilesTest extends \PHPUnit_Framework_TestCase { $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver(); $schemaFile = $urnResolver->getRealPath('urn:magento:module:Magento_Email:etc/email_templates.xsd'); - $dom = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $dom->validate($schemaFile, $errors); $this->assertTrue($result, print_r($errors, true)); } @@ -78,7 +81,7 @@ class EmailTemplateConfigFilesTest extends \PHPUnit_Framework_TestCase public function testMergedFormat() { $validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationState->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationState->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); /** @var \Magento\Email\Model\Template\Config\Reader $reader */ $reader = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( 'Magento\Email\Model\Template\Config\Reader', diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Sales/PdfConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Sales/PdfConfigFilesTest.php index 1bd81dbb001049d37cd59c0a769ca721a28a593c..f65f0fab665fe74ad3d05e50174778d1c4b8db4b 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Sales/PdfConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/Magento/Sales/PdfConfigFilesTest.php @@ -19,7 +19,10 @@ class PdfConfigFilesTest extends \PHPUnit_Framework_TestCase ); $schemaFile = $schemaLocator->getPerFileSchema(); - $dom = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $dom = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $dom->validate($schemaFile, $errors); $this->assertTrue($result, print_r($errors, true)); } @@ -35,7 +38,7 @@ class PdfConfigFilesTest extends \PHPUnit_Framework_TestCase public function testMergedFormat() { $validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationState->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationState->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); /** @var \Magento\Sales\Model\Order\Pdf\Config\Reader $reader */ $reader = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/MviewConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/MviewConfigFilesTest.php index d112c6d50d389c334a3c5f2ce20d900374357b58..0393ef43ecd8a0c996f26aefd5f9d5d2a9b48d36 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/MviewConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/MviewConfigFilesTest.php @@ -36,7 +36,10 @@ class MviewConfigFilesTest extends \PHPUnit_Framework_TestCase */ public function testIndexerConfigFile($file) { - $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file), $validationStateMock); $result = $domConfig->validate($this->schemaFile, $errors); $message = "Invalid XML-file: {$file}\n"; foreach ($errors as $error) { diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductOptionsConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductOptionsConfigFilesTest.php index 17b6e7dab791e858310dd42433fc325a13bfceb9..77901d2d2528468857d42b084ad48ebd2611d50b 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductOptionsConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductOptionsConfigFilesTest.php @@ -31,7 +31,7 @@ class ProductOptionsConfigFilesTest extends \PHPUnit_Framework_TestCase $fileResolverMock = $this->getMock('Magento\Framework\Config\FileResolverInterface'); $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($xmlFiles)); $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); $this->_model = $objectManager->create( 'Magento\Catalog\Model\ProductOptions\Config\Reader', diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductTypesConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductTypesConfigFilesTest.php index cf19b7a61da22136222deaffc88a2fc383c785fa..0b21c161b144e3ff944846c1bdcb1f66186fbc94 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductTypesConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ProductTypesConfigFilesTest.php @@ -27,7 +27,7 @@ class ProductTypesConfigFilesTest extends \PHPUnit_Framework_TestCase $fileResolverMock = $this->getMock('Magento\Framework\Config\FileResolverInterface'); $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($xmlFiles)); $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); $this->_model = $objectManager->create( 'Magento\Catalog\Model\ProductTypes\Config\Reader', diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ResourcesConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ResourcesConfigFilesTest.php index 044605bcc3b05fb32ee6330fbd5c37f6b8e46daf..ad967592e614180f36e5f05f0cdc908d09a83d12 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ResourcesConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ResourcesConfigFilesTest.php @@ -27,7 +27,7 @@ class ResourcesConfigFilesTest extends \PHPUnit_Framework_TestCase $fileResolverMock = $this->getMock('Magento\Framework\Config\FileResolverInterface'); $fileResolverMock->expects($this->any())->method('get')->will($this->returnValue($xmlFiles)); $validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $validationStateMock->expects($this->any())->method('isValidationRequired')->will($this->returnValue(true)); $deploymentConfigMock = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false); $deploymentConfigMock->expects($this->any())->method('getConfiguration')->will($this->returnValue([])); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php index 16bc451c47c220be92bd57194a0bc542730bcbed..cecf1bf93bdea0d2a121cd6d43957e4d6ab0c061 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php @@ -9,6 +9,11 @@ use Magento\Framework\Component\ComponentRegistrar; class RouteConfigFilesTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\Config\ValidationStateInterface + */ + + protected $validationStateMock; /** * attributes represent merging rules * copied from original class \Magento\Framework\App\Route\Config\Reader @@ -36,6 +41,15 @@ class RouteConfigFilesTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->validationStateMock = $this->getMock( + '\Magento\Framework\Config\ValidationStateInterface', + [], + [], + '', + false + ); + $this->validationStateMock->method('isValidationRequired') + ->willReturn(true); $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver(); $this->schemaFile = $urnResolver->getRealPath('urn:magento:framework:App/etc/routes.xsd'); $this->mergedSchemaFile = $urnResolver->getRealPath('urn:magento:framework:App/etc/routes_merged.xsd'); @@ -51,12 +65,22 @@ class RouteConfigFilesTest extends \PHPUnit_Framework_TestCase $mask = $moduleDir . '/etc/*/routes.xml'; $files = array_merge($files, glob($mask)); } - $mergedConfig = new \Magento\Framework\Config\Dom('<config></config>', $this->_idAttributes); + $mergedConfig = new \Magento\Framework\Config\Dom( + '<config></config>', + $this->validationStateMock, + $this->_idAttributes + ); foreach ($files as $file) { $content = file_get_contents($file); try { - new \Magento\Framework\Config\Dom($content, $this->_idAttributes, null, $this->schemaFile); + new \Magento\Framework\Config\Dom( + $content, + $this->validationStateMock, + $this->_idAttributes, + null, + $this->schemaFile + ); //merge won't be performed if file is invalid because of exception thrown $mergedConfig->merge($content); diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ViewConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ViewConfigFilesTest.php index d65b3fa9d7c8deda509f1a62808decc0f6197d24..f4bbffa872744db6c72c3bb694cd00a65d1036dc 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ViewConfigFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/ViewConfigFilesTest.php @@ -13,17 +13,20 @@ class ViewConfigFilesTest extends \PHPUnit_Framework_TestCase */ public function testViewConfigFile($file) { - /** @var \Magento\Framework\View\Xsd\Reader $reader */ - $reader = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( - 'Magento\Framework\View\Xsd\Reader' - ); - $mergeXsd = $reader->read(); - $domConfig = new \Magento\Framework\Config\Dom($file); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $domConfig = new \Magento\Framework\Config\Dom($file, $validationStateMock); + $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver(); $result = $domConfig->validate( - $mergeXsd, + $urnResolver->getRealPath('urn:magento:framework:Config/etc/view.xsd'), $errors ); - $this->assertTrue($result, "Invalid XML-file: {$file}\n" . join("\n", $errors)); + $message = "Invalid XML-file: {$file}\n"; + foreach ($errors as $error) { + $message .= "{$error->message} Line: {$error->line}\n"; + } + $this->assertTrue($result, $message); } /** diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Theme/XmlFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Theme/XmlFilesTest.php index 95a9bb0d8cb7babcddd36aa3413363ee761ac021..680d76abd587e4824559d99d2997236449957b66 100644 --- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Theme/XmlFilesTest.php +++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Theme/XmlFilesTest.php @@ -9,19 +9,40 @@ use Magento\Framework\Component\ComponentRegistrar; class XmlFilesTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\Config\ValidationStateInterface + */ + protected $validationStateMock; + + public function setUp() + { + $this->validationStateMock = $this->getMock( + 'Magento\Framework\Config\ValidationStateInterface', + [], + [], + '', + false + ); + $this->validationStateMock->method('isValidationRequired') + ->willReturn(true); + } + /** * @param string $file * @dataProvider viewConfigFileDataProvider */ public function testViewConfigFile($file) { - $reader = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( - 'Magento\Framework\View\Xsd\Reader' + $domConfig = new \Magento\Framework\Config\Dom( + file_get_contents($file), + $this->validationStateMock ); - $mergeXsd = $reader->read(); - $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file)); $errors = []; - $result = $domConfig->validate($mergeXsd, $errors); + $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver(); + $result = $domConfig->validate( + $urnResolver->getRealPath('urn:magento:framework:Config/etc/view.xsd'), + $errors + ); $this->assertTrue($result, "Invalid XML-file: {$file}\n" . join("\n", $errors)); } @@ -71,7 +92,7 @@ class XmlFilesTest extends \PHPUnit_Framework_TestCase */ public function testThemeConfigFileSchema($file) { - $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file)); + $domConfig = new \Magento\Framework\Config\Dom(file_get_contents($file), $this->validationStateMock); $errors = []; $result = $domConfig->validate('urn:magento:framework:Config/etc/theme.xsd', $errors); $this->assertTrue($result, "Invalid XML-file: {$file}\n" . join("\n", $errors)); diff --git a/dev/tests/integration/testsuite/Magento/TestFixture/Controller/Adminhtml/Noroute.php b/dev/tests/integration/testsuite/Magento/TestFixture/Controller/Adminhtml/Noroute.php index 0116aa59ffaa5fb8d6d672a011864b3108ea15b3..ae88fa6378645ef4afbf2ef496c0a5aa08b7a3b0 100644 --- a/dev/tests/integration/testsuite/Magento/TestFixture/Controller/Adminhtml/Noroute.php +++ b/dev/tests/integration/testsuite/Magento/TestFixture/Controller/Adminhtml/Noroute.php @@ -22,7 +22,7 @@ class Noroute implements \Magento\Framework\App\ActionInterface * * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { } diff --git a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php index 052030a1552fdea8b931479d501192c0873f738b..031bab7ac1e552d20d444d9bb8988f7f0a052a85 100644 --- a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php @@ -14,7 +14,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Test form existence - * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::execute + * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::executeInternal */ public function testFormForgotpasswordAction() { @@ -26,7 +26,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController /** * Test redirection to startup page after success password recovering posting * - * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::execute + * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::executeInternal */ public function testForgotpasswordAction() { @@ -44,7 +44,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController /** * Test reset password action * - * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::execute + * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::executeInternal * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::_validateResetPasswordLinkToken * @magentoDataFixture Magento/User/_files/dummy_user.php */ @@ -73,7 +73,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController } /** - * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::execute + * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::executeInternal * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::_validateResetPasswordLinkToken */ public function testResetPasswordActionWithDummyToken() @@ -89,7 +89,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController /** * @dataProvider resetPasswordDataProvider - * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute + * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::executeInternal * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken * @magentoDataFixture Magento/User/_files/dummy_user.php */ @@ -162,7 +162,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController } /** - * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute + * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::executeInternal * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken * @magentoDataFixture Magento/User/_files/dummy_user.php */ @@ -184,7 +184,7 @@ class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController } /** - * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute + * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::executeInternal * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken * @magentoDataFixture Magento/User/_files/dummy_user.php */ diff --git a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php index 932351fb427b712787c64a420f9c86e428f0f5d1..384b2e3300ef936560690a96c39b055eadad1df2 100644 --- a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php @@ -27,7 +27,7 @@ class RoleTest extends \Magento\TestFramework\TestCase\AbstractBackendController } /** - * @covers \Magento\User\Controller\Adminhtml\User\Role\Editrolegrid::execute + * @covers \Magento\User\Controller\Adminhtml\User\Role\Editrolegrid::executeInternal */ public function testEditrolegridAction() { @@ -38,7 +38,7 @@ class RoleTest extends \Magento\TestFramework\TestCase\AbstractBackendController } /** - * @covers \Magento\User\Controller\Adminhtml\User\Role\RoleGrid::execute + * @covers \Magento\User\Controller\Adminhtml\User\Role\RoleGrid::executeInternal */ public function testRoleGridAction() { diff --git a/dev/tests/integration/testsuite/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/_files/design-abstraction_select.html b/dev/tests/integration/testsuite/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/_files/design-abstraction_select.html index 15e322c12df580c58724b6193208e99bd8481cb8..ec08d09ec6bc5642bc18966ceda3196abb900ff4 100644 --- a/dev/tests/integration/testsuite/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/_files/design-abstraction_select.html +++ b/dev/tests/integration/testsuite/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/_files/design-abstraction_select.html @@ -6,9 +6,9 @@ --> <select name="design_abstractions" id="design_abstraction_select" class="design-abstraction-select" title="Design Abstraction Select"> <option value="">-- Please Select --</option> - <optgroup label="Custom Layouts"> + <optgroup data-optgroup-name="Custom Layouts" label="Custom Layouts"> <option value="customer_account" >Customer My Account (All Pages)</option> </optgroup> - <optgroup label="Page Layouts"> + <optgroup data-optgroup-name="Page Layouts" label="Page Layouts"> <option value="page_empty" >All Empty Layout Pages</option> </optgroup></select> diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/App/Language/CircularDependencyTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/App/Language/CircularDependencyTest.php index d6e27c159ece816b152d878bc901d7795d4e8f42..358b6a35af3e31f0572acbbac12edfed406ef5db 100644 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/App/Language/CircularDependencyTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Integrity/App/Language/CircularDependencyTest.php @@ -8,7 +8,6 @@ namespace Magento\Test\Integrity\App\Language; use Magento\Framework\App\Language\Config; use Magento\Framework\Component\ComponentRegistrar; -use Magento\Framework\Config\Dom\UrnResolver; class CircularDependencyTest extends \PHPUnit_Framework_TestCase { @@ -22,12 +21,36 @@ class CircularDependencyTest extends \PHPUnit_Framework_TestCase */ public function testCircularDependencies() { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $componentRegistrar = new ComponentRegistrar(); $declaredLanguages = $componentRegistrar->getPaths(ComponentRegistrar::LANGUAGE); - $urnResolver = new UrnResolver(); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $domFactoryMock = $this->getMock('Magento\Framework\Config\DomFactory', [], [], '', false); + $domFactoryMock->expects($this->any()) + ->method('createDom') + ->willReturnCallback( + function ($arguments) use ($validationStateMock) { + return new \Magento\Framework\Config\Dom( + $arguments['xml'], + $validationStateMock, + [], + null, + $arguments['schemaFile'] + ); + } + ); + $packs = []; foreach ($declaredLanguages as $language) { - $languageConfig = new Config(file_get_contents($language . '/language.xml'), $urnResolver); + $languageConfig = $objectManager->getObject( + 'Magento\Framework\App\Language\Config', + [ + 'source' => file_get_contents($language . '/language.xml'), + 'domFactory' => $domFactoryMock + ] + ); $this->packs[$languageConfig->getVendor()][$languageConfig->getPackage()] = $languageConfig; $packs[] = $languageConfig; } diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/ComposerTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/ComposerTest.php index 215df89727a1decb4e2587f2ddf31c7d5e2a6308..a3b62afaf0ce9ff88b159d9381250734f7b219ad 100644 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/ComposerTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Integrity/ComposerTest.php @@ -288,12 +288,14 @@ class ComposerTest extends \PHPUnit_Framework_TestCase */ private function assertPhpVersionInSync($name, $phpVersion) { - $this->assertEquals( - self::$rootJson['require']['php'], - $phpVersion, - "PHP version {$phpVersion} in component {$name} is inconsistent with version " - . self::$rootJson['require']['php'] . ' in root composer.json' - ); + if (isset(self::$rootJson['require']['php'])) { + $this->assertEquals( + self::$rootJson['require']['php'], + $phpVersion, + "PHP version {$phpVersion} in component {$name} is inconsistent with version " + . self::$rootJson['require']['php'] . ' in root composer.json' + ); + } } /** diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index cf42cd0950a7a806535e76d213079ad68a03a6ee..cb80c5cf1519d361cff0ca0284d06fbad8d285c9 100755 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3949,8 +3949,8 @@ return [ ['Magento\Catalog\Ui\Component\Listing\Filters'], ['Magento\Customer\Ui\Component\Listing\Filters'], ['Magento\Catalog\Block\Product\TemplateSelector'], - ['Magento\Downloadable\Controller\Adminhtml\Downloadable\Product\Edit\SuggestProductTemplates'], - ['Magento\Bundle\Controller\Adminhtml\Bundle\Product\Edit\SuggestProductTemplates'], + ['Magento\Downloadable\Controller\Adminhtml\Downloadable\Product\Edit\SuggestAttributeSets'], + ['Magento\Bundle\Controller\Adminhtml\Bundle\Product\Edit\SuggestAttributeSets'], ['Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute'], ['Magento\Wishlist\Model\Observer'], ['Magento\Swatches\Model\Observer', 'Magento\Swatches\Observer\*'], @@ -4102,4 +4102,5 @@ return [ ['Magento\GoogleOptimizer\Model\Observer\Block\Category\Tab', 'Magento\GoogleOptimizer\Observer\*'], ['Magento\Payment\Model\Observer', 'Magento\Payment\Observer\*'], ['Magento\Tax\Observer\AggregateSalesReportTaxData', 'Magento\Tax\Model\AggregateSalesReportTaxData'], + ['Magento\Developer\Console\Command\CssDeployCommand'] ]; diff --git a/dev/tools/grunt/assets/legacy-build/shim.js b/dev/tools/grunt/assets/legacy-build/shim.js index 7451340989672b85ac09ea11e40c786542261a98..e9226398fd1997b43ba023a8052dd61fabe94899 100644 --- a/dev/tools/grunt/assets/legacy-build/shim.js +++ b/dev/tools/grunt/assets/legacy-build/shim.js @@ -5,7 +5,7 @@ (function () { 'use strict'; - var globals = ['Prototype', 'Abstract', 'Try', 'Class', 'PeriodicalExecuter', 'Template', '$break', 'Enumerable', '$A', '$w', '$H', 'Hash', '$R', 'ObjectRange', 'Ajax', '$', 'Form', 'Field', '$F', 'Toggle', 'Insertion', '$continue', 'Position', 'Windows', 'Dialog', 'array', 'WindowUtilities', 'Builder', 'Effect', 'validateCreditCard', 'Validator', 'Validation', 'removeDelimiters', 'parseNumber', 'popWin', 'setLocation', 'setPLocation', 'setLanguageCode', 'decorateGeneric', 'decorateTable', 'decorateList', 'decorateDataList', 'parseSidUrl', 'formatCurrency', 'expandDetails', 'isIE', 'Varien', 'fireEvent', 'modulo', 'byteConvert', 'SessionError', 'varienLoader', 'varienLoaderHandler', 'setLoaderPosition', 'toggleSelectsUnderBlock', 'varienUpdater', 'confirmSetLocation', 'deleteConfirm', 'setElementDisable', 'toggleParentVis', 'toggleFieldsetVis', 'toggleVis', 'imagePreview', 'checkByProductPriceType', 'toggleSeveralValueElements', 'toggleValueElements', 'submitAndReloadArea', 'syncOnchangeValue', 'updateElementAtCursor', 'firebugEnabled', 'disableElement', 'enableElement', 'disableElements', 'enableElements', 'Cookie', 'Fieldset', 'Base64', 'sortNumeric', 'Element', '$$', 'Sizzle', 'Selector', 'Window']; + var globals = ['Prototype', 'Abstract', 'Try', 'Class', 'PeriodicalExecuter', 'Template', '$break', 'Enumerable', '$A', '$w', '$H', 'Hash', '$R', 'ObjectRange', 'Ajax', '$', 'Form', 'Field', '$F', 'Toggle', 'Insertion', '$continue', 'Position', 'Windows', 'Dialog', 'array', 'WindowUtilities', 'Builder', 'Effect', 'validateCreditCard', 'Validator', 'Validation', 'removeDelimiters', 'parseNumber', 'popWin', 'setLocation', 'setPLocation', 'setLanguageCode', 'decorateGeneric', 'decorateTable', 'decorateList', 'decorateDataList', 'parseSidUrl', 'formatCurrency', 'expandDetails', 'isIE', 'Varien', 'fireEvent', 'modulo', 'byteConvert', 'SessionError', 'varienLoader', 'varienLoaderHandler', 'setLoaderPosition', 'toggleSelectsUnderBlock', 'varienUpdater', 'setElementDisable', 'toggleParentVis', 'toggleFieldsetVis', 'toggleVis', 'imagePreview', 'checkByProductPriceType', 'toggleSeveralValueElements', 'toggleValueElements', 'submitAndReloadArea', 'syncOnchangeValue', 'updateElementAtCursor', 'firebugEnabled', 'disableElement', 'enableElement', 'disableElements', 'enableElements', 'Cookie', 'Fieldset', 'Base64', 'sortNumeric', 'Element', '$$', 'Sizzle', 'Selector', 'Window']; globals.forEach(function (prop) { /* jshint evil:true */ diff --git a/dev/tools/grunt/configs/combo.js b/dev/tools/grunt/configs/combo.js index cd3484eee7836c516e6cacd766fecc4410c71707..f86a47261b88c8bb28796dcce495c49df2aa0bce 100644 --- a/dev/tools/grunt/configs/combo.js +++ b/dev/tools/grunt/configs/combo.js @@ -16,10 +16,12 @@ module.exports = { var cmdPlus = /^win/.test(process.platform) ? ' & ' : ' && ', command = 'grunt --force clean:' + themeName + cmdPlus; - command = command + 'php bin/magento dev:css:deploy ' + theme[themeName].dsl + ' ' + theme[themeName].files.join(' ') + - ' --locale=' + theme[themeName].locale + - ' --area=' + theme[themeName].area + - ' --theme=' + theme[themeName].name; + command = command + 'php bin/magento dev:source_theme:deploy ' + + theme[themeName].files.join(' ') + + ' --type=less' + + ' --locale=' + theme[themeName].locale + + ' --area=' + theme[themeName].area + + ' --theme=' + theme[themeName].name; return command; }, diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/EntityChildTestAbstract.php b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/EntityChildTestAbstract.php index acbc463380d5292bab9de0851a1328ef4cebe3d3..5ea51a6d56024ca4645bcd6d5bbda4c691b65580 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/EntityChildTestAbstract.php +++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/EntityChildTestAbstract.php @@ -109,7 +109,7 @@ abstract class EntityChildTestAbstract extends \PHPUnit_Framework_TestCase //Mocking generation $this->ioObjectMock->expects($this->any()) - ->method('getResultFileName') + ->method('generateResultFileName') ->with($this->getResultClassName()) ->willReturn($resultFileName); $this->ioObjectMock->expects($this->once()) diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateMapperTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateMapperTest.php index a78b00f1ceebd60559f0a786342f965d83703b47..bdc11e49ddd360a0dfd281122ae7fef5b503a5c5 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateMapperTest.php +++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateMapperTest.php @@ -51,7 +51,7 @@ class GenerateMapperTest extends \PHPUnit_Framework_TestCase ); $sampleMapperCode = file_get_contents(__DIR__ . '/_files/SampleMapper.txt'); $this->ioObjectMock->expects($this->once()) - ->method('getResultFileName') + ->method('generateResultFileName') ->with('\Magento\Framework\Api\Code\Generator\SampleMapper') ->will($this->returnValue('SampleMapper.php')); $this->ioObjectMock->expects($this->once()) diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateSearchResultsTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateSearchResultsTest.php index 7ee5ff3acff604ad716f27d0886f6ac06c58fc33..1f7609b0e923ceff66ebb81d41786276b79d3700 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateSearchResultsTest.php +++ b/lib/internal/Magento/Framework/Api/Test/Unit/Code/Generator/GenerateSearchResultsTest.php @@ -52,7 +52,7 @@ class GenerateSearchResultsTest extends \PHPUnit_Framework_TestCase ); $sampleSearchResultBuilderCode = file_get_contents(__DIR__ . '/_files/SampleSearchResults.txt'); $this->ioObjectMock->expects($this->once()) - ->method('getResultFileName') + ->method('generateResultFileName') ->with('\Magento\Framework\Api\Code\Generator\SampleSearchResults') ->will($this->returnValue('SampleSearchResults.php')); $this->ioObjectMock->expects($this->once()) diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php index 90658f3120bed36b6cda7600c07caa24d3e84787..bd2ea71987fc526f20d7506382ce12c3214dbe44 100644 --- a/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php +++ b/lib/internal/Magento/Framework/Api/Test/Unit/ExtensionAttribute/Config/XsdTest.php @@ -25,8 +25,11 @@ class XsdTest extends \PHPUnit_Framework_TestCase */ public function testExemplarXml($fixtureXml, array $expectedErrors) { + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); $messageFormat = '%message%'; - $dom = new \Magento\Framework\Config\Dom($fixtureXml, [], null, null, $messageFormat); + $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, $messageFormat); $actualResult = $dom->validate($this->_schemaFile, $actualErrors); $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match."); $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid."); diff --git a/lib/internal/Magento/Framework/App/Action/Action.php b/lib/internal/Magento/Framework/App/Action/Action.php index 310f2f57d4d8bbfaa7e63769dc0fb28f106506d1..da7a42f6122225a8b71a378d9376201bd61454dc 100644 --- a/lib/internal/Magento/Framework/App/Action/Action.php +++ b/lib/internal/Magento/Framework/App/Action/Action.php @@ -83,7 +83,7 @@ abstract class Action extends AbstractAction * @return ResponseInterface * @throws NotFoundException */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $this->_request = $request; $profilerKey = 'CONTROLLER_ACTION:' . $request->getFullActionName(); @@ -99,7 +99,7 @@ abstract class Action extends AbstractAction $result = null; if ($request->isDispatched() && !$this->_actionFlag->get('', self::FLAG_NO_DISPATCH)) { \Magento\Framework\Profiler::start('action_body'); - $result = $this->execute(); + $result = $this->executeInternal(); \Magento\Framework\Profiler::start('postdispatch'); if (!$this->_actionFlag->get('', self::FLAG_NO_POST_DISPATCH)) { $this->_eventManager->dispatch( @@ -122,7 +122,7 @@ abstract class Action extends AbstractAction /** * @return ResultInterface */ - abstract protected function execute(); + abstract protected function executeInternal(); /** * Throw control to different action (control and module if was specified). diff --git a/lib/internal/Magento/Framework/App/Action/Forward.php b/lib/internal/Magento/Framework/App/Action/Forward.php index 611b7413b4157a70eabce40af94dc64bb2029d3b..db11b6577f33c876e5d8d6105b1fb8543b22113c 100644 --- a/lib/internal/Magento/Framework/App/Action/Forward.php +++ b/lib/internal/Magento/Framework/App/Action/Forward.php @@ -17,7 +17,7 @@ class Forward extends AbstractAction * @return ResponseInterface * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { $request->setDispatched(false); return $this->_response; diff --git a/lib/internal/Magento/Framework/App/Action/Plugin/Design.php b/lib/internal/Magento/Framework/App/Action/Plugin/Design.php index 5bb0556fe640d3d0c23bda0da6c790dba69d2dba..3d2f794ad14978f69e0480ddb9767bad2562e63b 100644 --- a/lib/internal/Magento/Framework/App/Action/Plugin/Design.php +++ b/lib/internal/Magento/Framework/App/Action/Plugin/Design.php @@ -30,7 +30,7 @@ class Design * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundDispatch( + public function aroundExecute( \Magento\Framework\App\ActionInterface $subject, \Closure $proceed, \Magento\Framework\App\RequestInterface $request diff --git a/lib/internal/Magento/Framework/App/Action/Redirect.php b/lib/internal/Magento/Framework/App/Action/Redirect.php index 5904274e56187cf0db34aff374a448cf88b9c4c3..23b3cfcb90d6281818426a164758bf3f88b2ad48 100644 --- a/lib/internal/Magento/Framework/App/Action/Redirect.php +++ b/lib/internal/Magento/Framework/App/Action/Redirect.php @@ -19,7 +19,7 @@ class Redirect extends AbstractAction * @return ResponseInterface * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function dispatch(RequestInterface $request) + public function execute(RequestInterface $request) { return $this->_response; } diff --git a/lib/internal/Magento/Framework/App/ActionInterface.php b/lib/internal/Magento/Framework/App/ActionInterface.php index 7e90fc49922b04219977638ac752161ce0a1514f..cf740250eb856a51d795dbe0463a2b7eca2ac5f5 100644 --- a/lib/internal/Magento/Framework/App/ActionInterface.php +++ b/lib/internal/Magento/Framework/App/ActionInterface.php @@ -26,5 +26,5 @@ interface ActionInterface * @return \Magento\Framework\Controller\ResultInterface|ResponseInterface * @throws \Magento\Framework\Exception\NotFoundException */ - public function dispatch(RequestInterface $request); + public function execute(RequestInterface $request); } diff --git a/lib/internal/Magento/Framework/App/Arguments/ValidationState.php b/lib/internal/Magento/Framework/App/Arguments/ValidationState.php index 55c65798c64d70b1700efaed3b46f1e135b3a733..8af1dedc59c45baa1c1663c26bf69de977598ea2 100644 --- a/lib/internal/Magento/Framework/App/Arguments/ValidationState.php +++ b/lib/internal/Magento/Framework/App/Arguments/ValidationState.php @@ -27,7 +27,7 @@ class ValidationState implements \Magento\Framework\Config\ValidationStateInterf * * @return boolean */ - public function isValidated() + public function isValidationRequired() { return $this->_appMode == \Magento\Framework\App\State::MODE_DEVELOPER; } diff --git a/lib/internal/Magento/Framework/App/Config/Initial/Reader.php b/lib/internal/Magento/Framework/App/Config/Initial/Reader.php index d907d22223e42370c3c1881b04f6fa21b472073e..33f0c4cfcb3760d63a1cac85599f34ec125ed878 100644 --- a/lib/internal/Magento/Framework/App/Config/Initial/Reader.php +++ b/lib/internal/Magento/Framework/App/Config/Initial/Reader.php @@ -55,7 +55,7 @@ class Reader * @param \Magento\Framework\Config\FileResolverInterface $fileResolver * @param \Magento\Framework\Config\ConverterInterface $converter * @param SchemaLocator $schemaLocator - * @param \Magento\Framework\Config\ValidationStateInterface $validationState + * @param \Magento\Framework\Config\DomFactory $domFactory * @param string $fileName * @param string $domDocumentClass */ @@ -63,14 +63,13 @@ class Reader \Magento\Framework\Config\FileResolverInterface $fileResolver, \Magento\Framework\Config\ConverterInterface $converter, SchemaLocator $schemaLocator, - \Magento\Framework\Config\ValidationStateInterface $validationState, - $fileName = 'config.xml', - $domDocumentClass = 'Magento\Framework\Config\Dom' + \Magento\Framework\Config\DomFactory $domFactory, + $fileName = 'config.xml' ) { - $this->_schemaFile = $validationState->isValidated() ? $schemaLocator->getSchema() : null; + $this->_schemaFile = $schemaLocator->getSchema(); $this->_fileResolver = $fileResolver; $this->_converter = $converter; - $this->_domDocumentClass = $domDocumentClass; + $this->domFactory = $domFactory; $this->_fileName = $fileName; } @@ -99,9 +98,8 @@ class Reader $domDocument = null; foreach ($fileList as $file) { try { - if ($domDocument === null) { - $class = $this->_domDocumentClass; - $domDocument = new $class($file, [], null, $this->_schemaFile); + if (!$domDocument) { + $domDocument = $this->domFactory->createDom(['xml' => $file, 'schemaFile' => $this->_schemaFile]); } else { $domDocument->merge($file); } diff --git a/lib/internal/Magento/Framework/App/Config/Value.php b/lib/internal/Magento/Framework/App/Config/Value.php index ddfb123d637f099d8215a2e5f698e910de1016a6..5be19ff29133207c5b71e14a5531a40fed11a308 100644 --- a/lib/internal/Magento/Framework/App/Config/Value.php +++ b/lib/internal/Magento/Framework/App/Config/Value.php @@ -42,23 +42,31 @@ class Value extends \Magento\Framework\Model\AbstractModel implements \Magento\F */ protected $_config; + /** + * @var \Magento\Framework\App\Cache\TypeListInterface + */ + protected $cacheTypeList; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry - * @param \Magento\Framework\App\Config\ScopeConfigInterface $config - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource - * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection + * @param ScopeConfigInterface $config + * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList + * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource + * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $data */ public function __construct( \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\App\Config\ScopeConfigInterface $config, + \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_config = $config; + $this->cacheTypeList = $cacheTypeList; parent::__construct($context, $registry, $resource, $resourceCollection, $data); } @@ -107,4 +115,20 @@ class Value extends \Magento\Framework\Model\AbstractModel implements \Magento\F $data = $this->_getData('fieldset_data'); return is_array($data) && isset($data[$key]) ? $data[$key] : null; } + + /** + * {@inheritdoc} + * + * {@inheritdoc}. In addition, it sets status 'invalidate' for config caches + * + * @return $this + */ + public function afterSave() + { + if ($this->isValueChanged()) { + $this->cacheTypeList->invalidate(\Magento\Framework\App\Cache\Type\Config::TYPE_IDENTIFIER); + } + + return parent::afterSave(); + } } diff --git a/lib/internal/Magento/Framework/App/FrontController.php b/lib/internal/Magento/Framework/App/FrontController.php index c3a9b6b390bbb50b1e2b48ef9145a4cb27ec99d2..49630bd4e6dda8e01e28f4886315e1f52eb8f565 100644 --- a/lib/internal/Magento/Framework/App/FrontController.php +++ b/lib/internal/Magento/Framework/App/FrontController.php @@ -51,7 +51,7 @@ class FrontController implements FrontControllerInterface if ($actionInstance) { $request->setDispatched(true); $this->response->setNoCacheHeaders(); - $result = $actionInstance->dispatch($request); + $result = $actionInstance->execute($request); break; } } catch (\Magento\Framework\Exception\NotFoundException $e) { diff --git a/lib/internal/Magento/Framework/App/Language/Config.php b/lib/internal/Magento/Framework/App/Language/Config.php index 84dfdfe149cbebd6cc288ee17319895da3d76ffd..8376e47e47cb120934d6fa8823c9b6d24c1d612a 100644 --- a/lib/internal/Magento/Framework/App/Language/Config.php +++ b/lib/internal/Magento/Framework/App/Language/Config.php @@ -16,6 +16,11 @@ class Config /** @var \Magento\Framework\Config\Dom\UrnResolver */ protected $urnResolver; + /** + * @var \Magento\Framework\Config\DomFactory + */ + protected $domFactory; + /** * Data extracted from the configuration file * @@ -28,22 +33,18 @@ class Config * * @param string $source * @param \Magento\Framework\Config\Dom\UrnResolver $urnResolver + * @param \Magento\Framework\Config\DomFactory $domFactory * @throws \Magento\Framework\Exception\LocalizedException */ public function __construct( $source, - \Magento\Framework\Config\Dom\UrnResolver $urnResolver + \Magento\Framework\Config\Dom\UrnResolver $urnResolver, + \Magento\Framework\Config\DomFactory $domFactory ) { $this->urnResolver = $urnResolver; - $config = new \DOMDocument(); - $config->loadXML($source); - $errors = Dom::validateDomDocument($config, $this->getSchemaFile()); - if (!empty($errors)) { - throw new \Magento\Framework\Exception\LocalizedException( - new \Magento\Framework\Phrase("Invalid Document: \n%1", [implode("\n", $errors)]) - ); - } - $this->_data = $this->_extractData($config); + $this->domFactory = $domFactory; + $dom = $this->domFactory->createDom(['xml' => $source, 'schemaFile' => $this->getSchemaFile()]); + $this->_data = $this->_extractData($dom->getDom()); } /** diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Action/ActionTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Action/ActionTest.php index 44a79370181276bf85dc3d1278baedffe4b97763..e7b0a27ab64f56f650de147e4d9d911ab8172d22 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Action/ActionTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Action/ActionTest.php @@ -170,7 +170,7 @@ class ActionTest extends \PHPUnit_Framework_TestCase $expectedEventParameters ); - $this->assertEquals($this->_responseMock, $this->action->dispatch($this->_requestMock)); + $this->assertEquals($this->_responseMock, $this->action->execute($this->_requestMock)); } } @@ -179,7 +179,7 @@ class ActionFake extends Action /** * Fake action to check a method call from a parent */ - public function execute() + public function executeInternal() { $this->_forward( ActionTest::ACTION_NAME, diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Action/ForwardTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Action/ForwardTest.php index 2d15e0a290b338531cb4ff742fe18453df84f940..5501546bc5914b2d572ecfa596b82cb779d23de2 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Action/ForwardTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Action/ForwardTest.php @@ -62,7 +62,7 @@ class ForwardTest extends \PHPUnit_Framework_TestCase public function testDispatch() { $this->request->expects($this->once())->method('setDispatched')->with(false); - $this->actionAbstract->dispatch($this->request); + $this->actionAbstract->execute($this->request); } /** diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Action/Plugin/DesignTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Action/Plugin/DesignTest.php index 2e86c5da43189b005ce24c123f2b342338ac8f06..401e9896155833283c56bccd2687b961869b66cc 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Action/Plugin/DesignTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Action/Plugin/DesignTest.php @@ -7,7 +7,7 @@ namespace Magento\Framework\App\Test\Unit\Action\Plugin; class DesignTest extends \PHPUnit_Framework_TestCase { - public function testAroundDispatch() + public function testAroundExecute() { $subjectMock = $this->getMock('Magento\Framework\App\Action\Action', [], [], '', false); $designLoaderMock = $this->getMock('Magento\Framework\View\DesignLoader', [], [], '', false); @@ -17,6 +17,6 @@ class DesignTest extends \PHPUnit_Framework_TestCase $requestMock = $this->getMock('Magento\Framework\App\RequestInterface'); $plugin = new \Magento\Framework\App\Action\Plugin\Design($designLoaderMock); $designLoaderMock->expects($this->once())->method('load'); - $this->assertEquals('Expected', $plugin->aroundDispatch($subjectMock, $closureMock, $requestMock)); + $this->assertEquals('Expected', $plugin->aroundExecute($subjectMock, $closureMock, $requestMock)); } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Action/Stub/ActionStub.php b/lib/internal/Magento/Framework/App/Test/Unit/Action/Stub/ActionStub.php index a5c6d5cff8e40b494015c00316ca5bd8172bec34..4c654992ab234782ae5cd8155ad22d7098262778 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Action/Stub/ActionStub.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Action/Stub/ActionStub.php @@ -8,7 +8,7 @@ namespace Magento\Framework\App\Test\Unit\Action\Stub; class ActionStub extends \Magento\Framework\App\Action\Action { - protected function execute() + protected function executeInternal() { // Empty method stub for test } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/ReaderTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/ReaderTest.php index 4c1fde2796bf5ab0b2ba6f64875c808055f18255..98b9d81e75b9d332c44ce3b2f2389423787f2ffa 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/ReaderTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/Initial/ReaderTest.php @@ -20,12 +20,12 @@ class ReaderTest extends \PHPUnit_Framework_TestCase protected $model; /** - * @var \Magento\Framework\Config\FileResolverInterface | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Config\FileResolverInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $fileResolverMock; /** - * @var \Magento\Framework\App\Config\Initial\Converter | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Config\Initial\Converter|\PHPUnit_Framework_MockObject_MockObject */ protected $converterMock; @@ -35,15 +35,20 @@ class ReaderTest extends \PHPUnit_Framework_TestCase protected $filePath; /** - * @var \Magento\Framework\Config\ValidationStateInterface | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Config\ValidationStateInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $validationStateMock; /** - * @var \Magento\Framework\App\Config\Initial\SchemaLocator | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Config\Initial\SchemaLocator|\PHPUnit_Framework_MockObject_MockObject */ protected $schemaLocatorMock; + /** + * @var \Magento\Framework\Config\DomFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $domFactoryMock; + protected function setUp() { $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -58,6 +63,10 @@ class ReaderTest extends \PHPUnit_Framework_TestCase false ); $this->validationStateMock = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); + $this->validationStateMock->expects($this->any()) + ->method('isValidationRequired') + ->will($this->returnValue(true)); + $this->domFactoryMock = $this->getMock('Magento\Framework\Config\DomFactory', [], [], '', false); } public function testConstructor() @@ -85,6 +94,7 @@ class ReaderTest extends \PHPUnit_Framework_TestCase public function testReadValidConfig() { $this->createModelAndVerifyConstructor(); + $this->prepareDomFactoryMock(); $testXmlFilesList = [ file_get_contents($this->filePath . 'initial_config1.xml'), file_get_contents($this->filePath . 'initial_config2.xml'), @@ -104,6 +114,24 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedConfig, $this->model->read()); } + private function prepareDomFactoryMock() + { + $validationStateMock = $this->validationStateMock; + $this->domFactoryMock->expects($this->once()) + ->method('createDom') + ->willReturnCallback( + function ($arguments) use ($validationStateMock) { + return new \Magento\Framework\Config\Dom( + $arguments['xml'], + $validationStateMock, + [], + null, + $arguments['schemaFile'] + ); + } + ); + } + /** * @covers \Magento\Framework\App\Config\Initial\Reader::read * @expectedException \Magento\Framework\Exception\LocalizedException @@ -112,6 +140,7 @@ class ReaderTest extends \PHPUnit_Framework_TestCase public function testReadInvalidConfig() { $this->createModelAndVerifyConstructor(); + $this->prepareDomFactoryMock(); $testXmlFilesList = [ file_get_contents($this->filePath . 'invalid_config.xml'), file_get_contents($this->filePath . 'initial_config2.xml'), @@ -133,17 +162,15 @@ class ReaderTest extends \PHPUnit_Framework_TestCase private function createModelAndVerifyConstructor() { - $this->validationStateMock->expects($this->once())->method('isValidated')->will($this->returnValue(true)); $schemaFile = $this->filePath . 'config.xsd'; $this->schemaLocatorMock->expects($this->once())->method('getSchema')->will($this->returnValue($schemaFile)); - $this->model = $this->objectManager->getObject( 'Magento\Framework\App\Config\Initial\Reader', [ 'fileResolver' => $this->fileResolverMock, 'converter' => $this->converterMock, 'schemaLocator' => $this->schemaLocatorMock, - 'validationState' => $this->validationStateMock + 'domFactory' => $this->domFactoryMock ] ); } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ValueTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ValueTest.php index db103705fefb6bac69e18620cf1dd96175affe78..175509af622a025d5b05b879e227f763cd3a3f56 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Config/ValueTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/ValueTest.php @@ -15,27 +15,36 @@ class ValueTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $eventManager; + protected $eventManagerMock; /** * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $configMock; + /** + * @var \Magento\Framework\App\Cache\TypeListInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $cacheTypeListMock; + /** * @return void */ protected function setUp() { $this->configMock = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface'); - $this->eventManager = $this->getMock('Magento\Framework\Event\ManagerInterface'); + $this->eventManagerMock = $this->getMock('Magento\Framework\Event\ManagerInterface'); + $this->cacheTypeListMock = $this->getMockBuilder('Magento\Framework\App\Cache\TypeListInterface') + ->disableOriginalConstructor() + ->getMock(); $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->model = $objectManager->getObject( 'Magento\Framework\App\Config\Value', [ 'config' => $this->configMock, - 'eventDispatcher' => $this->eventManager, + 'eventDispatcher' => $this->eventManagerMock, + 'cacheTypeList' => $this->cacheTypeListMock, ] ); } @@ -99,7 +108,7 @@ class ValueTest extends \PHPUnit_Framework_TestCase */ public function testAfterLoad() { - $this->eventManager->expects( + $this->eventManagerMock->expects( $this->at(0) )->method( 'dispatch' @@ -107,7 +116,7 @@ class ValueTest extends \PHPUnit_Framework_TestCase 'model_load_after', ['object' => $this->model] ); - $this->eventManager->expects( + $this->eventManagerMock->expects( $this->at(1) )->method( 'dispatch' @@ -158,4 +167,28 @@ class ValueTest extends \PHPUnit_Framework_TestCase ], ]; } + + /** + * @param int $callNumber + * @param string $oldValue + * @dataProvider afterSaveDataProvider + */ + public function testAfterSave($callNumber, $oldValue) + { + $this->cacheTypeListMock->expects($this->exactly($callNumber)) + ->method('invalidate'); + $this->configMock->expects($this->any()) + ->method('getValue') + ->willReturn($oldValue); + $this->model->setValue('some_value'); + $this->assertInstanceOf(get_class($this->model), $this->model->afterSave()); + } + + public function afterSaveDataProvider() + { + return [ + [0, 'some_value'], + [1, 'other_value'], + ]; + } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/FrontControllerTest.php b/lib/internal/Magento/Framework/App/Test/Unit/FrontControllerTest.php index c87ab7af120aa3b2349c44f4f72d31a337da8f07..dc4f0b0c7c331b973525dbf3bae2f60afc85db9b 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/FrontControllerTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/FrontControllerTest.php @@ -82,7 +82,7 @@ class FrontControllerTest extends \PHPUnit_Framework_TestCase $response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false); $controllerInstance = $this->getMock('Magento\Framework\App\ActionInterface'); $controllerInstance->expects($this->any()) - ->method('dispatch') + ->method('execute') ->with($this->request) ->will($this->returnValue($response)); $this->router->expects($this->at(0)) @@ -114,7 +114,7 @@ class FrontControllerTest extends \PHPUnit_Framework_TestCase $response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false); $controllerInstance = $this->getMock('Magento\Framework\App\ActionInterface'); $controllerInstance->expects($this->any()) - ->method('dispatch') + ->method('execute') ->with($this->request) ->will($this->returnValue($response)); $this->router->expects($this->at(0)) diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Language/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Language/ConfigTest.php index c69c340fda154753c53b4601f686320f9f46fee5..5b2f4270d215b1afc2d727b7db0cc9770ea509fb 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Language/ConfigTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Language/ConfigTest.php @@ -30,9 +30,27 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ->method('getRealPath') ->with('urn:magento:framework:App/Language/package.xsd') ->willReturn($this->urnResolver->getRealPath('urn:magento:framework:App/Language/package.xsd')); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $domFactoryMock = $this->getMock('Magento\Framework\Config\DomFactory', [], [], '', false); + $domFactoryMock->expects($this->once()) + ->method('createDom') + ->willReturnCallback( + function ($arguments) use ($validationStateMock) { + return new \Magento\Framework\Config\Dom( + $arguments['xml'], + $validationStateMock, + [], + null, + $arguments['schemaFile'] + ); + } + ); $this->config = new Config( file_get_contents(__DIR__ . '/_files/language.xml'), - $this->urnResolverMock + $this->urnResolverMock, + $domFactoryMock ); } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php index adeccfb17019ace4a71a19ad8bac1528d9d2f185..48c6ad840f366dc87e49d221483cc6bc3eb41f2a 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php @@ -112,7 +112,7 @@ class ActionListTest extends \PHPUnit_Framework_TestCase $mockClassName = 'Mock_Action_Class'; $actionClass = $this->getMockClass( 'Magento\Framework\App\ActionInterface', - ['dispatch', 'getResponse'], + ['execute', 'getResponse'], [], $mockClassName ); diff --git a/lib/internal/Magento/Framework/App/View/Asset/Publisher.php b/lib/internal/Magento/Framework/App/View/Asset/Publisher.php index e65564720bb670f1f55ec8b03b343755d451f249..45c18093ae6325afcbe357bb010985c1fcbc8d30 100644 --- a/lib/internal/Magento/Framework/App/View/Asset/Publisher.php +++ b/lib/internal/Magento/Framework/App/View/Asset/Publisher.php @@ -37,7 +37,8 @@ class Publisher } /** - * {@inheritdoc} + * @param Asset\LocalInterface $asset + * @return bool */ public function publish(Asset\LocalInterface $asset) { diff --git a/lib/internal/Magento/Framework/Catalog/README.md b/lib/internal/Magento/Framework/Catalog/README.md deleted file mode 100644 index 6cb1e7b6ec3b25f2057c1406483448d74b35828b..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/Catalog/README.md +++ /dev/null @@ -1 +0,0 @@ -Library contains schema files used to validate XML files in Magento\Catalog module diff --git a/lib/internal/Magento/Framework/Catalog/etc/view.xsd b/lib/internal/Magento/Framework/Catalog/etc/view.xsd deleted file mode 100644 index cc9c4fec4a74d3bc4992c2d9f7cc2184e6314960..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/Catalog/etc/view.xsd +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> - <xs:redefine schemaLocation="../../Config/etc/view.xsd"> - <xs:complexType name="mediaType" mixed="true"> - <xs:complexContent> - <xs:extension base="mediaType"> - <xs:sequence> - <xs:element name="images" type="imageType" minOccurs="0"/> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:redefine> - - <xs:complexType name="imageType"> - <xs:sequence> - <xs:element name="image" minOccurs="1" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="width" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="height" type="xs:positiveInteger" minOccurs="0"/> - <xs:element name="constrain" type="xs:boolean" minOccurs="0"/> - <xs:element name="aspect_ratio" type="xs:boolean" minOccurs="0"/> - <xs:element name="frame" type="xs:boolean" minOccurs="0"/> - <xs:element name="transparency" type="xs:boolean" minOccurs="0"/> - <xs:element name="background" minOccurs="0"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:pattern value="\[(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\]"/> - </xs:restriction> - </xs:simpleType> - </xs:element> - </xs:sequence> - <xs:attribute name="id" type="xs:string" use="required"/> - <xs:attribute name="type"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="thumbnail"/> - <xs:enumeration value="small_image"/> - <xs:enumeration value="image"/> - <xs:enumeration value="swatch_image"/> - <xs:enumeration value="swatch_thumb"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="module" type="xs:string" use="required"/> - </xs:complexType> -</xs:schema> diff --git a/lib/internal/Magento/Framework/Code/Generator.php b/lib/internal/Magento/Framework/Code/Generator.php index edd02f6c2049282b6af2fa7f3b8e7d2559492857..2a572346e6a60bf2cb149a12f9c2a53d00e0b11d 100644 --- a/lib/internal/Magento/Framework/Code/Generator.php +++ b/lib/internal/Magento/Framework/Code/Generator.php @@ -104,25 +104,13 @@ class Generator new \Magento\Framework\Phrase(implode(' ', $errors)) ); } - $this->tryToIncludeFile($file, $className); + if (!$this->definedClasses->isClassLoadableFromMemory($className)) { + $this->_ioObject->includeFile($file); + } return self::GENERATION_SUCCESS; } } - /** - * Include file only if the class is not already defined in memory - * - * @param string $fileName - * @param string $className - * @return void - */ - public function tryToIncludeFile($fileName, $className) - { - if (!$this->definedClasses->isClassLoadableFromMemory($className)) { - include $fileName; - } - } - /** * Create entity generator * @@ -203,6 +191,16 @@ class Generator if (!$resultEntityType || !$sourceClassName) { return self::GENERATION_ERROR; } else if ($this->definedClasses->isClassLoadableFromDisc($resultClass)) { + $generatedFileName = $this->_ioObject->generateResultFileName($resultClass); + /** + * Must handle two edge cases: a competing process has generated the class and written it to disc already, + * or the class exists in committed code, despite matching pattern to be generated. + */ + if ($this->_ioObject->fileExists($generatedFileName) + && !$this->definedClasses->isClassLoadableFromMemory($resultClass) + ) { + $this->_ioObject->includeFile($generatedFileName); + } return self::GENERATION_SKIP; } else if (!isset($this->_generatedEntities[$resultEntityType])) { throw new \InvalidArgumentException('Unknown generation entity.'); diff --git a/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php b/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php index fee367f49ca8046d5088bdbda5167bbcab90f82f..aed8424282e8b3e7cfb5c292227752af728fd1c9 100644 --- a/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php +++ b/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php @@ -97,7 +97,7 @@ abstract class EntityAbstract if ($this->_validateData()) { $sourceCode = $this->_generateCode(); if ($sourceCode) { - $fileName = $this->_ioObject->getResultFileName($this->_getResultClassName()); + $fileName = $this->_ioObject->generateResultFileName($this->_getResultClassName()); $this->_ioObject->writeResultFile($fileName, $sourceCode); return $fileName; } else { @@ -252,9 +252,6 @@ abstract class EntityAbstract if (!$this->definedClasses->isClassLoadable($sourceClassName)) { $this->_addError('Source class ' . $sourceClassName . ' doesn\'t exist.'); return false; - } elseif ($this->definedClasses->isClassLoadableFromDisc($resultClassName)) { - $this->_addError('Result class ' . $resultClassName . ' already exists.'); - return false; } elseif ( /** * If makeResultFileDirectory only fails because the file is already created, diff --git a/lib/internal/Magento/Framework/Code/Generator/Io.php b/lib/internal/Magento/Framework/Code/Generator/Io.php index eb6cabeebf911acce56eeba33e087d8e731f15a4..365482c797c4ac937ede669be5e9246ca0d7d792 100644 --- a/lib/internal/Magento/Framework/Code/Generator/Io.php +++ b/lib/internal/Magento/Framework/Code/Generator/Io.php @@ -61,7 +61,7 @@ class Io */ public function getResultFileDirectory($className) { - $fileName = $this->getResultFileName($className); + $fileName = $this->generateResultFileName($className); $pathParts = explode('/', $fileName); unset($pathParts[count($pathParts) - 1]); @@ -72,7 +72,7 @@ class Io * @param string $className * @return string */ - public function getResultFileName($className) + public function generateResultFileName($className) { return $this->_generationDirectory . ltrim(str_replace(['\\', '_'], '/', $className), '/') . '.php'; } @@ -98,7 +98,7 @@ class Io try { $success = $this->filesystemDriver->rename($tmpFile, $fileName); } catch (FileSystemException $e) { - if (!file_exists($fileName)) { + if (!$this->fileExists($fileName)) { throw $e; } else { /** @@ -146,6 +146,18 @@ class Io return $this->filesystemDriver->isExists($fileName); } + /** + * Wrapper for include + * + * @param string $fileName + * @return mixed + * @codeCoverageIgnore + */ + public function includeFile($fileName) + { + return include $fileName; + } + /** * @param string $directory * @return bool diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/EntityAbstractTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/EntityAbstractTest.php index cf74e8a67f1573a8eb9ce202c35014f9ca6e263b..c10467f7cdf4bce65b4687cb90b9a700080a1ad7 100644 --- a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/EntityAbstractTest.php +++ b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/EntityAbstractTest.php @@ -103,39 +103,33 @@ class EntityAbstractTest extends \PHPUnit_Framework_TestCase { return [ 'no_source_class' => [ - '$errors' => ['Source class ' . self::SOURCE_CLASS . ' doesn\'t exist.'], - '$validationSuccess' => false, - '$sourceClassExists' => false, - ], - 'result_class_exists' => [ - '$errors' => ['Result class ' . self::RESULT_CLASS . ' already exists.'], - '$validationSuccess' => false, - '$sourceClassExists' => true, - '$resultClassExists' => true, + 'errors' => ['Source class ' . self::SOURCE_CLASS . ' doesn\'t exist.'], + 'validationSuccess' => false, + 'sourceClassExists' => false, ], 'cant_create_result_directory' => [ - '$errors' => ['Can\'t create directory ' . self::RESULT_DIRECTORY . '.'], - '$validationSuccess' => false, - '$sourceClassExists' => true, - '$resultClassExists' => false, - '$makeResultDirSuccess' => false, + 'errors' => ['Can\'t create directory ' . self::RESULT_DIRECTORY . '.'], + 'validationSuccess' => false, + 'sourceClassExists' => true, + 'resultClassExists' => false, + 'makeResultDirSuccess' => false, ], 'result_file_exists' => [ - '$errors' => [], - '$validationSuccess' => true, - '$sourceClassExists' => true, - '$resultClassExists' => false, - '$makeResultDirSuccess' => false, - '$resultFileExists' => true, + 'errors' => [], + 'validationSuccess' => true, + 'sourceClassExists' => true, + 'resultClassExists' => false, + 'makeResultDirSuccess' => false, + 'resultFileExists' => true, ], 'generate_no_data' => [ - '$errors' => ['Can\'t generate source code.'], - '$validationSuccess' => true, - '$sourceClassExists' => true, - '$resultClassExists' => false, - '$makeResultDirSuccess' => true, - '$resultFileExists' => true, - '$willWriteCode' => false, + 'errors' => ['Can\'t generate source code.'], + 'validationSuccess' => true, + 'sourceClassExists' => true, + 'resultClassExists' => false, + 'makeResultDirSuccess' => true, + 'resultFileExists' => true, + 'willWriteCode' => false, ], 'generate_ok' => [] ]; @@ -292,7 +286,7 @@ class EntityAbstractTest extends \PHPUnit_Framework_TestCase if ($willWriteCode) { $ioObject->expects($this->once())->method('writeResultFile')->with(self::RESULT_FILE, self::RESULT_CODE); } - $ioObject->expects($this->any())->method('getResultFileName')->willReturn(self::RESULT_FILE); + $ioObject->expects($this->any())->method('generateResultFileName')->willReturn(self::RESULT_FILE); return [ 'source_class' => $mocks['source_class'], diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php index bd3a34bc4710363c71d0bbd892364ff6e06714cb..33b12746656a63722623aea045b237712ea6c75f 100644 --- a/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php +++ b/lib/internal/Magento/Framework/Code/Test/Unit/Generator/IoTest.php @@ -5,6 +5,10 @@ */ namespace Magento\Framework\Code\Test\Unit\Generator; +use Magento\Framework\Component\ComponentRegistrar; +use Magento\Framework\Exception\FileSystemException; +use Magento\Framework\Phrase; + class IoTest extends \PHPUnit_Framework_TestCase { /**#@+ @@ -16,8 +20,6 @@ class IoTest extends \PHPUnit_Framework_TestCase const CLASS_FILE_NAME = 'class/file/name'; - const FILE_NAME = 'test_file'; - const FILE_CONTENT = "content"; /**#@-*/ @@ -29,16 +31,18 @@ class IoTest extends \PHPUnit_Framework_TestCase */ protected $_generationDirectory; - /** - * @var \Magento\Framework\Code\Generator\Io - */ + /** @var \Magento\Framework\Code\Generator\Io */ protected $_object; - /** - * @var \Magento\Framework\Filesystem|\PHPUnit_Framework_MockObject_MockObject - */ + /** @var \Magento\Framework\Filesystem|\PHPUnit_Framework_MockObject_MockObject */ protected $_filesystemDriverMock; + /** @var string */ + protected $existingFile = '/Magento/Class/Exists.php'; + + /** @var string */ + protected $nonExistingFile = '/Magento/Class/Does/Not/Exists.php'; + protected function setUp() { $this->_generationDirectory = rtrim(self::GENERATION_DIRECTORY, '/') . '/'; @@ -68,26 +72,68 @@ class IoTest extends \PHPUnit_Framework_TestCase public function testGetResultFileName() { $expectedFileName = self::GENERATION_DIRECTORY . '/class/name.php'; - $this->assertEquals($expectedFileName, $this->_object->getResultFileName(self::CLASS_NAME)); + $this->assertEquals($expectedFileName, $this->_object->generateResultFileName(self::CLASS_NAME)); } - public function testWriteResultFile() + /** + * @dataProvider testWriteResultFileAlreadyExistsDataProvider + */ + public function testWriteResultFileAlreadyExists($resultFileName, $fileExists, $exceptionDuringRename, $success) { $this->_filesystemDriverMock->expects($this->once()) ->method('filePutContents') ->with( - $this->stringContains(self::FILE_NAME), + $this->stringContains($resultFileName), "<?php\n" . self::FILE_CONTENT )->willReturn(true); + $isExistsInvocationCount = $exceptionDuringRename ? 1 : 0; + $this->_filesystemDriverMock->expects($this->exactly($isExistsInvocationCount)) + ->method('isExists') + ->willReturn($fileExists); + + if (!$exceptionDuringRename) { + $renameMockEvent = $this->returnValue(true); + } else if ($fileExists) { + $renameMockEvent = $this->throwException(new FileSystemException(new Phrase('File already exists'))); + } else { + $exceptionMessage = 'Some error renaming file'; + $renameMockEvent = $this->throwException(new FileSystemException(new Phrase($exceptionMessage))); + $this->setExpectedException('\Magento\Framework\Exception\FileSystemException', $exceptionMessage); + } $this->_filesystemDriverMock->expects($this->once()) ->method('rename') ->with( - $this->stringContains(self::FILE_NAME), - self::FILE_NAME - )->willReturn(true); + $this->stringContains($resultFileName), + $resultFileName + )->will($renameMockEvent); //Throw exception or return true - $this->assertTrue($this->_object->writeResultFile(self::FILE_NAME, self::FILE_CONTENT)); + $this->assertSame($success, $this->_object->writeResultFile($resultFileName, self::FILE_CONTENT)); + } + + public function testWriteResultFileAlreadyExistsDataProvider() + { + return [ + 'Writing file succeeds: writeResultFile succeeds' => [ + 'resultFileName' => $this->nonExistingFile, + 'fileExists' => false, + 'exceptionDuringRename' => false, + 'success' => true + + ], + 'Writing file fails because class already exists on disc: writeResultFile succeeds' => [ + 'resultFileName' => $this->existingFile, + 'fileExists' => true, + 'exceptionDuringRename' => true, + 'success' => true + ], + 'Error renaming file, btu class does not exist on disc: writeResultFile throws exception and fails' => [ + 'resultFileName' => $this->nonExistingFile, + 'fileExists' => false, + 'exceptionDuringRename' => true, + 'success' => false + ] + ]; } public function testMakeGenerationDirectoryWritable() @@ -136,18 +182,31 @@ class IoTest extends \PHPUnit_Framework_TestCase $this->assertEquals($this->_generationDirectory, $this->_object->getGenerationDirectory()); } - public function testFileExists() + /** + * @dataProvider fileExistsDataProvider + * @param $fileName + * @param $exists + */ + public function testFileExists($fileName, $exists) { $this->_filesystemDriverMock->expects( $this->once() )->method( 'isExists' )->with( - $this->equalTo(self::FILE_NAME) + $this->equalTo($fileName) )->will( - $this->returnValue(false) + $this->returnValue($exists) ); - $this->assertFalse($this->_object->fileExists(self::FILE_NAME)); + $this->assertSame($exists, $this->_object->fileExists($fileName)); + } + + public function fileExistsDataProvider() + { + return [ + ['fileName' => $this->existingFile, 'exists' => true], + ['fileName' => $this->nonExistingFile, 'exists' => false] + ]; } } diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php index 88a043753daa73776e941541651e7cc3b237e555..c289ba47967435ded674df11cc9af595e280909e 100644 --- a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php +++ b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratorTest.php @@ -8,6 +8,10 @@ namespace Magento\Framework\Code\Test\Unit; +use Magento\Framework\Code\Generator; +use Magento\Framework\Code\Generator\DefinedClasses; +use Magento\Framework\Code\Generator\Io; + class GeneratorTest extends \PHPUnit_Framework_TestCase { /** @@ -27,34 +31,41 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase ]; /** - * Model under test + * System under test * * @var \Magento\Framework\Code\Generator */ protected $model; - /** - * @var \PHPUnit_Framework_MockObject_MockObject|Generator\Io - */ + /** @var \PHPUnit_Framework_MockObject_MockObject|Io */ protected $ioObjectMock; + /** @var \Magento\Framework\Code\Generator\DefinedClasses | \PHPUnit_Framework_MockObject_MockObject */ + protected $definedClassesMock; + protected function setUp() { + $this->definedClassesMock = $this->getMock('\Magento\Framework\Code\Generator\DefinedClasses'); $this->ioObjectMock = $this->getMockBuilder('\Magento\Framework\Code\Generator\Io') ->disableOriginalConstructor() ->getMock(); - } - - protected function tearDown() - { - unset($this->model); + $this->model = $this->buildModel( + $this->ioObjectMock, + [ + 'factory' => '\Magento\Framework\ObjectManager\Code\Generator\Factory', + 'proxy' => '\Magento\Framework\ObjectManager\Code\Generator\Proxy', + 'interceptor' => '\Magento\Framework\Interception\Code\Generator\Interceptor' + ], + $this->definedClassesMock + ); } public function testGetGeneratedEntities() { - $this->model = new \Magento\Framework\Code\Generator( + $this->model = $this->buildModel( $this->ioObjectMock, - ['factory', 'proxy', 'interceptor'] + ['factory', 'proxy', 'interceptor'], + $this->definedClassesMock ); $this->assertEquals(array_values($this->expectedEntities), $this->model->getGeneratedEntities()); } @@ -65,14 +76,6 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase */ public function testGenerateClass($className, $entityType) { - $this->model = new \Magento\Framework\Code\Generator( - $this->ioObjectMock, - [ - 'factory' => '\Magento\Framework\ObjectManager\Code\Generator\Factory', - 'proxy' => '\Magento\Framework\ObjectManager\Code\Generator\Proxy', - 'interceptor' => '\Magento\Framework\Interception\Code\Generator\Interceptor' - ] - ); $objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface'); $fullClassName = $className . $entityType; $entityGeneratorMock = $this->getMockBuilder('\Magento\Framework\Code\Generator\EntityAbstract') @@ -83,35 +86,8 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase $this->model->generateClass($fullClassName); } - /** - * @dataProvider generateValidClassDataProvider - */ - public function testGenerateClassWithExistName($className, $entityType) - { - $definedClassesMock = $this->getMock('Magento\Framework\Code\Generator\DefinedClasses'); - $definedClassesMock->expects($this->any()) - ->method('isClassLoadableFromDisc') - ->willReturn(true); - $this->model = new \Magento\Framework\Code\Generator( - $this->ioObjectMock, - [ - 'factory' => '\Magento\Framework\ObjectManager\Code\Generator\Factory', - 'proxy' => '\Magento\Framework\ObjectManager\Code\Generator\Proxy', - 'interceptor' => '\Magento\Framework\Interception\Code\Generator\Interceptor' - ], - $definedClassesMock - ); - - $this->assertEquals( - \Magento\Framework\Code\Generator::GENERATION_SKIP, - $this->model->generateClass($className . $entityType) - ); - } - public function testGenerateClassWithWrongName() { - $this->model = new \Magento\Framework\Code\Generator($this->ioObjectMock); - $this->assertEquals( \Magento\Framework\Code\Generator::GENERATION_ERROR, $this->model->generateClass(self::SOURCE_CLASS) @@ -123,15 +99,6 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase */ public function testGenerateClassWithError() { - $this->model = new \Magento\Framework\Code\Generator( - $this->ioObjectMock, - [ - 'factory' => '\Magento\Framework\ObjectManager\Code\Generator\Factory', - 'proxy' => '\Magento\Framework\ObjectManager\Code\Generator\Proxy', - 'interceptor' => '\Magento\Framework\Interception\Code\Generator\Interceptor' - ] - ); - $expectedEntities = array_values($this->expectedEntities); $resultClassName = self::SOURCE_CLASS . ucfirst(array_shift($expectedEntities)); $objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface'); @@ -143,6 +110,32 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase $this->model->generateClass($resultClassName); } + /** + * @dataProvider trueFalseDataProvider + */ + public function testGenerateClassWithExistName($fileExists) + { + $this->definedClassesMock->expects($this->any()) + ->method('isClassLoadableFromDisc') + ->willReturn(true); + + $resultClassFileName = '/Magento/Path/To/Class.php'; + $this->ioObjectMock->expects($this->once())->method('generateResultFileName')->willReturn($resultClassFileName); + $this->ioObjectMock->expects($this->once())->method('fileExists')->willReturn($fileExists); + $includeFileInvokeCount = $fileExists ? 1 : 0; + $this->ioObjectMock->expects($this->exactly($includeFileInvokeCount))->method('includeFile'); + + $this->assertEquals( + \Magento\Framework\Code\Generator::GENERATION_SKIP, + $this->model->generateClass('Magento\GeneratedClass\Factory') + ); + } + + public function trueFalseDataProvider() + { + return [[true], [false]]; + } + /** * Data provider for generate class tests * @@ -160,4 +153,17 @@ class GeneratorTest extends \PHPUnit_Framework_TestCase } return $data; } + + /** + * Build SUT object + * + * @param Io $ioObject + * @param array $generatedEntities + * @param DefinedClasses $definedClasses + * @return Generator + */ + private function buildModel(Io $ioObject, array $generatedEntities, DefinedClasses $definedClasses) + { + return new Generator($ioObject, $generatedEntities, $definedClasses); + } } diff --git a/lib/internal/Magento/Framework/Component/ComponentRegistrar.php b/lib/internal/Magento/Framework/Component/ComponentRegistrar.php index 44258c7f135ce0e122f3a63d6f0fe1fd26737fe4..c2c928b2376efe8589e86741e5fa8d3df1c4966b 100644 --- a/lib/internal/Magento/Framework/Component/ComponentRegistrar.php +++ b/lib/internal/Magento/Framework/Component/ComponentRegistrar.php @@ -48,7 +48,7 @@ class ComponentRegistrar implements ComponentRegistrarInterface if (isset(self::$paths[$type][$componentName])) { throw new \LogicException('\'' . $componentName . '\' component already exists'); } else { - self::$paths[$type][$componentName] = str_replace('\\', '/', $path); + self::$paths[$type][$componentName] = $path; } } diff --git a/lib/internal/Magento/Framework/Config/AbstractXml.php b/lib/internal/Magento/Framework/Config/AbstractXml.php index acdd49eeee201a5dc0bbb336f67255b7f8efad37..abf16d6cd177864b2feddb07d3584812cbef4844 100644 --- a/lib/internal/Magento/Framework/Config/AbstractXml.php +++ b/lib/internal/Magento/Framework/Config/AbstractXml.php @@ -24,14 +24,23 @@ abstract class AbstractXml */ protected $_domConfig = null; + /** + * @var \Magento\Framework\Config\DomFactory + */ + protected $domFactory; + /** * Instantiate with the list of files to merge * * @param array $configFiles + * @param \Magento\Framework\Config\DomFactory $domFactory * @throws \InvalidArgumentException */ - public function __construct($configFiles) - { + public function __construct( + $configFiles, + \Magento\Framework\Config\DomFactory $domFactory + ) { + $this->domFactory = $domFactory; if (empty($configFiles)) { throw new \InvalidArgumentException('There must be at least one configuration file specified.'); } @@ -81,9 +90,7 @@ abstract class AbstractXml ); } } - if ($this->_isRuntimeValidated()) { - $this->_performValidate(); - } + $this->_performValidate(); return $this->_getDomConfigModel()->getDom(); } @@ -96,7 +103,9 @@ abstract class AbstractXml */ protected function _performValidate($file = null) { - if (!$this->_getDomConfigModel()->validate($this->getSchemaFile(), $errors)) { + $errors = []; + $this->_getDomConfigModel()->validate($this->getSchemaFile(), $errors); + if (!empty($errors)) { $phrase = (null === $file) ? new \Magento\Framework\Phrase('Invalid Document %1%2', [PHP_EOL, implode("\n", $errors)]) : new \Magento\Framework\Phrase('Invalid XML-file: %1%2%3', [$file, PHP_EOL, implode("\n", $errors)]); @@ -106,16 +115,6 @@ abstract class AbstractXml return $this; } - /** - * Get if xml files must be runtime validated - * - * @return boolean - */ - protected function _isRuntimeValidated() - { - return true; - } - /** * Get Dom configuration model * @@ -125,13 +124,12 @@ abstract class AbstractXml protected function _getDomConfigModel() { if (null === $this->_domConfig) { - $schemaFile = $this->getPerFileSchemaFile() && - $this->_isRuntimeValidated() ? $this->getPerFileSchemaFile() : null; - $this->_domConfig = new \Magento\Framework\Config\Dom( - $this->_getInitialXml(), - $this->_getIdAttributes(), - null, - $schemaFile + $this->_domConfig = $this->domFactory->createDom( + [ + 'xml' => $this->_getInitialXml(), + 'idAttributes' => $this->_getIdAttributes(), + 'schemaFile' => $this->getPerFileSchemaFile() + ] ); } return $this->_domConfig; diff --git a/lib/internal/Magento/Framework/Config/Dom.php b/lib/internal/Magento/Framework/Config/Dom.php index 4f512fd7820a55cd8a68c754c0877c0d581d0d4a..eddf5c5bd8bb2b6dee271d5c900d8e0f199891d4 100644 --- a/lib/internal/Magento/Framework/Config/Dom.php +++ b/lib/internal/Magento/Framework/Config/Dom.php @@ -30,6 +30,11 @@ class Dom */ const ERROR_FORMAT_DEFAULT = "%message%\nLine: %line%\n"; + /** + * @var \Magento\Framework\Config\ValidationStateInterface + */ + private $validationState; + /** * Dom document * @@ -71,7 +76,7 @@ class Dom protected $rootNamespace; /** - * \Magento\Framework\Config\Dom\UrnResolver + * @var \Magento\Framework\Config\Dom\UrnResolver */ private static $urnResolver; @@ -82,6 +87,7 @@ class Dom * The path to ID attribute name should not include any attribute notations or modifiers -- only node names * * @param string $xml + * @param \Magento\Framework\Config\ValidationStateInterface $validationState * @param array $idAttributes * @param string $typeAttributeName * @param string $schemaFile @@ -89,11 +95,13 @@ class Dom */ public function __construct( $xml, + \Magento\Framework\Config\ValidationStateInterface $validationState, array $idAttributes = [], $typeAttributeName = null, $schemaFile = null, $errorFormat = self::ERROR_FORMAT_DEFAULT ) { + $this->validationState = $validationState; $this->schema = $schemaFile; $this->nodeMergingConfig = new Dom\NodeMergingConfig(new Dom\NodePathMatcher(), $idAttributes); $this->typeAttributeName = $typeAttributeName; @@ -274,11 +282,7 @@ class Dom $schema = self::$urnResolver->getRealPath($schema); libxml_use_internal_errors(true); try { - if (file_exists($schema)) { - $result = $dom->schemaValidate($schema); - } else { - $result = $dom->schemaValidateSource($schema); - } + $result = $dom->schemaValidate($schema); $errors = []; if (!$result) { $validationErrors = libxml_get_errors(); @@ -353,7 +357,7 @@ class Dom { $dom = new \DOMDocument(); $dom->loadXML($xml); - if ($this->schema) { + if ($this->validationState->isValidationRequired() && $this->schema) { $errors = $this->validateDomDocument($dom, $this->schema, $this->errorFormat); if (count($errors)) { throw new \Magento\Framework\Config\Dom\ValidationException(implode("\n", $errors)); @@ -371,8 +375,11 @@ class Dom */ public function validate($schemaFileName, &$errors = []) { - $errors = $this->validateDomDocument($this->dom, $schemaFileName, $this->errorFormat); - return !count($errors); + if ($this->validationState->isValidationRequired()) { + $errors = $this->validateDomDocument($this->dom, $schemaFileName, $this->errorFormat); + return !count($errors); + } + return true; } /** diff --git a/lib/internal/Magento/Framework/Config/DomFactory.php b/lib/internal/Magento/Framework/Config/DomFactory.php index 20be79afd0f4bf0574252ab57ed9349b5340105a..48d000c9e02f3fac1ed97aabf5f4d845b8cc40fe 100644 --- a/lib/internal/Magento/Framework/Config/DomFactory.php +++ b/lib/internal/Magento/Framework/Config/DomFactory.php @@ -24,8 +24,9 @@ class DomFactory * * @param \Magento\Framework\ObjectManagerInterface $objectManger */ - public function __construct(\Magento\Framework\ObjectManagerInterface $objectManger) - { + public function __construct( + \Magento\Framework\ObjectManagerInterface $objectManger + ) { $this->_objectManager = $objectManger; } diff --git a/lib/internal/Magento/Framework/Config/Reader/Filesystem.php b/lib/internal/Magento/Framework/Config/Reader/Filesystem.php index 992158c6edf6341e55f4b7d1a9d2f61589b7122e..bbe3544318f844876775013c825c297af37bb33a 100644 --- a/lib/internal/Magento/Framework/Config/Reader/Filesystem.php +++ b/lib/internal/Magento/Framework/Config/Reader/Filesystem.php @@ -63,11 +63,9 @@ class Filesystem implements \Magento\Framework\Config\ReaderInterface protected $_domDocumentClass; /** - * Should configuration be validated - * - * @var bool + * @var \Magento\Framework\Config\ValidationStateInterface */ - protected $_isValidated; + protected $validationState; /** * Constructor @@ -95,10 +93,10 @@ class Filesystem implements \Magento\Framework\Config\ReaderInterface $this->_converter = $converter; $this->_fileName = $fileName; $this->_idAttributes = array_replace($this->_idAttributes, $idAttributes); + $this->validationState = $validationState; $this->_schemaFile = $schemaLocator->getSchema(); - $this->_isValidated = $validationState->isValidated(); - $this->_perFileSchema = $schemaLocator->getPerFileSchema() && - $this->_isValidated ? $schemaLocator->getPerFileSchema() : null; + $this->_perFileSchema = $schemaLocator->getPerFileSchema() && $validationState->isValidationRequired() + ? $schemaLocator->getPerFileSchema() : null; $this->_domDocumentClass = $domDocumentClass; $this->_defaultScope = $defaultScope; } @@ -145,7 +143,7 @@ class Filesystem implements \Magento\Framework\Config\ReaderInterface ); } } - if ($this->_isValidated) { + if ($this->validationState->isValidationRequired()) { $errors = []; if ($configMerger && !$configMerger->validate($this->_schemaFile, $errors)) { $message = "Invalid Document \n"; @@ -172,7 +170,13 @@ class Filesystem implements \Magento\Framework\Config\ReaderInterface */ protected function _createConfigMerger($mergerClass, $initialContents) { - $result = new $mergerClass($initialContents, $this->_idAttributes, null, $this->_perFileSchema); + $result = new $mergerClass( + $initialContents, + $this->validationState, + $this->_idAttributes, + null, + $this->_perFileSchema + ); if (!$result instanceof \Magento\Framework\Config\Dom) { throw new \UnexpectedValueException( "Instance of the DOM config merger is expected, got {$mergerClass} instead." diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/DomTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/DomTest.php index d759359f4ef03a1b6e8e044cd4350a39636d4d52..abe3ca2a331f407b1e3b504519c564bdf63a4bd2 100644 --- a/lib/internal/Magento/Framework/Config/Test/Unit/DomTest.php +++ b/lib/internal/Magento/Framework/Config/Test/Unit/DomTest.php @@ -7,6 +7,24 @@ namespace Magento\Framework\Config\Test\Unit; class DomTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\Config\ValidationStateInterface + */ + protected $validationStateMock; + + public function setUp() + { + $this->validationStateMock = $this->getMock( + '\Magento\Framework\Config\ValidationStateInterface', + [], + [], + '', + false + ); + $this->validationStateMock->method('isValidationRequired') + ->willReturn(true); + } + /** * @param string $xmlFile * @param string $newXmlFile @@ -19,7 +37,7 @@ class DomTest extends \PHPUnit_Framework_TestCase { $xml = file_get_contents(__DIR__ . "/_files/dom/{$xmlFile}"); $newXml = file_get_contents(__DIR__ . "/_files/dom/{$newXmlFile}"); - $config = new \Magento\Framework\Config\Dom($xml, $ids, $typeAttributeName); + $config = new \Magento\Framework\Config\Dom($xml, $this->validationStateMock, $ids, $typeAttributeName); $config->merge($newXml); $this->assertXmlStringEqualsXmlFile(__DIR__ . "/_files/dom/{$expectedXmlFile}", $config->getDom()->saveXML()); } @@ -87,7 +105,7 @@ class DomTest extends \PHPUnit_Framework_TestCase { $xml = file_get_contents(__DIR__ . "/_files/dom/ambiguous_two.xml"); $newXml = file_get_contents(__DIR__ . "/_files/dom/ambiguous_new_one.xml"); - $config = new \Magento\Framework\Config\Dom($xml); + $config = new \Magento\Framework\Config\Dom($xml, $this->validationStateMock); $config->merge($newXml); } @@ -98,7 +116,7 @@ class DomTest extends \PHPUnit_Framework_TestCase */ public function testValidate($xml, array $expectedErrors) { - $dom = new \Magento\Framework\Config\Dom($xml); + $dom = new \Magento\Framework\Config\Dom($xml, $this->validationStateMock); $actualResult = $dom->validate(__DIR__ . '/_files/sample.xsd', $actualErrors); $this->assertEquals(empty($expectedErrors), $actualResult); $this->assertEquals($expectedErrors, $actualErrors); @@ -125,7 +143,7 @@ class DomTest extends \PHPUnit_Framework_TestCase $expectedErrors = [ "Error: `Element 'unknown_node': This element is not expected. Expected is ( node ).`", ]; - $dom = new \Magento\Framework\Config\Dom($xml, [], null, null, $errorFormat); + $dom = new \Magento\Framework\Config\Dom($xml, $this->validationStateMock, [], null, null, $errorFormat); $actualResult = $dom->validate(__DIR__ . '/_files/sample.xsd', $actualErrors); $this->assertFalse($actualResult); $this->assertEquals($expectedErrors, $actualErrors); @@ -139,7 +157,7 @@ class DomTest extends \PHPUnit_Framework_TestCase { $xml = '<root><unknown_node/></root>'; $errorFormat = '%message%,%unknown%'; - $dom = new \Magento\Framework\Config\Dom($xml, [], null, null, $errorFormat); + $dom = new \Magento\Framework\Config\Dom($xml, $this->validationStateMock, [], null, null, $errorFormat); $dom->validate(__DIR__ . '/_files/sample.xsd'); } @@ -147,7 +165,7 @@ class DomTest extends \PHPUnit_Framework_TestCase { $xml = '<root><node id="id1"/><node id="id2"/></root>'; $schemaFile = __DIR__ . '/_files/sample.xsd'; - $dom = new \Magento\Framework\Config\Dom($xml); + $dom = new \Magento\Framework\Config\Dom($xml, $this->validationStateMock); $domMock = $this->getMock('DOMDocument', ['schemaValidate'], []); $domMock->expects($this->once()) ->method('schemaValidate') diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/Reader/FilesystemTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/Reader/FilesystemTest.php index 57e7a97d57350593e013a52f1f9f8383b5922791..7f83867d8275ccb0d5d7dab53a3b251381f2550f 100644 --- a/lib/internal/Magento/Framework/Config/Test/Unit/Reader/FilesystemTest.php +++ b/lib/internal/Magento/Framework/Config/Test/Unit/Reader/FilesystemTest.php @@ -104,7 +104,9 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->urnResolver->getRealPath('urn:magento:framework:Config/Test/Unit/_files/reader/schema.xsd') ) ); - $this->_validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $this->_validationStateMock->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(true); $model = new Filesystem( $this->_fileResolverMock, $this->_converterMock, @@ -133,7 +135,9 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->urnResolver->getRealPath('urn:magento:framework:Config/Test/Unit/_files/reader/schema.xsd') ) ); - $this->_validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true)); + $this->_validationStateMock->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(true); $model = new Filesystem( $this->_fileResolverMock, diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/ValidationStateTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/ValidationStateTest.php index 9e0cf08004e9a459c437216cd39bbe0088b38126..6026273c1fc9c2cd27a51a20e2260515d6085fd8 100644 --- a/lib/internal/Magento/Framework/Config/Test/Unit/ValidationStateTest.php +++ b/lib/internal/Magento/Framework/Config/Test/Unit/ValidationStateTest.php @@ -10,18 +10,18 @@ class ValidationStateTest extends \PHPUnit_Framework_TestCase /** * @param string $appMode * @param boolean $expectedResult - * @dataProvider isValidatedDataProvider + * @dataProvider isValidationRequiredDataProvider */ - public function testIsValidated($appMode, $expectedResult) + public function testIsValidationRequired($appMode, $expectedResult) { $model = new \Magento\Framework\App\Arguments\ValidationState($appMode); - $this->assertEquals($model->isValidated(), $expectedResult); + $this->assertEquals($model->isValidationRequired(), $expectedResult); } /** * @return array */ - public function isValidatedDataProvider() + public function isValidationRequiredDataProvider() { return [ [\Magento\Framework\App\State::MODE_DEVELOPER, true], diff --git a/lib/internal/Magento/Framework/Config/ValidationStateInterface.php b/lib/internal/Magento/Framework/Config/ValidationStateInterface.php index 61f39fb67cc765b8cc331a43bf5d3619ef2a4697..1ad9f7b167931bbcd14d52035545605db6387091 100644 --- a/lib/internal/Magento/Framework/Config/ValidationStateInterface.php +++ b/lib/internal/Magento/Framework/Config/ValidationStateInterface.php @@ -17,5 +17,5 @@ interface ValidationStateInterface * * @return boolean */ - public function isValidated(); + public function isValidationRequired(); } diff --git a/lib/internal/Magento/Framework/Config/View.php b/lib/internal/Magento/Framework/Config/View.php index 98a9614018816622d915ab5f10522ba88751ee83..dc8a0c15df0ad1ddf5264bf9f1daaa90e9cd8bf6 100644 --- a/lib/internal/Magento/Framework/Config/View.php +++ b/lib/internal/Magento/Framework/Config/View.php @@ -10,7 +10,6 @@ namespace Magento\Framework\Config; use Magento\Framework\Config\Dom\UrnResolver; -use Magento\Framework\View\Xsd\Reader; use Magento\Framework\View\Xsd\Media\TypeDataExtractorPool; class View extends \Magento\Framework\Config\AbstractXml @@ -28,21 +27,16 @@ class View extends \Magento\Framework\Config\AbstractXml */ protected $xpath; - /** - * @var Reader - */ - private $xsdReader; - /** * @param array $configFiles - * @param Reader $xsdReader + * @param DomFactory $domFactory * @param UrnResolver $urnResolver * @param TypeDataExtractorPool $extractorPool * @param array $xpath */ public function __construct( $configFiles, - Reader $xsdReader, + DomFactory $domFactory, UrnResolver $urnResolver, TypeDataExtractorPool $extractorPool, $xpath = [] @@ -50,19 +44,17 @@ class View extends \Magento\Framework\Config\AbstractXml $this->xpath = $xpath; $this->extractorPool = $extractorPool; $this->urnResolver = $urnResolver; - $this->xsdReader = $xsdReader; - parent::__construct($configFiles); + parent::__construct($configFiles, $domFactory); } - + /** - * Merged file view.xsd + * Path to view.xsd * * @return string */ public function getSchemaFile() { - $configXsd = $this->xsdReader->read(); - return $configXsd; + return $this->urnResolver->getRealPath('urn:magento:framework:Config/etc/view.xsd'); } /** @@ -97,7 +89,7 @@ class View extends \Magento\Framework\Config\AbstractXml $mediaNode, $childNode->tagName ); - $result = array_merge($result, $mediaNodesArray); + $result = array_merge_recursive($result, $mediaNodesArray); } } break; diff --git a/lib/internal/Magento/Framework/Config/etc/view.xsd b/lib/internal/Magento/Framework/Config/etc/view.xsd index 1ded09402a6b0f999dbd24c2bfefa599bd012d72..060ec8b9fe6273870deea84b8dd9b87dab0f6d10 100644 --- a/lib/internal/Magento/Framework/Config/etc/view.xsd +++ b/lib/internal/Magento/Framework/Config/etc/view.xsd @@ -38,8 +38,74 @@ <xs:attribute name="value" type="xs:string"/> </xs:complexType> <xs:complexType name="mediaType" mixed="true"> - <xs:all /> + <xs:all> + <xs:element name="images" type="imageType" minOccurs="0"/> + <xs:element name="videos" type="videoType" minOccurs="0"/> + </xs:all> </xs:complexType> + + <xs:complexType name="imageType"> + <xs:sequence> + <xs:element name="image" minOccurs="1" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="width" type="xs:positiveInteger" minOccurs="0"/> + <xs:element name="height" type="xs:positiveInteger" minOccurs="0"/> + <xs:element name="constrain" type="xs:boolean" minOccurs="0"/> + <xs:element name="aspect_ratio" type="xs:boolean" minOccurs="0"/> + <xs:element name="frame" type="xs:boolean" minOccurs="0"/> + <xs:element name="transparency" type="xs:boolean" minOccurs="0"/> + <xs:element name="background" minOccurs="0"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:pattern value="\[(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\]"/> + </xs:restriction> + </xs:simpleType> + </xs:element> + </xs:sequence> + <xs:attribute name="id" type="xs:string" use="required"/> + <xs:attribute name="type"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="thumbnail"/> + <xs:enumeration value="small_image"/> + <xs:enumeration value="image"/> + <xs:enumeration value="swatch_image"/> + <xs:enumeration value="swatch_thumb"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="module" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="videoType"> + <xs:sequence> + <xs:element name="video" minOccurs="1" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="play_if_base" type="xs:boolean" minOccurs="0"/> + <xs:element name="show_related" type="xs:boolean" minOccurs="0"/> + <xs:element name="video_auto_restart" type="xs:boolean" minOccurs="0"/> + </xs:sequence> + <xs:attribute name="id" type="xs:string" use="required"/> + <xs:attribute name="type" use="required"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="play_if_base"/> + <xs:enumeration value="show_related"/> + <xs:enumeration value="video_auto_restart"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="module" type="xs:string" use="required"/> + </xs:complexType> + <xs:complexType name="excludeType"> <xs:sequence> <xs:element name="item" type="itemType" maxOccurs="unbounded"/> diff --git a/lib/internal/Magento/Framework/Console/Cli.php b/lib/internal/Magento/Framework/Console/Cli.php index 786a658b7e9ac92ed945aab9a7719a1e03ad1788..56b792bf85b8f38f94684e984cde234a3bcc746c 100644 --- a/lib/internal/Magento/Framework/Console/Cli.php +++ b/lib/internal/Magento/Framework/Console/Cli.php @@ -6,9 +6,11 @@ namespace Magento\Framework\Console; +use Magento\Framework\Filesystem\Driver\File; use Symfony\Component\Console\Application as SymfonyApplication; use Magento\Framework\App\Bootstrap; use Magento\Framework\Shell\ComplexParameter; +use Symfony\Component\Console\Input\ArgvInput; /** * Magento2 CLI Application. This is the hood for all command line tools supported by Magento. @@ -22,6 +24,28 @@ class Cli extends SymfonyApplication */ const INPUT_KEY_BOOTSTRAP = 'bootstrap'; + /** @var \Zend\ServiceManager\ServiceManager */ + private $serviceManager; + + /** + * @param string $name The name of the application + * @param string $version The version of the application + */ + public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN') + { + $this->serviceManager = \Zend\Mvc\Application::init(require BP . '/setup/config/application.config.php') + ->getServiceManager(); + /** + * Temporary workaround until the compiler is able to clear the generation directory. (MAGETWO-44493) + */ + if (class_exists('Magento\Setup\Console\CompilerPreparation')) { + (new \Magento\Setup\Console\CompilerPreparation($this->serviceManager, new ArgvInput(), new File())) + ->handleCompilerEnvironment(); + } + + parent::__construct($name, $version); + } + /** * {@inheritdoc} */ @@ -45,14 +69,12 @@ class Cli extends SymfonyApplication $params[Bootstrap::PARAM_REQUIRE_MAINTENANCE] = null; $bootstrap = Bootstrap::create(BP, $params); $objectManager = $bootstrap->getObjectManager(); - $serviceManager = \Zend\Mvc\Application::init(require BP . '/setup/config/application.config.php') - ->getServiceManager(); /** @var \Magento\Setup\Model\ObjectManagerProvider $omProvider */ - $omProvider = $serviceManager->get('Magento\Setup\Model\ObjectManagerProvider'); + $omProvider = $this->serviceManager->get('Magento\Setup\Model\ObjectManagerProvider'); $omProvider->setObjectManager($objectManager); if (class_exists('Magento\Setup\Console\CommandList')) { - $setupCommandList = new \Magento\Setup\Console\CommandList($serviceManager); + $setupCommandList = new \Magento\Setup\Console\CommandList($this->serviceManager); $setupCommands = $setupCommandList->getCommands(); } diff --git a/lib/internal/Magento/Framework/Controller/Index/Index.php b/lib/internal/Magento/Framework/Controller/Index/Index.php index bc8b9d70810a6fa660f8868044c344c02ea41c0e..ad0c9a85ba6e1746af8031a81dffbb954b8c609e 100644 --- a/lib/internal/Magento/Framework/Controller/Index/Index.php +++ b/lib/internal/Magento/Framework/Controller/Index/Index.php @@ -11,7 +11,7 @@ class Index extends \Magento\Framework\App\Action\Action /** * @return void */ - public function execute() + public function executeInternal() { } } diff --git a/lib/internal/Magento/Framework/Controller/Noroute/Index.php b/lib/internal/Magento/Framework/Controller/Noroute/Index.php index 34154715366e5f3489c61f7b196d9a23c8ae7fda..cce6f4671f9b491b44a1242712846a8fc6bf0ca1 100644 --- a/lib/internal/Magento/Framework/Controller/Noroute/Index.php +++ b/lib/internal/Magento/Framework/Controller/Noroute/Index.php @@ -13,7 +13,7 @@ class Index extends \Magento\Framework\App\Action\Action * * @return void */ - public function execute() + public function executeInternal() { $status = $this->getRequest()->getParam('__status__'); if (!$status instanceof \Magento\Framework\DataObject) { diff --git a/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/Index/IndexTest.php b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/Index/IndexTest.php index aac2c071fb0a4322ed0437bd84ac3efc4046f8a9..b1a3be4984b4d5fb5f5e9283bbe2b98bfbc6993d 100644 --- a/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/Index/IndexTest.php +++ b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/Index/IndexTest.php @@ -9,7 +9,7 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class IndexTest extends \PHPUnit_Framework_TestCase { - public function testExecute() + public function testExecuteInternal() { $objectManager = new ObjectManager($this); /** @@ -19,6 +19,6 @@ class IndexTest extends \PHPUnit_Framework_TestCase // The execute method is empty and returns void, just calling to verify // the method exists and does not throw an exception - $controller->execute(); + $controller->executeInternal(); } } diff --git a/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/NorouteTest.php b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/NorouteTest.php index eabedc51f1b871ec8973ffdd0dc7e10dd061b0dc..1ad67c8f366161ff925a004f93752f58ee025b9c 100644 --- a/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/NorouteTest.php +++ b/lib/internal/Magento/Framework/Controller/Test/Unit/Controller/NorouteTest.php @@ -8,7 +8,7 @@ namespace Magento\Framework\Controller\Test\Unit\Controller; class NorouteTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Framework\Controller\Noroute + * @var \Magento\Framework\Controller\Noroute\Index */ protected $_controller; @@ -53,7 +53,7 @@ class NorouteTest extends \PHPUnit_Framework_TestCase $this->_statusMock->expects($this->any())->method('getLoaded')->will($this->returnValue(false)); $this->_viewMock->expects($this->once())->method('loadLayout')->with(['default', 'noroute']); $this->_viewMock->expects($this->once())->method('renderLayout'); - $this->_controller->execute(); + $this->_controller->executeInternal(); } public function testIndexActionWhenStatusLoaded() @@ -77,7 +77,7 @@ class NorouteTest extends \PHPUnit_Framework_TestCase )->will( $this->returnValue($this->_requestMock) ); - $this->_controller->execute(); + $this->_controller->executeInternal(); } public function testIndexActionWhenStatusNotInstanceofMagentoObject() @@ -91,6 +91,6 @@ class NorouteTest extends \PHPUnit_Framework_TestCase )->will( $this->returnValue('string') ); - $this->_controller->execute(); + $this->_controller->executeInternal(); } } diff --git a/lib/internal/Magento/Framework/Filesystem/Io/File.php b/lib/internal/Magento/Framework/Filesystem/Io/File.php index b504f54b173be7da7a76c535bea71fc96d6d93be..875f960126dd01c499683d0a4744fb0b2c3773ec 100644 --- a/lib/internal/Magento/Framework/Filesystem/Io/File.php +++ b/lib/internal/Magento/Framework/Filesystem/Io/File.php @@ -463,12 +463,12 @@ class File extends AbstractIo if (file_exists($filename)) { if (!is_writeable($filename)) { - printf('File %s don\'t writeable', $filename); + printf('The file %s is not writable', $filename); return false; } } else { if (!is_writable(dirname($filename))) { - printf('Folder %s don\'t writeable', dirname($filename)); + printf('The directory %s is not writable', dirname($filename)); return false; } } diff --git a/lib/internal/Magento/Framework/Indexer/Test/Unit/Config/ReaderTest.php b/lib/internal/Magento/Framework/Indexer/Test/Unit/Config/ReaderTest.php index 54f09ad61288082e6efb53e31faaab607ad67225..bff3d9e5264cdf3087b79c3fb16a2bf5cdf583ed 100644 --- a/lib/internal/Magento/Framework/Indexer/Test/Unit/Config/ReaderTest.php +++ b/lib/internal/Magento/Framework/Indexer/Test/Unit/Config/ReaderTest.php @@ -34,7 +34,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->_converter = $this->getMock('Magento\Framework\Indexer\Config\Converter', ['convert']); $validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationState->expects($this->once())->method('isValidated')->will($this->returnValue(false)); + $validationState->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(false); $this->_model = new \Magento\Framework\Indexer\Config\Reader( $this->_fileResolverMock, diff --git a/lib/internal/Magento/Framework/Interception/Config/Config.php b/lib/internal/Magento/Framework/Interception/Config/Config.php index 7c9ede12daf5cb4dbee6fe24f16d28c68bd0fd0e..43be5547c46a49b9768c5aa4cf7ea52722a24a9a 100644 --- a/lib/internal/Magento/Framework/Interception/Config/Config.php +++ b/lib/internal/Magento/Framework/Interception/Config/Config.php @@ -63,7 +63,7 @@ class Config implements \Magento\Framework\Interception\ConfigInterface * * @var array */ - protected $_serviceClassTypes = ['Proxy', 'Interceptor']; + protected $_serviceClassTypes = ['Interceptor']; /** * @var \Magento\Framework\Config\ScopeListInterface diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/InterceptorTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/InterceptorTest.php index 78f5759d9fa77707de1e1c1bb1cf39b5c4596fdc..97f1ff1b368d56130f72c8c61790f6e8e2a42f20 100644 --- a/lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/InterceptorTest.php +++ b/lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/InterceptorTest.php @@ -56,7 +56,7 @@ class InterceptorTest extends \PHPUnit_Framework_TestCase $this->classGeneratorMock->expects($this->once())->method('generate') ->will($this->returnValue('source code example')); $model->expects($this->once())->method('_validateData')->will($this->returnValue(true)); - $this->ioObjectMock->expects($this->any())->method('getResultFileName')->with('Exception_Interceptor'); + $this->ioObjectMock->expects($this->any())->method('generateResultFileName')->with('Exception_Interceptor'); $this->assertEquals('', $model->generate()); } } diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php index 6c12758905634c325153a2b588ee72d08c5ad108..b2bcba673e2a7c2d79a3a55bb7a17b1ded46ab25 100644 --- a/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php +++ b/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php @@ -102,6 +102,10 @@ class ConfigTest extends \PHPUnit_Framework_TestCase 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Enhanced', 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Enhanced', ], + [ + 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Proxy', + 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Proxy', + ], [ 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemProxy', 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemProxy', @@ -151,6 +155,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item' => true, 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item\Enhanced' => true, 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Enhanced' => true, + 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Proxy' => true, 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemProxy' => false, 'virtual_custom_item' => true, ]; @@ -195,7 +200,13 @@ class ConfigTest extends \PHPUnit_Framework_TestCase [ // the following model has only inherited plugins true, - 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Enhanced', + 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Proxy', + ['Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer'], + ], + [ + // the following model has only inherited plugins + true, + 'Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer\Proxy', ['Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer'], ], [ diff --git a/lib/internal/Magento/Framework/Module/DependencyChecker.php b/lib/internal/Magento/Framework/Module/DependencyChecker.php index 44f771fb6ca2083bb7363542cb11d2e2488d318a..71c811daf3c46c390e34299dd82647e052ddf8a9 100644 --- a/lib/internal/Magento/Framework/Module/DependencyChecker.php +++ b/lib/internal/Magento/Framework/Module/DependencyChecker.php @@ -33,6 +33,11 @@ class DependencyChecker */ private $graph; + /** + * @var PackageInfo + */ + protected $packageInfo; + /** * Constructor * @@ -44,8 +49,8 @@ class DependencyChecker { $this->enabledModuleList = $list->getNames(); $this->fullModuleList = $loader->load(); - $packageInfo = $packageInfoFactory->create(); - $this->graph = $this->createGraph($packageInfo); + $this->packageInfo = $packageInfoFactory->create(); + $this->graph = $this->createGraph(); } /** @@ -93,7 +98,11 @@ class DependencyChecker foreach ($moduleNames as $moduleName) { $dependenciesMissing = []; $paths = $this->graph->findPathsToReachableNodes($moduleName, $graphMode); - foreach (array_keys($this->fullModuleList) as $module) { + $modules = array_merge( + array_keys($this->fullModuleList), + $this->packageInfo->getNonExistingDependencies() + ); + foreach ($modules as $module) { if (isset($paths[$module])) { if ($isEnable && !in_array($module, $enabledModules)) { $dependenciesMissing[$module] = $paths[$module]; @@ -110,10 +119,9 @@ class DependencyChecker /** * Create the dependency graph * - * @param PackageInfo $packageInfo * @return Graph */ - private function createGraph(PackageInfo $packageInfo) + private function createGraph() { $nodes = []; $dependencies = []; @@ -121,13 +129,15 @@ class DependencyChecker // build the graph data foreach (array_keys($this->fullModuleList) as $moduleName) { $nodes[] = $moduleName; - foreach ($packageInfo->getRequire($moduleName) as $dependModuleName) { + foreach ($this->packageInfo->getRequire($moduleName) as $dependModuleName) { if ($dependModuleName) { $dependencies[] = [$moduleName, $dependModuleName]; } } } - $nodes = array_unique($nodes); + $nodes = array_unique( + array_merge($nodes, $this->packageInfo->getNonExistingDependencies()) + ); return new Graph($nodes, $dependencies); } diff --git a/lib/internal/Magento/Framework/Module/PackageInfo.php b/lib/internal/Magento/Framework/Module/PackageInfo.php index 97fd828c36d6c3f0540ff8d37808fa172c5f5213..1e2ed5064c8e69bb067e82ae2173ef01b5e1f59a 100644 --- a/lib/internal/Magento/Framework/Module/PackageInfo.php +++ b/lib/internal/Magento/Framework/Module/PackageInfo.php @@ -53,6 +53,11 @@ class PackageInfo */ private $componentRegistrar; + /** + * @var array + */ + protected $nonExistingDependencies = []; + /** * Constructor * @@ -104,7 +109,65 @@ class PackageInfo public function getModuleName($packageName) { $this->load(); - return isset($this->packageModuleMap[$packageName]) ? $this->packageModuleMap[$packageName] : ''; + + $moduleName = null; + if (isset($this->packageModuleMap[$packageName])) { + $moduleName = $this->packageModuleMap[$packageName]; + } elseif ($this->isMagentoPackage($packageName)) { + $moduleName = $this->convertPackageNameToModuleName($packageName); + $this->addNonExistingDependency($moduleName); + } + + return $moduleName; + } + + /** + * Add non existing dependency + * + * @param string $dependency + * @return void + */ + protected function addNonExistingDependency($dependency) + { + if (!isset($this->nonExistingDependencies[$dependency])) { + $this->nonExistingDependencies[$dependency] = $dependency; + } + } + + /** + * Return list of non existing dependencies + * + * @return array + */ + public function getNonExistingDependencies() + { + return $this->nonExistingDependencies; + } + + /** + * Build module name based on internal package name + * + * @param string $packageName + * @return string|null + */ + protected function convertPackageNameToModuleName($packageName) + { + $moduleName = str_replace('magento/module-', '', $packageName); + $moduleName = str_replace('-', ' ', $moduleName); + $moduleName = str_replace(' ', '', ucwords($moduleName)); + + return 'Magento_' . $moduleName; + } + + /** + * Check if package is internal magento module + * + * @param string $packageName + * @return bool + */ + protected function isMagentoPackage($packageName) + { + return strpos($packageName, 'magento/module-') === 0; } /** diff --git a/lib/internal/Magento/Framework/Module/Test/Unit/DependencyCheckerTest.php b/lib/internal/Magento/Framework/Module/Test/Unit/DependencyCheckerTest.php index eb09d4a41ac3bfdfae6e5d06cf44bfba8444b62a..0d7774d8ddad8fef157ddfc18fdf865d1ecd76c9 100644 --- a/lib/internal/Magento/Framework/Module/Test/Unit/DependencyCheckerTest.php +++ b/lib/internal/Magento/Framework/Module/Test/Unit/DependencyCheckerTest.php @@ -70,10 +70,12 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase public function testCheckDependenciesWhenDisableModules() { - $this->listMock - ->expects($this->any()) + $this->listMock->expects($this->any()) ->method('getNames') ->will($this->returnValue(['A', 'B', 'C', 'D', 'E'])); + $this->packageInfoMock->expects($this->atLeastOnce()) + ->method('getNonExistingDependencies') + ->willReturn([]); $this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock); $actual = $this->checker->checkDependenciesWhenDisableModules(['B', 'D']); @@ -83,6 +85,9 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase public function testCheckDependenciesWhenDisableModulesWithCurEnabledModules() { + $this->packageInfoMock->expects($this->atLeastOnce()) + ->method('getNonExistingDependencies') + ->willReturn([]); $this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock); $actual = $this->checker->checkDependenciesWhenDisableModules(['B', 'D'], ['C', 'D', 'E']); @@ -92,10 +97,12 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase public function testCheckDependenciesWhenEnableModules() { - $this->listMock - ->expects($this->any()) + $this->listMock->expects($this->any()) ->method('getNames') ->will($this->returnValue(['C'])); + $this->packageInfoMock->expects($this->atLeastOnce()) + ->method('getNonExistingDependencies') + ->willReturn([]); $this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock); $actual = $this->checker->checkDependenciesWhenEnableModules(['B', 'D']); $expected = [ @@ -107,6 +114,9 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase public function testCheckDependenciesWhenEnableModulesWithCurEnabledModules() { + $this->packageInfoMock->expects($this->atLeastOnce()) + ->method('getNonExistingDependencies') + ->willReturn([]); $this->checker = new DependencyChecker($this->listMock, $this->loaderMock, $this->packageInfoFactoryMock); $actual = $this->checker->checkDependenciesWhenEnableModules(['B', 'D'], ['C']); $expected = [ diff --git a/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php b/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php index 8a2512c485fd1f1d98cb02ab45019ebd9f3e4c43..4328b62c0c6ce30ee72ed23e5a9477f7f39b4859 100644 --- a/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php +++ b/lib/internal/Magento/Framework/Module/Test/Unit/PackageInfoTest.php @@ -57,6 +57,11 @@ class PackageInfoTest extends \PHPUnit_Framework_TestCase $this->assertEquals('C', $this->packageInfo->getModuleName('c')); $this->assertEquals('D', $this->packageInfo->getModuleName('d')); $this->assertEquals('E', $this->packageInfo->getModuleName('e')); + $this->assertEquals( + 'Magento_TestModuleName', + $this->packageInfo->getModuleName('magento/module-test-module-name') + ); + $this->assertArrayHasKey('Magento_TestModuleName', $this->packageInfo->getNonExistingDependencies()); } public function testGetPackageName() diff --git a/lib/internal/Magento/Framework/Mview/Test/Unit/Config/ReaderTest.php b/lib/internal/Magento/Framework/Mview/Test/Unit/Config/ReaderTest.php index ced986821731c37c8b976d6a7d52b996e56f29a7..5f2bf50dac3a901e5115aed8340db924114eb347 100644 --- a/lib/internal/Magento/Framework/Mview/Test/Unit/Config/ReaderTest.php +++ b/lib/internal/Magento/Framework/Mview/Test/Unit/Config/ReaderTest.php @@ -44,7 +44,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $schemaLocator = new \Magento\Framework\Mview\Config\SchemaLocator($urnResolverMock); $validationState = $this->getMock('Magento\Framework\Config\ValidationStateInterface'); - $validationState->expects($this->once())->method('isValidated')->will($this->returnValue(false)); + $validationState->expects($this->any()) + ->method('isValidationRequired') + ->willReturn(false); $this->_model = new \Magento\Framework\Mview\Config\Reader( $this->_fileResolverMock, diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php index 496ba2e8d173a62d6fbc89560d3925af7ff43234..6922234a56df3321cbbb4aba73a12acf97b9c072 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php +++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php @@ -467,20 +467,20 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract { $body = "\$collection = \$this->" . $this->_getSourceCollectionFactoryPropertyName() . "->create();\n" . "\$this->extensionAttributesJoinProcessor->process(\$collection);\n" - . "foreach (\$criteria->getFilterGroups() as \$filterGroup) {\n" + . "foreach (\$searchCriteria->getFilterGroups() as \$filterGroup) {\n" . " foreach (\$filterGroup->getFilters() as \$filter) {\n" . " \$condition = \$filter->getConditionType() ? \$filter->getConditionType() : 'eq';\n" . " \$collection->addFieldToFilter(\$filter->getField(), [\$condition => \$filter->getValue()]);\n" . " }\n" . "}\n" - . "\$collection->setCurPage(\$criteria->getCurrentPage());\n" - . "\$collection->setPageSize(\$criteria->getPageSize());\n" + . "\$collection->setCurPage(\$searchCriteria->getCurrentPage());\n" + . "\$collection->setPageSize(\$searchCriteria->getPageSize());\n" . "return \$collection;\n"; return [ 'name' => 'getList', 'parameters' => [ [ - 'name' => 'criteria', + 'name' => 'searchCriteria', 'type' => self::SEARCH_CRITERIA, ], ], @@ -490,7 +490,7 @@ class Repository extends \Magento\Framework\Code\Generator\EntityAbstract 'tags' => [ [ 'name' => 'param', - 'description' => self::SEARCH_CRITERIA . ' $criteria', + 'description' => self::SEARCH_CRITERIA . ' $searchCriteria', ], [ 'name' => 'return', diff --git a/lib/internal/Magento/Framework/ObjectManager/Config/Reader/Dom.php b/lib/internal/Magento/Framework/ObjectManager/Config/Reader/Dom.php index 2da29257ff905802fca84dcb8dd12aa424c223de..8203e4a562d42affde5d1bc13acdce3d910afdf0 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Config/Reader/Dom.php +++ b/lib/internal/Magento/Framework/ObjectManager/Config/Reader/Dom.php @@ -62,6 +62,12 @@ class Dom extends \Magento\Framework\Config\Reader\Filesystem */ protected function _createConfigMerger($mergerClass, $initialContents) { - return new $mergerClass($initialContents, $this->_idAttributes, self::TYPE_ATTRIBUTE, $this->_perFileSchema); + return new $mergerClass( + $initialContents, + $this->validationState, + $this->_idAttributes, + self::TYPE_ATTRIBUTE, + $this->_perFileSchema + ); } } diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ConverterTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ConverterTest.php index 10bafa24672ad8ed72d942d6de81262d8f2434e8..8578107b4cf70fffe960aa52b2b9d11e9bf07070 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ConverterTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ConverterTest.php @@ -105,7 +105,7 @@ class ConverterTest extends \PHPUnit_Framework_TestCase //Mocking generation $this->ioObjectMock->expects($this->any()) - ->method('getResultFileName') + ->method('generateResultFileName') ->with(self::RESULT_CLASS_NAME) ->will($this->returnValue($resultFileName)); $this->ioObjectMock->expects($this->once()) diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/FactoryTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/FactoryTest.php index 80d63e0133df7c7f29651628d1e4285bd1748880..3a477ec43a52c4b6a56fcc4235554fdd8585288e 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/FactoryTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/FactoryTest.php @@ -34,7 +34,7 @@ class FactoryTest extends \PHPUnit_Framework_TestCase ] ); - $this->ioObjectMock->expects($this->once())->method('getResultFileName') + $this->ioObjectMock->expects($this->once())->method('generateResultFileName') ->with('\Magento\Framework\ObjectManager\Code\Generator\SampleFactory') ->will($this->returnValue('sample_file.php')); $factoryCode = file_get_contents(__DIR__ . '/_files/SampleFactory.txt'); diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php index a2744ca17becda4478dff35173d9982b33ba2ae3..27cea41af83218ebb2810b1763e897ab1d1710c7 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/GenerateRepositoryTest.php @@ -54,7 +54,7 @@ class GenerateRepositoryTest extends \PHPUnit_Framework_TestCase ); $this->ioObjectMock->expects($this->once()) - ->method('getResultFileName') + ->method('generateResultFileName') ->with('\Magento\Framework\ObjectManager\Code\Generator\SampleRepository') ->willReturn('SampleRepository.php'); diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ProxyTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ProxyTest.php index 4fb66556991ccaec70b2e361094db556448a3e23..7eb9795742d1f7ce96b369e8c057e7d15b1d540e 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ProxyTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/ProxyTest.php @@ -34,7 +34,7 @@ class ProxyTest extends \PHPUnit_Framework_TestCase ); $sampleProxyCode = file_get_contents(__DIR__ . '/_files/SampleProxy.txt'); - $this->ioObjectMock->expects($this->once())->method('getResultFileName') + $this->ioObjectMock->expects($this->once())->method('generateResultFileName') ->with('\Magento\Framework\ObjectManager\Code\Generator\Sample_Proxy') ->will($this->returnValue('sample_file.php')); $this->ioObjectMock->expects($this->once())->method('writeResultFile') diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt index d135ca64dd1fccfc3382920cd9d3a6d02daa6750..803d9828cf54dd50d5fcf56752d61d9f0937103f 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Code/Generator/_files/SampleRepository.txt @@ -103,21 +103,21 @@ class SampleRepository implements \Magento\Framework\ObjectManager\Code\Generato /** * Find entities by criteria * - * @param \Magento\Framework\Api\SearchCriteria $criteria + * @param \Magento\Framework\Api\SearchCriteria $searchCriteria * @return \Magento\Framework\ObjectManager\Code\Generator\SampleInterface[] */ - public function getList(\Magento\Framework\Api\SearchCriteria $criteria) + public function getList(\Magento\Framework\Api\SearchCriteria $searchCriteria) { $collection = $this->sampleInterfaceSearchResultFactory->create(); $this->extensionAttributesJoinProcessor->process($collection); - foreach ($criteria->getFilterGroups() as $filterGroup) { + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]); } } - $collection->setCurPage($criteria->getCurrentPage()); - $collection->setPageSize($criteria->getPageSize()); + $collection->setCurPage($searchCriteria->getCurrentPage()); + $collection->setPageSize($searchCriteria->getPageSize()); return $collection; } diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Reader/_files/ConfigDomMock.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Reader/_files/ConfigDomMock.php index 492fbab7633205c23ebd1afb384bbc7492a2af9e..fffc1776bb0d97abbe6edbebdc1d165b1925d32f 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Reader/_files/ConfigDomMock.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/Reader/_files/ConfigDomMock.php @@ -15,7 +15,7 @@ class ConfigDomMock extends \PHPUnit_Framework_TestCase * @param $perFileSchema * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function __construct($initialContents, $idAttributes, $typeAttribute, $perFileSchema) + public function __construct($initialContents, $validationState, $idAttributes, $typeAttribute, $perFileSchema) { $this->assertEquals('first content item', $initialContents); $this->assertEquals('xsi:type', $typeAttribute); diff --git a/lib/internal/Magento/Framework/Pricing/Adjustment/Calculator.php b/lib/internal/Magento/Framework/Pricing/Adjustment/Calculator.php index cf7e2eda9be1d2ec37872b965d42ada8f75e6dbe..6140e7c2581be6d5ea2dbd15be8e352ec0eeb773 100644 --- a/lib/internal/Magento/Framework/Pricing/Adjustment/Calculator.php +++ b/lib/internal/Magento/Framework/Pricing/Adjustment/Calculator.php @@ -40,6 +40,7 @@ class Calculator implements CalculatorInterface public function getAmount($amount, SaleableInterface $saleableItem, $exclude = null, $context = []) { $baseAmount = $fullAmount = $amount; + $previousAdjustments = 0; $adjustments = []; foreach ($saleableItem->getPriceInfo()->getAdjustments() as $adjustment) { $code = $adjustment->getAdjustmentCode(); @@ -51,7 +52,7 @@ class Calculator implements CalculatorInterface $adjust = $adjustment->extractAdjustment($baseAmount, $saleableItem, $context); $baseAmount -= $adjust; $fullAmount = $adjustment->applyAdjustment($fullAmount, $saleableItem, $context); - $adjust = $fullAmount - $baseAmount; + $adjust = $fullAmount - $baseAmount - $previousAdjustments; if (!$toExclude) { $adjustments[$code] = $adjust; } @@ -63,6 +64,7 @@ class Calculator implements CalculatorInterface $adjust = $newAmount - $fullAmount; $adjustments[$code] = $adjust; $fullAmount = $newAmount; + $previousAdjustments += $adjust; } } diff --git a/lib/internal/Magento/Framework/Pricing/Test/Unit/Adjustment/CalculatorTest.php b/lib/internal/Magento/Framework/Pricing/Test/Unit/Adjustment/CalculatorTest.php index 9aa6eccbe0922a693cb25aab9a1a3e8195ac78ee..7865cf7db856610c537c797a992f0b68ee283710 100644 --- a/lib/internal/Magento/Framework/Pricing/Test/Unit/Adjustment/CalculatorTest.php +++ b/lib/internal/Magento/Framework/Pricing/Test/Unit/Adjustment/CalculatorTest.php @@ -40,39 +40,30 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase */ public function testGetAmount() { - $amount = 10; - $fullAmount = $amount; - $newAmount = 15; - $taxAdjustmentCode = 'tax'; + $amountInclTax = 10; + $taxAdjustment = 2; + $weeeAdjustment = 5; + $totalAmount = $amountInclTax + $weeeAdjustment; + $weeeAdjustmentCode = 'weee'; - $adjustment = 5; + $taxAdjustmentCode = 'tax'; $expectedAdjustments = [ - $taxAdjustmentCode => $adjustment, - $weeeAdjustmentCode => $adjustment, + $weeeAdjustmentCode => $weeeAdjustment, + $taxAdjustmentCode => $taxAdjustment, ]; - $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + $amountBaseMock = $this->getMockBuilder('Magento\Framework\Pricing\Amount\Base') ->disableOriginalConstructor() - ->setMethods(['getPriceInfo', '__wakeup']) ->getMock(); + $this->amountFactoryMock->expects($this->once()) + ->method('create') + ->with($this->equalTo($totalAmount), $this->equalTo($expectedAdjustments)) + ->will($this->returnValue($amountBaseMock)); - $taxAdjustmentMock = $this->getMockBuilder('Magento\Tax\Pricing\Adjustment') + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') ->disableOriginalConstructor() + ->setMethods(['getPriceInfo', '__wakeup']) ->getMock(); - $taxAdjustmentMock->expects($this->once()) - ->method('getAdjustmentCode') - ->will($this->returnValue($taxAdjustmentCode)); - $taxAdjustmentMock->expects($this->once()) - ->method('isIncludedInBasePrice') - ->will($this->returnValue(true)); - $taxAdjustmentMock->expects($this->once()) - ->method('extractAdjustment') - ->with($this->equalTo($amount), $this->equalTo($productMock)) - ->will($this->returnValue($adjustment)); - $taxAdjustmentMock->expects($this->once()) - ->method('applyAdjustment') - ->with($this->equalTo($fullAmount), $this->equalTo($productMock)) - ->will($this->returnValue($amount)); $weeeAdjustmentMock = $this->getMockBuilder('Magento\Weee\Pricing\Adjustment') ->disableOriginalConstructor() @@ -85,15 +76,33 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(false)); $weeeAdjustmentMock->expects($this->once()) ->method('isIncludedInDisplayPrice') - ->with($this->equalTo($productMock)) ->will($this->returnValue(true)); $weeeAdjustmentMock->expects($this->once()) ->method('applyAdjustment') - ->with($this->equalTo($fullAmount), $this->equalTo($productMock)) - ->will($this->returnValue($newAmount)); + ->with($this->equalTo($amountInclTax), $this->equalTo($productMock)) + ->will($this->returnValue($weeeAdjustment + $amountInclTax)); - $adjustments = [$taxAdjustmentMock, $weeeAdjustmentMock]; + $taxAdjustmentMock = $this->getMockBuilder('Magento\Tax\Pricing\Adjustment') + ->disableOriginalConstructor() + ->getMock(); + $taxAdjustmentMock->expects($this->once()) + ->method('getAdjustmentCode') + ->will($this->returnValue($taxAdjustmentCode)); + $taxAdjustmentMock->expects($this->once()) + ->method('isIncludedInBasePrice') + ->will($this->returnValue(true)); + $taxAdjustmentMock->expects($this->once()) + ->method('extractAdjustment') + ->with($this->equalTo($amountInclTax), $this->equalTo($productMock)) + ->will($this->returnValue($taxAdjustment)); + $taxAdjustmentMock->expects($this->once()) + ->method('applyAdjustment') + ->with($this->equalTo($totalAmount), $this->equalTo($productMock)) + ->will($this->returnValue($totalAmount)); + $taxAdjustmentMock->expects($this->never()) + ->method('isIncludedInDisplayPrice'); + $adjustments = [$weeeAdjustmentMock, $taxAdjustmentMock]; $priceInfoMock = $this->getMockBuilder('\Magento\Framework\Pricing\PriceInfo\Base') ->disableOriginalConstructor() ->getMock(); @@ -105,15 +114,7 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase ->method('getPriceInfo') ->will($this->returnValue($priceInfoMock)); - $amountBaseMock = $this->getMockBuilder('Magento\Framework\Pricing\Amount\Base') - ->disableOriginalConstructor() - ->getMock(); - - $this->amountFactoryMock->expects($this->once()) - ->method('create') - ->with($this->equalTo($newAmount), $this->equalTo($expectedAdjustments)) - ->will($this->returnValue($amountBaseMock)); - $result = $this->model->getAmount($amount, $productMock); + $result = $this->model->getAmount($amountInclTax, $productMock); $this->assertInstanceOf('Magento\Framework\Pricing\Amount\AmountInterface', $result); } diff --git a/lib/internal/Magento/Framework/ProductVideo/README.md b/lib/internal/Magento/Framework/ProductVideo/README.md deleted file mode 100644 index 88bf074ef921029dddc69e0c304ba3cd23bd9539..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ProductVideo/README.md +++ /dev/null @@ -1 +0,0 @@ -Library contains schema files used to validate XML files in Magento\ProductVideo module diff --git a/lib/internal/Magento/Framework/ProductVideo/etc/view.xsd b/lib/internal/Magento/Framework/ProductVideo/etc/view.xsd deleted file mode 100644 index e5af826629af43085b84e36f3d5dda78a6b8e4f5..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ProductVideo/etc/view.xsd +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> - <xs:redefine schemaLocation="../../Config/etc/view.xsd"> - <xs:complexType name="mediaType" mixed="true"> - <xs:complexContent> - <xs:extension base="mediaType"> - <xs:sequence> - <xs:element name="videos" type="videoType" minOccurs="0"/> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:redefine> - - <xs:complexType name="videoType"> - <xs:sequence> - <xs:element name="video" minOccurs="1" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="play_if_base" type="xs:boolean" minOccurs="0"/> - <xs:element name="show_related" type="xs:boolean" minOccurs="0"/> - <xs:element name="video_auto_restart" type="xs:boolean" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="id" type="xs:string" use="required"/> - <xs:attribute name="type" use="required"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="play_if_base"/> - <xs:enumeration value="show_related"/> - <xs:enumeration value="video_auto_restart"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="module" type="xs:string" use="required"/> - </xs:complexType> -</xs:schema> \ No newline at end of file diff --git a/lib/internal/Magento/Framework/Search/Adapter/Mysql/Query/Builder/Match.php b/lib/internal/Magento/Framework/Search/Adapter/Mysql/Query/Builder/Match.php index e2a94382f2fe09b78305d2407210eba69a3ba254..927dfb10f4c7df71b931b30d21a71c204c365105 100644 --- a/lib/internal/Magento/Framework/Search/Adapter/Mysql/Query/Builder/Match.php +++ b/lib/internal/Magento/Framework/Search/Adapter/Mysql/Query/Builder/Match.php @@ -15,7 +15,7 @@ use Magento\Framework\Search\Request\QueryInterface as RequestQueryInterface; class Match implements QueryInterface { - const SPECIAL_CHARACTERS = '-+~/\\<>\'":*$#@()!,.?`='; + const SPECIAL_CHARACTERS = '-+~/\\<>\'":*$#@()!,.?`=%&^_'; const MINIMAL_CHARACTER_LENGTH = 3; diff --git a/lib/internal/Magento/Framework/Search/Request/Binder.php b/lib/internal/Magento/Framework/Search/Request/Binder.php index a6ec65f17510b6a2a77b3309332c6a98978ecbd6..689181f152f766c9fa7ffb65a8b3e826ba9fb78f 100644 --- a/lib/internal/Magento/Framework/Search/Request/Binder.php +++ b/lib/internal/Magento/Framework/Search/Request/Binder.php @@ -81,6 +81,7 @@ class Binder } else { $data[$key] = $bindValue; } + $data['is_bind'] = true; } } } diff --git a/lib/internal/Magento/Framework/Search/Request/Cleaner.php b/lib/internal/Magento/Framework/Search/Request/Cleaner.php index 4752b0a3a958026679671f85f33dfc06bdba9a13..3227180eb2c284e18ffe0f725174cdaf59c8032e 100644 --- a/lib/internal/Magento/Framework/Search/Request/Cleaner.php +++ b/lib/internal/Magento/Framework/Search/Request/Cleaner.php @@ -90,7 +90,7 @@ class Cleaner } break; case QueryInterface::TYPE_MATCH: - if (preg_match('/\$(.+)\$/si', $query['value'], $matches)) { + if (!array_key_exists('is_bind', $query)) { unset($this->requestData['queries'][$queryName]); } break; @@ -131,7 +131,7 @@ class Cleaner switch ($aggregationValue['type']) { case 'dynamicBucket': if (is_string($aggregationValue['method']) - && preg_match('/\$(.+)\$/si', $aggregationValue['method']) + && preg_match('/^\$(.+)\$$/si', $aggregationValue['method']) ) { unset($this->requestData['aggregations'][$aggregationName]); } @@ -164,14 +164,14 @@ class Cleaner switch ($filter['type']) { case FilterInterface::TYPE_WILDCARD: case FilterInterface::TYPE_TERM: - if (is_string($filter['value']) && preg_match('/\$(.+)\$/si', $filter['value'], $matches)) { + if (!array_key_exists('is_bind', $filter)) { unset($this->requestData['filters'][$filterName]); } break; case FilterInterface::TYPE_RANGE: $keys = ['from', 'to']; foreach ($keys as $key) { - if (isset($filter[$key]) && preg_match('/\$(.+)\$/si', $filter[$key], $matches)) { + if (isset($filter[$key]) && preg_match('/^\$(.+)\$$/si', $filter[$key])) { unset($this->requestData['filters'][$filterName][$key]); } } diff --git a/lib/internal/Magento/Framework/Search/Test/Unit/Adapter/Mysql/Query/Builder/MatchTest.php b/lib/internal/Magento/Framework/Search/Test/Unit/Adapter/Mysql/Query/Builder/MatchTest.php index 901474b5773c5712815c477ec483361adc5da716..00d8a26af00920b0c616390404c3a4fc2b1dab97 100644 --- a/lib/internal/Magento/Framework/Search/Test/Unit/Adapter/Mysql/Query/Builder/MatchTest.php +++ b/lib/internal/Magento/Framework/Search/Test/Unit/Adapter/Mysql/Query/Builder/MatchTest.php @@ -64,7 +64,7 @@ class MatchTest extends \PHPUnit_Framework_TestCase ->getMock(); $this->fulltextHelper->expects($this->once()) ->method('getMatchQuery') - ->with($this->equalTo(['some_field' => 'some_field']), $this->equalTo('-some_value*')) + ->with($this->equalTo(['some_field' => 'some_field']), $this->equalTo('-some* -value*')) ->will($this->returnValue('matchedQuery')); $select->expects($this->once()) ->method('where') diff --git a/lib/internal/Magento/Framework/Search/Test/Unit/Request/BinderTest.php b/lib/internal/Magento/Framework/Search/Test/Unit/Request/BinderTest.php index 05ad64cec64a95243fc779dd4910dfeb1b4b8930..dccd480ed2837f953043e9e1d302b5faa518bcc8 100644 --- a/lib/internal/Magento/Framework/Search/Test/Unit/Request/BinderTest.php +++ b/lib/internal/Magento/Framework/Search/Test/Unit/Request/BinderTest.php @@ -51,9 +51,16 @@ class BinderTest extends \PHPUnit_Framework_TestCase ]; $expectedResult = [ 'dimensions' => ['scope' => ['value' => 'default']], - 'queries' => ['query' => ['value' => 'match_query']], - 'filters' => ['filter' => ['from' => 'filter_from', 'to' => 'filter_to', 'value' => 'filter_value']], - 'aggregations' => ['price' => ['method' => 'filter_method']], + 'queries' => ['query' => ['value' => 'match_query', 'is_bind' => true]], + 'filters' => [ + 'filter' => [ + 'from' => 'filter_from', + 'to' => 'filter_to', + 'value' => 'filter_value', + 'is_bind' => true + ] + ], + 'aggregations' => ['price' => ['method' => 'filter_method', 'is_bind' => true]], 'from' => 1, 'size' => 10, ]; diff --git a/lib/internal/Magento/Framework/Search/Test/Unit/Request/CleanerTest.php b/lib/internal/Magento/Framework/Search/Test/Unit/Request/CleanerTest.php index a9fdb8f18f81ee85a26d041c9781754585413c69..88bd09a498c9059caa6a2e6c137c0842feef215d 100644 --- a/lib/internal/Magento/Framework/Search/Test/Unit/Request/CleanerTest.php +++ b/lib/internal/Magento/Framework/Search/Test/Unit/Request/CleanerTest.php @@ -48,7 +48,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase ], 'type' => 'boolQuery', ], - 'match_query' => ['value' => 'ok', 'type' => 'matchQuery'], + 'match_query' => ['value' => 'ok', 'type' => 'matchQuery', 'is_bind' => true], 'bool_query_rm' => [ 'queryReference' => [ ['ref' => 'match_query_rm'], @@ -83,7 +83,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase 'filterReference' => [['ref' => 'term_filter2']], 'type' => 'boolFilter', ], - 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter'], + 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter', 'is_bind' => true], ], ]; $exceptedRequestData = [ @@ -93,7 +93,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase 'queryReference' => [['ref' => 'match_query'], ['ref' => 'filtered_query_to_filter2']], 'type' => 'boolQuery', ], - 'match_query' => ['value' => 'ok', 'type' => 'matchQuery'], + 'match_query' => ['value' => 'ok', 'type' => 'matchQuery', 'is_bind' => true], 'filtered_query_to_filter2' => [ 'filterReference' => [['ref' => 'bool_filter2']], 'type' => 'filteredQuery', @@ -104,7 +104,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase 'filterReference' => [['ref' => 'term_filter2']], 'type' => 'boolFilter', ], - 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter'], + 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter', 'is_bind' => true], ], ]; @@ -129,7 +129,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase ], 'type' => 'boolQuery', ], - 'match_query' => ['value' => 'ok', 'type' => 'matchQuery'], + 'match_query' => ['value' => 'ok', 'type' => 'matchQuery', 'is_bind' => true], 'bool_query_rm' => [ 'queryReference' => [ ['ref' => 'match_query_rm'], @@ -164,7 +164,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase 'filterReference' => [['ref' => 'term_filter2']], 'type' => 'boolFilter', ], - 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter'], + 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter', 'is_bind' => true], ], ]; $exceptedRequestData = [ @@ -174,7 +174,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase 'queryReference' => [['ref' => 'match_query'], ['ref' => 'filtered_query_to_filter2']], 'type' => 'boolQuery', ], - 'match_query' => ['value' => 'ok', 'type' => 'matchQuery'], + 'match_query' => ['value' => 'ok', 'type' => 'matchQuery', 'is_bind' => true], 'filtered_query_to_filter2' => [ 'filterReference' => [['ref' => 'bool_filter2']], 'type' => 'filteredQuery', @@ -185,7 +185,7 @@ class CleanerTest extends \PHPUnit_Framework_TestCase 'filterReference' => [['ref' => 'term_filter2']], 'type' => 'boolFilter', ], - 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter'], + 'term_filter2' => ['value' => 'value_good', 'type' => 'termFilter', 'is_bind' => true], ], 'aggregations' => [], ]; diff --git a/lib/internal/Magento/Framework/Setup/BackupRollback.php b/lib/internal/Magento/Framework/Setup/BackupRollback.php index bf2327d2145d4e91fd305f9d95c741f71418c97d..4b7584f4709be1192bf6e82392657422341fef58 100644 --- a/lib/internal/Magento/Framework/Setup/BackupRollback.php +++ b/lib/internal/Magento/Framework/Setup/BackupRollback.php @@ -227,7 +227,7 @@ class BackupRollback */ public function dbRollback($rollbackFile) { - if (preg_match('/[0-9]_(db).(gz)$/', $rollbackFile) !== 1) { + if (preg_match('/[0-9]_(db)(.*?).(gz)$/', $rollbackFile) !== 1) { throw new LocalizedException(new Phrase('Invalid rollback file.')); } if (!$this->file->isExists($this->backupsDir . '/' . $rollbackFile)) { diff --git a/lib/internal/Magento/Framework/TestFramework/Unit/Autoloader/ExtensionGeneratorAutoloader.php b/lib/internal/Magento/Framework/TestFramework/Unit/Autoloader/ExtensionGeneratorAutoloader.php index 9f14464d01c877ddbb5c8e097c5d5646d1922e3e..4382d23df89eeac89e54fddbaba8df862dcc6262 100644 --- a/lib/internal/Magento/Framework/TestFramework/Unit/Autoloader/ExtensionGeneratorAutoloader.php +++ b/lib/internal/Magento/Framework/TestFramework/Unit/Autoloader/ExtensionGeneratorAutoloader.php @@ -41,7 +41,7 @@ class ExtensionGeneratorAutoloader return false; } - $resultFileName = $this->generatorIo->getResultFileName($className); + $resultFileName = $this->generatorIo->generateResultFileName($className); if (!$this->generatorIo->fileExists($resultFileName)) { $this->generatorIo->makeResultFileDirectory($className); diff --git a/lib/internal/Magento/Framework/Validator/Config.php b/lib/internal/Magento/Framework/Validator/Config.php index 9b10f61bb596d87814b0704b322ec39ca1c8b1ec..b45a12914e7909fa29c30ad8fe94c70bfb54d6ef 100644 --- a/lib/internal/Magento/Framework/Validator/Config.php +++ b/lib/internal/Magento/Framework/Validator/Config.php @@ -19,7 +19,6 @@ class Config extends \Magento\Framework\Config\AbstractXml const CONSTRAINT_TYPE_ENTITY = 'entity'; const CONSTRAINT_TYPE_PROPERTY = 'property'; - /**#@-*/ /** @@ -32,22 +31,18 @@ class Config extends \Magento\Framework\Config\AbstractXml */ protected $_builderFactory; - /** @var \Magento\Framework\Config\Dom\UrnResolver */ - protected $urnResolver; - /** * @param array $configFiles + * @param \Magento\Framework\Config\DomFactory $domFactory * @param \Magento\Framework\Validator\UniversalFactory $builderFactory - * @param \Magento\Framework\Config\Dom\UrnResolver $urnResolver */ public function __construct( $configFiles, - \Magento\Framework\Validator\UniversalFactory $builderFactory, - \Magento\Framework\Config\Dom\UrnResolver $urnResolver + \Magento\Framework\Config\DomFactory $domFactory, + \Magento\Framework\Validator\UniversalFactory $builderFactory ) { $this->_builderFactory = $builderFactory; - $this->urnResolver = $urnResolver; - parent::__construct($configFiles); + parent::__construct($configFiles, $domFactory); } /** @@ -407,7 +402,7 @@ class Config extends \Magento\Framework\Config\AbstractXml */ public function getSchemaFile() { - return $this->urnResolver->getRealPath('urn:magento:framework:Validator/etc/validation.xsd'); + return __DIR__ . '/etc/validation.xsd'; } /** diff --git a/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php b/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php index 9a9bb9aafcaae66ff4e780de8d992b5ac7a56609..977cfb9adf04f3fd2090d26d8fcf8325eacd8d3e 100644 --- a/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php +++ b/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php @@ -55,20 +55,35 @@ class ConfigTest extends \PHPUnit_Framework_TestCase new \Magento\Framework\ObjectManager\Relations\Runtime() ); $factory = new \Magento\Framework\ObjectManager\Factory\Dynamic\Developer($config); - $realObjectManager = new \Magento\Framework\ObjectManager\ObjectManager($factory, $config); - $factory->setObjectManager($realObjectManager); - $universalFactory = $realObjectManager->get('Magento\Framework\Validator\UniversalFactory'); + $appObjectManager = new \Magento\Framework\ObjectManager\ObjectManager($factory, $config); + $factory->setObjectManager($appObjectManager); + /** @var \Magento\Framework\Validator\UniversalFactory $universalFactory */ + $universalFactory = $appObjectManager->get('Magento\Framework\Validator\UniversalFactory'); /** @var \Magento\Framework\Config\Dom\UrnResolver $urnResolverMock */ $urnResolverMock = $this->getMock('Magento\Framework\Config\Dom\UrnResolver', [], [], '', false); $urnResolverMock->expects($this->any()) ->method('getRealPath') ->with('urn:magento:framework:Validator/etc/validation.xsd') ->willReturn($this->urnResolver->getRealPath('urn:magento:framework:Validator/etc/validation.xsd')); + $appObjectManager->configure( + [ + 'preferences' => [ + 'Magento\Framework\Config\ValidationStateInterface' => + 'Magento\Framework\App\Arguments\ValidationState', + ], + 'Magento\Framework\App\Arguments\ValidationState' => [ + 'arguments' => [ + 'appMode' => 'developer', + ] + ] + ] + ); $this->_config = $this->_objectManager->getObject( 'Magento\Framework\Validator\Config', [ 'configFiles' => $configFiles, 'builderFactory' => $universalFactory, + 'domFactory' => new \Magento\Framework\Config\DomFactory($appObjectManager), 'urnResolver' => $urnResolverMock ] ); diff --git a/lib/internal/Magento/Framework/View/Asset/Bundle.php b/lib/internal/Magento/Framework/View/Asset/Bundle.php index 380d87d31155e0366758b65c55c1aca966575099..d19d667d6121600700dd09c11d3a6d1f432e8cc4 100644 --- a/lib/internal/Magento/Framework/View/Asset/Bundle.php +++ b/lib/internal/Magento/Framework/View/Asset/Bundle.php @@ -150,7 +150,7 @@ class Bundle */ protected function getAssetSize(LocalInterface $asset) { - return mb_strlen(utf8_encode($asset->getContent()), 'utf-8') / 1024; + return mb_strlen(json_encode(utf8_encode($asset->getContent()), JSON_UNESCAPED_SLASHES), 'utf-8') / 1024; } /** diff --git a/lib/internal/Magento/Framework/View/Asset/PreProcessor/AlternativeSource.php b/lib/internal/Magento/Framework/View/Asset/PreProcessor/AlternativeSource.php index d727bd9fa40598dba7c3cf65330c8da88155d361..95fe57227895b643dd4bbbbdc8596699fb692918 100644 --- a/lib/internal/Magento/Framework/View/Asset/PreProcessor/AlternativeSource.php +++ b/lib/internal/Magento/Framework/View/Asset/PreProcessor/AlternativeSource.php @@ -96,7 +96,7 @@ class AlternativeSource implements AlternativeSourceInterface } try { - $this->lockerProcess->lockProcess($this->lockName . sprintf('%x', crc32($path . $content))); + $this->lockerProcess->lockProcess($this->lockName); $module = $chain->getAsset()->getModule(); diff --git a/lib/internal/Magento/Framework/View/Asset/Source.php b/lib/internal/Magento/Framework/View/Asset/Source.php index d47a76a4fe58c928e247cf4d98790b8ef6258eea..53965c612a41e57600803b7d973f4f6283d8765a 100644 --- a/lib/internal/Magento/Framework/View/Asset/Source.php +++ b/lib/internal/Magento/Framework/View/Asset/Source.php @@ -128,9 +128,12 @@ class Source $this->preProcessorPool->process($chain); $chain->assertValid(); $dirCode = DirectoryList::ROOT; - if ($chain->isChanged()) { + $directoryReader = $this->filesystem->getDirectoryRead(DirectoryList::STATIC_VIEW); + $targetPath = DirectoryList::TMP_MATERIALIZATION_DIR . '/source/' . $chain->getTargetAssetPath(); + + if ($chain->isChanged() || !$directoryReader->isExist($targetPath)) { $dirCode = DirectoryList::VAR_DIR; - $path = DirectoryList::TMP_MATERIALIZATION_DIR . '/source/' . $chain->getTargetAssetPath(); + $path = $targetPath; $this->varDir->writeFile($path, $chain->getContent()); } $result = [$dirCode, $path]; diff --git a/lib/internal/Magento/Framework/View/Config.php b/lib/internal/Magento/Framework/View/Config.php index fb4c687a731764c9d873f59c738a6d251e3bbece..85126514bb328578ff3eff05a3e638297834bd1e 100644 --- a/lib/internal/Magento/Framework/View/Config.php +++ b/lib/internal/Magento/Framework/View/Config.php @@ -62,9 +62,6 @@ class Config implements \Magento\Framework\View\ConfigInterface */ protected $fileIteratorFactory; - /** @var \Magento\Framework\Config\ViewFactory */ - protected $viewConfigFactory; - /** * File view factory * @@ -89,7 +86,7 @@ class Config implements \Magento\Framework\View\ConfigInterface \Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\View\FileSystem $viewFileSystem, \Magento\Framework\Config\FileIteratorFactory $fileIteratorFactory, - \Magento\Framework\Config\ViewFactory $viewConfigFactory, + \Magento\Framework\Config\ViewFactory $viewFactory, $filename = self::CONFIG_FILE_NAME ) { $this->moduleReader = $moduleReader; @@ -97,7 +94,7 @@ class Config implements \Magento\Framework\View\ConfigInterface $this->assetRepo = $assetRepo; $this->viewFileSystem = $viewFileSystem; $this->fileIteratorFactory = $fileIteratorFactory; - $this->viewConfigFactory = $viewConfigFactory; + $this->viewFactory = $viewFactory; $this->filename = $filename; } @@ -131,7 +128,7 @@ class Config implements \Magento\Framework\View\ConfigInterface $this->rootDirectory->getRelativePath($themeConfigFile) ); } - $config = $this->viewConfigFactory->create($configFiles); + $config = $this->viewFactory->create($configFiles); $this->viewConfigs[$key] = $config; return $config; diff --git a/lib/internal/Magento/Framework/View/Design/Fallback/Rule/Module.php b/lib/internal/Magento/Framework/View/Design/Fallback/Rule/Module.php index fe6e23dc46c62d8af767ee7e963df68b4777dbaf..c62e3d306bb8a819e6255ec739d8e2efb992bf7a 100644 --- a/lib/internal/Magento/Framework/View/Design/Fallback/Rule/Module.php +++ b/lib/internal/Magento/Framework/View/Design/Fallback/Rule/Module.php @@ -59,6 +59,9 @@ class Module implements RuleInterface ComponentRegistrar::MODULE, $params['module_name'] ); + if (empty($params['module_dir'])) { + return []; + } return $this->rule->getPatternDirs($params); } } diff --git a/lib/internal/Magento/Framework/View/Element/Html/Select.php b/lib/internal/Magento/Framework/View/Element/Html/Select.php index ab54697632aceffbda35a6fee7debca60dc6e3d8..884c11fe91950eca05b450eb1a8ea6b12114a23a 100644 --- a/lib/internal/Magento/Framework/View/Element/Html/Select.php +++ b/lib/internal/Magento/Framework/View/Element/Html/Select.php @@ -125,6 +125,7 @@ class Select extends \Magento\Framework\View\Element\AbstractBlock * @return string * * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function _toHtml() { @@ -151,9 +152,11 @@ class Select extends \Magento\Framework\View\Element\AbstractBlock $isArrayOption = true; foreach ($this->getOptions() as $key => $option) { + $optgroupName = ''; if ($isArrayOption && is_array($option)) { $value = $option['value']; $label = (string)$option['label']; + $optgroupName = isset($option['optgroup-name']) ? $option['optgroup-name'] : $label; $params = !empty($option['params']) ? $option['params'] : []; } else { $value = (string)$key; @@ -163,7 +166,7 @@ class Select extends \Magento\Framework\View\Element\AbstractBlock } if (is_array($value)) { - $html .= '<optgroup label="' . $label . '">'; + $html .= '<optgroup label="' . $label . '" data-optgroup-name="' . $optgroupName . '">'; foreach ($value as $keyGroup => $optionGroup) { if (!is_array($optionGroup)) { $optionGroup = ['value' => $keyGroup, 'label' => $optionGroup]; diff --git a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/DomMerger.php b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/DomMerger.php index ae7107665b4ae8f8a96816ecd8560109e9081599..554fc62e34c2386bdba4f34b58d0ec70f768f047 100644 --- a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/DomMerger.php +++ b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/DomMerger.php @@ -8,6 +8,7 @@ namespace Magento\Framework\View\Element\UiComponent\Config; use Magento\Framework\Config\Dom; use Magento\Framework\Config\Dom\UrnResolver; use Magento\Framework\Module\Dir\Reader as DirectoryReader; +use \Magento\Framework\Config\ValidationStateInterface; /** * Class DomMerger @@ -19,6 +20,11 @@ class DomMerger implements DomMergerInterface */ const ERROR_FORMAT_DEFAULT = "Message: %message%\nLine: %line%\n"; + /** + * @var \Magento\Framework\Config\ValidationStateInterface + */ + private $validationState; + /** * Location schema file * @@ -62,20 +68,21 @@ class DomMerger implements DomMergerInterface * Format of $contextXPath: array('/config/ui') * The path to ID attribute name should not include any attribute notations or modifiers -- only node names * - * @param UrnResolver $urnResolver - * @param string $schema Absolute schema file path or URN + * @param ValidationStateInterface $validationState + * @param string $schema * @param bool $isMergeSimpleXMLElement * @param array $contextXPath * @param array $idAttributes */ public function __construct( - UrnResolver $urnResolver, + ValidationStateInterface $validationState, $schema, $isMergeSimpleXMLElement = false, array $contextXPath = [], array $idAttributes = [] ) { - $this->schemaFilePath = $urnResolver->getRealPath($schema); + $this->validationState = $validationState; + $this->schema = $schema; $this->isMergeSimpleXMLElement = $isMergeSimpleXMLElement; $this->contextXPath = $contextXPath; $this->idAttributes = $idAttributes; @@ -315,7 +322,7 @@ class DomMerger implements DomMergerInterface { $domDocument = new \DOMDocument(); $domDocument->loadXML($xml); - if ($this->schemaFilePath) { + if ($this->validationState->isValidationRequired() && $this->schema) { $errors = $this->validateDomDocument($domDocument); if (count($errors)) { throw new \Magento\Framework\Exception\LocalizedException( @@ -335,12 +342,12 @@ class DomMerger implements DomMergerInterface * @return array of errors * @throws \Exception */ - protected function validateDomDocument(\DOMDocument $domDocument, $schemaFilePath = null) + protected function validateDomDocument(\DOMDocument $domDocument, $schema = null) { - $schemaFilePath = $schemaFilePath !== null ? $schemaFilePath : $this->schemaFilePath; + $schema = $schema !== null ? $schema : $this->schema; libxml_use_internal_errors(true); try { - $errors = \Magento\Framework\Config\Dom::validateDomDocument($domDocument, $schemaFilePath); + $errors = \Magento\Framework\Config\Dom::validateDomDocument($domDocument, $schema); } catch (\Exception $exception) { libxml_use_internal_errors(false); throw $exception; @@ -435,6 +442,9 @@ class DomMerger implements DomMergerInterface */ public function validate($schemaFilePath = null) { + if (!$this->validationState->isValidationRequired()) { + return []; + } return $this->validateDomDocument($this->getDom(), $schemaFilePath); } } diff --git a/lib/internal/Magento/Framework/View/Layout/Data/Structure.php b/lib/internal/Magento/Framework/View/Layout/Data/Structure.php index 79e514b42b23a782e208ca25558a7a21ac6eb3f5..ee2fe6bd206a87c7f894e82232007abe92beadf8 100644 --- a/lib/internal/Magento/Framework/View/Layout/Data/Structure.php +++ b/lib/internal/Magento/Framework/View/Layout/Data/Structure.php @@ -6,6 +6,7 @@ namespace Magento\Framework\View\Layout\Data; use Magento\Framework\Data\Structure as DataStructure; +use Magento\Framework\App\State; /** * An associative data structure, that features "nested set" parent-child relations @@ -24,17 +25,25 @@ class Structure extends DataStructure */ protected $logger; + /** + * @var State + */ + protected $state; + /** * Constructor * * @param \Psr\Log\LoggerInterface $logger + * @param State $state * @param array $elements */ public function __construct( \Psr\Log\LoggerInterface $logger, + State $state, array $elements = null ) { $this->logger = $logger; + $this->state = $state; parent::__construct($elements); } @@ -109,10 +118,12 @@ class Structure extends DataStructure if ($childName !== $sibling) { $siblingParentName = $this->getParentId($sibling); if ($parentName !== $siblingParentName) { - $this->logger->critical( - "Broken reference: the '{$childName}' tries to reorder itself towards '{$sibling}', but " . - "their parents are different: '{$parentName}' and '{$siblingParentName}' respectively." - ); + if ($this->state->getMode() === State::MODE_DEVELOPER) { + $this->logger->critical( + "Broken reference: the '{$childName}' tries to reorder itself towards '{$sibling}', but " . + "their parents are different: '{$parentName}' and '{$siblingParentName}' respectively." + ); + } return; } $this->reorderToSibling($parentName, $childName, $sibling, $after ? 1 : -1); diff --git a/lib/internal/Magento/Framework/View/Layout/ScheduledStructure/Helper.php b/lib/internal/Magento/Framework/View/Layout/ScheduledStructure/Helper.php index aaa2e5fe1ecdd33140ff323f20a8906d6c78040b..c71c27beeb4705608e69d428a9989b4a56d68ce4 100644 --- a/lib/internal/Magento/Framework/View/Layout/ScheduledStructure/Helper.php +++ b/lib/internal/Magento/Framework/View/Layout/ScheduledStructure/Helper.php @@ -6,6 +6,7 @@ namespace Magento\Framework\View\Layout\ScheduledStructure; use Magento\Framework\View\Layout; +use Magento\Framework\App\State; class Helper { @@ -31,13 +32,21 @@ class Helper */ protected $logger; + /** + * @var State + */ + protected $state; + /** * @param \Psr\Log\LoggerInterface $logger + * @param State $state */ public function __construct( - \Psr\Log\LoggerInterface $logger + \Psr\Log\LoggerInterface $logger, + State $state ) { $this->logger = $logger; + $this->state = $state; } /** @@ -190,10 +199,13 @@ class Helper } } else { $scheduledStructure->setElementToBrokenParentList($key); - $this->logger->critical( - "Broken reference: the '{$name}' element cannot be added as child to '{$parentName}', " . - 'because the latter doesn\'t exist' - ); + + if ($this->state->getMode() === State::MODE_DEVELOPER) { + $this->logger->critical( + "Broken reference: the '{$name}' element cannot be added as child to '{$parentName}', " . + 'because the latter doesn\'t exist' + ); + } } } diff --git a/lib/internal/Magento/Framework/View/PageLayout/Config.php b/lib/internal/Magento/Framework/View/PageLayout/Config.php index 31279b31a061659df213c2b87e18c208a125a116..ce0f173c5d8b3286aea932421e685b737723d111 100644 --- a/lib/internal/Magento/Framework/View/PageLayout/Config.php +++ b/lib/internal/Magento/Framework/View/PageLayout/Config.php @@ -17,14 +17,18 @@ class Config extends \Magento\Framework\Config\AbstractXml /** * Instantiate with the list of files to merge * - * @param \Magento\Framework\Config\Dom\UrnResolver $urnResolver * @param array $configFiles + * @param \Magento\Framework\Config\DomFactory $domFactory + * @param \Magento\Framework\Config\Dom\UrnResolver $urnResolver * @throws \InvalidArgumentException */ - public function __construct($configFiles, \Magento\Framework\Config\Dom\UrnResolver $urnResolver) - { + public function __construct( + $configFiles, + \Magento\Framework\Config\DomFactory $domFactory, + \Magento\Framework\Config\Dom\UrnResolver $urnResolver + ) { $this->urnResolver = $urnResolver; - parent::__construct($configFiles); + parent::__construct($configFiles, $domFactory); } /** diff --git a/lib/internal/Magento/Framework/View/Template/Html/Minifier.php b/lib/internal/Magento/Framework/View/Template/Html/Minifier.php index af80583da16e7f37c084151650869ef3f7c39c89..6b9017a1972ce499a0fdd37a300e0d7d60386412 100644 --- a/lib/internal/Magento/Framework/View/Template/Html/Minifier.php +++ b/lib/internal/Magento/Framework/View/Template/Html/Minifier.php @@ -117,7 +117,7 @@ class Minifier implements MinifierInterface '</', preg_replace( '#((?:<\?php\s+(?!echo|print|if|elseif|else)[^\?]*)\?>)\s+#', - '$1', + '$1 ', preg_replace( '#(?<!' . implode('|', $this->inlineHtmlTags) . ')\> \<#', '><', diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php index 6901f2d06062e08ca7ab1cea51cbd9caa6b8a00c..427ed2bc1557804cc5658cc21c0fbe3d893b3bca 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Asset/SourceTest.php @@ -94,7 +94,7 @@ class SourceTest extends \PHPUnit_Framework_TestCase $themeList->expects($this->any()) ->method('getThemeByFullPath') ->with('frontend/magento_theme') - ->will($this->returnValue($this->theme)); + ->willReturn($this->theme); $this->initFilesystem(); @@ -104,32 +104,36 @@ class SourceTest extends \PHPUnit_Framework_TestCase } /** - * @param $origFile - * @param $origPath - * @param $origContent - * @param $isMaterialization + * @param string $origFile + * @param string $origPath + * @param string $origContent + * @param bool $isMaterialization + * @param bool $isExist * * @dataProvider getFileDataProvider */ - public function testGetFile($origFile, $origPath, $origContent, $isMaterialization) + public function testGetFile($origFile, $origPath, $origContent, $isMaterialization, $isExist) { $filePath = 'some/file.ext'; $this->viewFileResolution->expects($this->once()) ->method('getFile') ->with('frontend', $this->theme, 'en_US', $filePath, 'Magento_Module') - ->will($this->returnValue($origFile)); + ->willReturn($origFile); $this->rootDirRead->expects($this->once()) ->method('getRelativePath') ->with($origFile) - ->will($this->returnValue($origPath)); + ->willReturn($origPath); $this->rootDirRead->expects($this->once()) ->method('readFile') ->with($origPath) - ->will($this->returnValue($origContent)); + ->willReturn($origContent); $this->preProcessorPool->expects($this->once()) ->method('process') ->with($this->chain); - if ($isMaterialization) { + $this->staticDirRead->expects($this->any()) + ->method('isExist') + ->willReturn($isExist); + if ($isMaterialization || !$isExist) { $this->chain ->expects($this->once()) ->method('isChanged') @@ -147,13 +151,13 @@ class SourceTest extends \PHPUnit_Framework_TestCase ->with('view_preprocessed/source/some/file.ext', 'processed'); $this->varDir->expects($this->once()) ->method('getAbsolutePath') - ->with('view_preprocessed/source/some/file.ext')->will($this->returnValue('result')); + ->with('view_preprocessed/source/some/file.ext')->willReturn('result'); } else { $this->varDir->expects($this->never())->method('writeFile'); $this->rootDirRead->expects($this->once()) ->method('getAbsolutePath') ->with('source/some/file.ext') - ->will($this->returnValue('result')); + ->willReturn('result'); } $this->assertSame('result', $this->object->getFile($this->getAsset())); } @@ -197,10 +201,10 @@ class SourceTest extends \PHPUnit_Framework_TestCase public function getFileDataProvider() { return [ - ['/root/some/file.ext', 'source/some/file.ext', 'processed', false], - ['/root/some/file.ext', 'source/some/file.ext', 'not_processed', true], - ['/root/some/file.ext2', 'source/some/file.ext2', 'processed', true], - ['/root/some/file.ext2', 'source/some/file.ext2', 'not_processed', true], + ['/root/some/file.ext', 'source/some/file.ext', 'processed', false, true], + ['/root/some/file.ext', 'source/some/file.ext', 'not_processed', true, false], + ['/root/some/file.ext2', 'source/some/file.ext2', 'processed', true, true], + ['/root/some/file.ext2', 'source/some/file.ext2', 'not_processed', true, false], ]; } @@ -219,11 +223,11 @@ class SourceTest extends \PHPUnit_Framework_TestCase $this->filesystem->expects($this->any()) ->method('getDirectoryRead') - ->will($this->returnValueMap($readDirMap)); + ->willReturnMap($readDirMap); $this->filesystem->expects($this->any()) ->method('getDirectoryWrite') ->with(DirectoryList::VAR_DIR) - ->will($this->returnValue($this->varDir)); + ->willReturn($this->varDir); } /** @@ -252,19 +256,19 @@ class SourceTest extends \PHPUnit_Framework_TestCase $asset = $this->getMock('Magento\Framework\View\Asset\File', [], [], '', false); $asset->expects($this->any()) ->method('getContext') - ->will($this->returnValue($context)); + ->willReturn($context); $asset->expects($this->any()) ->method('getFilePath') - ->will($this->returnValue('some/file.ext')); + ->willReturn('some/file.ext'); $asset->expects($this->any()) ->method('getPath') - ->will($this->returnValue('some/file.ext')); + ->willReturn('some/file.ext'); $asset->expects($this->any()) ->method('getModule') - ->will($this->returnValue('Magento_Module')); + ->willReturn('Magento_Module'); $asset->expects($this->any()) ->method('getContentType') - ->will($this->returnValue('ext')); + ->willReturn('ext'); return $asset; } diff --git a/lib/internal/Magento/Framework/View/Test/Unit/ConfigTest.php b/lib/internal/Magento/Framework/View/Test/Unit/ConfigTest.php index c6c980ee74c530e013a401b469dbde403ff6dc3d..dd2270d310a3bfc063c511e66fb3665e321644d9 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/ConfigTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/ConfigTest.php @@ -68,7 +68,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase 'assetRepo' => $this->repositoryMock, 'viewFileSystem' => $this->fileSystemMock, 'fileIteratorFactory' => $this->fileIteratorFactoryMock, - 'viewConfigFactory' => $this->viewConfigFactoryMock + 'viewFactory' => $this->viewConfigFactoryMock ] ); } diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Element/Html/SelectTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Element/Html/SelectTest.php index d3660f32178ac024283b682bc5d93f93f00a5e39..3321d1eeaf8b6d1b1c1136faceaf08239c8413db 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Element/Html/SelectTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Element/Html/SelectTest.php @@ -127,7 +127,7 @@ class SelectTest extends \PHPUnit_Framework_TestCase . '<option value="testValue" paramKey="paramValue" >testLabel</option>' . '<option value="selectedValue" selected="selected" paramKey="paramValue" ' . ' paramKey2="paramValue2" >selectedLabel</option>' - . '<optgroup label="groupLabel">' + . '<optgroup label="groupLabel" data-optgroup-name="groupLabel">' . '<option value="groupElementValue" >GroupElementLabel</option>' . '<option value="selectedGroupElementValue" selected="selected" >SelectedGroupElementLabel</option>' . '</optgroup>' diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Layout/Data/StructureTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Data/StructureTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f5d47e87b95cd33b6494dbcb87af32bfde92a791 --- /dev/null +++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/Data/StructureTest.php @@ -0,0 +1,96 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\View\Test\Unit\Layout\Data; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use Magento\Framework\App\State; + +class StructureTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var State|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stateMock; + + /** + * @var ObjectManagerHelper + */ + protected $objectManagerHelper; + + /** + * @var \Magento\Framework\View\Layout\Data\Structure + */ + protected $dataStructure; + + /** + * @return void + */ + protected function setUp() + { + $this->loggerMock = $this->getMock('Psr\Log\LoggerInterface'); + $this->stateMock = $this->getMock('Magento\Framework\App\State', [], [], '', false); + + $this->objectManagerHelper = new ObjectManagerHelper($this); + $this->dataStructure = $this->objectManagerHelper->getObject( + 'Magento\Framework\View\Layout\Data\Structure', + [ + 'logger' => $this->loggerMock, + 'state' => $this->stateMock + ] + ); + } + + /** + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $loggerExpects + * @param string $stateMode + * @return void + * @dataProvider reorderChildElementLogDataProvider + */ + public function testReorderChildElementLog($loggerExpects, $stateMode) + { + $parentName = 'parent'; + $childName = 'child'; + $offsetOrSibling = '-'; + + $this->stateMock->expects($this->once()) + ->method('getMode') + ->willReturn($stateMode); + $this->loggerMock->expects($loggerExpects) + ->method('critical') + ->with( + "Broken reference: the '{$childName}' tries to reorder itself towards '', but " . + "their parents are different: '{$parentName}' and '' respectively." + ); + + $this->dataStructure->reorderChildElement($parentName, $childName, $offsetOrSibling); + } + + /** + * @return array + */ + public function reorderChildElementLogDataProvider() + { + return [ + [ + 'loggerExpects' => $this->once(), + 'stateMode' => State::MODE_DEVELOPER + ], + [ + 'loggerExpects' => $this->never(), + 'stateMode' => State::MODE_DEFAULT + ], + [ + 'loggerExpects' => $this->never(), + 'stateMode' => State::MODE_PRODUCTION + ] + ]; + } +} diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Layout/ScheduledStructure/HelperTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Layout/ScheduledStructure/HelperTest.php index 4aeff78304d3191d5e6e1ac9569a5955d2a87785..82619fa03d207777a312626e8c5ece42577e0084 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Layout/ScheduledStructure/HelperTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Layout/ScheduledStructure/HelperTest.php @@ -7,6 +7,7 @@ namespace Magento\Framework\View\Test\Unit\Layout\ScheduledStructure; use Magento\Framework\View\Layout; +use Magento\Framework\App\State; /** * Class HelperTest @@ -22,7 +23,17 @@ class HelperTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\View\Layout\Data\Structure|\PHPUnit_Framework_MockObject_MockObject */ - protected $dataStructure; + protected $dataStructureMock; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var State|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stateMock; /** * @var \Magento\Framework\View\Layout\ScheduledStructure\Helper @@ -37,13 +48,20 @@ class HelperTest extends \PHPUnit_Framework_TestCase $this->scheduledStructureMock = $this->getMockBuilder('Magento\Framework\View\Layout\ScheduledStructure') ->disableOriginalConstructor() ->getMock(); - - $this->dataStructure = $this->getMockBuilder('Magento\Framework\View\Layout\Data\Structure') + $this->dataStructureMock = $this->getMockBuilder('Magento\Framework\View\Layout\Data\Structure') ->disableOriginalConstructor() ->getMock(); + $this->loggerMock = $this->getMock('Psr\Log\LoggerInterface'); + $this->stateMock = $this->getMock('Magento\Framework\App\State', [], [], '', false); $helperObjectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->helper = $helperObjectManager->getObject('Magento\Framework\View\Layout\ScheduledStructure\Helper'); + $this->helper = $helperObjectManager->getObject( + 'Magento\Framework\View\Layout\ScheduledStructure\Helper', + [ + 'logger' => $this->loggerMock, + 'state' => $this->stateMock + ] + ); } /** @@ -122,7 +140,75 @@ class HelperTest extends \PHPUnit_Framework_TestCase $this->scheduledStructureMock->expects($this->once())->method('unsetPathElement')->with($key); $this->scheduledStructureMock->expects($this->once())->method('unsetStructureElement')->with($key); - $this->helper->scheduleElement($this->scheduledStructureMock, $this->dataStructure, $key); + $this->helper->scheduleElement($this->scheduledStructureMock, $this->dataStructureMock, $key); + } + + /** + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $loggerExpects + * @param string $stateMode + * @return void + * @dataProvider scheduleElementLogDataProvider + */ + public function testScheduleElementLog($loggerExpects, $stateMode) + { + $key = 'key'; + $parentName = 'parent'; + $alias = 'alias'; + $block = 'block'; + $siblingName = null; + $isAfter = false; + + $this->scheduledStructureMock->expects($this->once()) + ->method('getStructureElement') + ->willReturn( + [ + Layout\ScheduledStructure\Helper::SCHEDULED_STRUCTURE_INDEX_TYPE => $block, + Layout\ScheduledStructure\Helper::SCHEDULED_STRUCTURE_INDEX_ALIAS => $alias, + Layout\ScheduledStructure\Helper::SCHEDULED_STRUCTURE_INDEX_PARENT_NAME => $parentName, + Layout\ScheduledStructure\Helper::SCHEDULED_STRUCTURE_INDEX_SIBLING_NAME => $siblingName, + Layout\ScheduledStructure\Helper::SCHEDULED_STRUCTURE_INDEX_IS_AFTER => $isAfter + ] + ); + $this->scheduledStructureMock->expects($this->once()) + ->method('hasStructureElement') + ->with($parentName) + ->willReturn(false); + $this->dataStructureMock->expects($this->once()) + ->method('hasElement') + ->with($parentName) + ->willReturn(false); + $this->stateMock->expects($this->once()) + ->method('getMode') + ->willReturn($stateMode); + $this->loggerMock->expects($loggerExpects) + ->method('critical') + ->with( + "Broken reference: the '{$key}' element cannot be added as child to '{$parentName}', " . + 'because the latter doesn\'t exist' + ); + + $this->helper->scheduleElement($this->scheduledStructureMock, $this->dataStructureMock, $key); + } + + /** + * @return array + */ + public function scheduleElementLogDataProvider() + { + return [ + [ + 'loggerExpects' => $this->once(), + 'stateMode' => State::MODE_DEVELOPER + ], + [ + 'loggerExpects' => $this->never(), + 'stateMode' => State::MODE_DEFAULT + ], + [ + 'loggerExpects' => $this->never(), + 'stateMode' => State::MODE_PRODUCTION + ] + ]; } /** @@ -170,14 +256,15 @@ class HelperTest extends \PHPUnit_Framework_TestCase ); $this->scheduledStructureMock->expects($this->any())->method('hasStructureElement')->willReturn(true); $this->scheduledStructureMock->expects($this->once())->method('setElement')->with($key, [$block, $data]); - - $this->dataStructure->expects($this->once())->method('createElement')->with($key, ['type' => $block]); - $this->dataStructure->expects($this->once())->method('hasElement')->with($parentName)->willReturn($hasParent); - $this->dataStructure->expects($this->exactly($setAsChild)) + $this->dataStructureMock->expects($this->once())->method('createElement')->with($key, ['type' => $block]); + $this->dataStructureMock->expects($this->once()) + ->method('hasElement') + ->with($parentName) + ->willReturn($hasParent); + $this->dataStructureMock->expects($this->exactly($setAsChild)) ->method('setAsChild') ->with($key, $parentName, $alias) ->willReturn(true); - $this->scheduledStructureMock->expects($this->exactly($toRemoveList)) ->method('setElementToBrokenParentList') ->with($key); @@ -185,7 +272,7 @@ class HelperTest extends \PHPUnit_Framework_TestCase ->method('setElementToSortList') ->with($parentName, $key, $siblingName, $isAfter); - $this->helper->scheduleElement($this->scheduledStructureMock, $this->dataStructure, $key); + $this->helper->scheduleElement($this->scheduledStructureMock, $this->dataStructureMock, $key); } /** diff --git a/lib/internal/Magento/Framework/View/Test/Unit/PageLayout/ConfigTest.php b/lib/internal/Magento/Framework/View/Test/Unit/PageLayout/ConfigTest.php index 8bdac494e98a6b3741038e5f21dec573e41174cf..2b10c2a26d44212623aa246ca3e8db5399b7bfc1 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/PageLayout/ConfigTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/PageLayout/ConfigTest.php @@ -23,6 +23,26 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ->method('getRealPath') ->with('urn:magento:framework:View/PageLayout/etc/layouts.xsd') ->willReturn($urnResolver->getRealPath('urn:magento:framework:View/PageLayout/etc/layouts.xsd')); + $validationStateMock = $this->getMock('\Magento\Framework\Config\ValidationStateInterface', [], [], '', false); + $validationStateMock->method('isValidationRequired') + ->willReturn(true); + $domFactoryMock = $this->getMock('Magento\Framework\Config\DomFactory', [], [], '', false); + $domFactoryMock->expects($this->once()) + ->method('createDom') + ->willReturnCallback( + function ($arguments) use ($validationStateMock) { + // @codingStandardsIgnoreStart + return new \Magento\Framework\Config\Dom( + '<?xml version="1.0" encoding="UTF-8"?>' + . '<page_layouts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></page_layouts>', + $validationStateMock, + ['/page_layouts/layout' => 'id'], + null, + $arguments['schemaFile'] + ); + // @codingStandardsIgnoreEnd + } + ); $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->config = $objectManagerHelper->getObject( 'Magento\Framework\View\PageLayout\Config', @@ -31,7 +51,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase 'configFiles' => [ 'layouts_one.xml' => file_get_contents(__DIR__ . '/_files/layouts_one.xml'), 'layouts_two.xml' => file_get_contents(__DIR__ . '/_files/layouts_two.xml'), - ] + ], + 'domFactory' => $domFactoryMock ] ); } diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php index a93962b3ae7e689f4ef943e5273b9da9afd8cffc..e598a93c243a47b7cfdab23cad76c441f7d6c010 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php @@ -117,7 +117,7 @@ class MinifierTest extends \PHPUnit_Framework_TestCase TEXT; $expectedContent = <<<TEXT -<?php /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ ?><?php ?><html><head><title>Test title</title></head><body><a href="http://somelink.com/text.html">Text Link</a> <img src="test.png" alt="some text" /><?php echo \$block->someMethod(); ?> <div style="width: 800px" class="<?php echo \$block->getClass() ?>" /><script> +<?php /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ ?> <?php ?> <html><head><title>Test title</title></head><body><a href="http://somelink.com/text.html">Text Link</a> <img src="test.png" alt="some text" /><?php echo \$block->someMethod(); ?> <div style="width: 800px" class="<?php echo \$block->getClass() ?>" /><script> //<![CDATA[ var someVar = 123; testFunctionCall(function () { diff --git a/lib/internal/Magento/Framework/View/Xsd/Reader.php b/lib/internal/Magento/Framework/View/Xsd/Reader.php deleted file mode 100644 index 7891ba7e0143c7e073e0f1955c9b10cbdc22c20a..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/View/Xsd/Reader.php +++ /dev/null @@ -1,248 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\View\Xsd; - -use Magento\Framework\Component\ComponentRegistrar; -use Magento\Framework\Component\DirSearch; -use Magento\Framework\Config\Dom\UrnResolver; -use Magento\Framework\Config\FileIteratorFactory; -use Magento\Framework\Filesystem; - -class Reader implements \Magento\Framework\Config\ReaderInterface -{ - /** - * @var string - */ - protected $defaultScope; - - /** - * @var string - */ - protected $fileName; - - /** - * @var DirSearch - */ - protected $componentDirSearch; - - /** - * @var string - */ - protected $searchFilesPattern; - - /** @var \Magento\Framework\Config\Dom\UrnResolver */ - protected $urnResolver; - - /** - * @var FileIteratorFactory - */ - private $iteratorFactory; - - /** - * @param DirSearch $dirSearch - * @param UrnResolver $urnResolver - * @param FileIteratorFactory $iteratorFactory - * @param string $fileName - * @param string $defaultScope - * @param string $searchFilesPattern - */ - public function __construct( - DirSearch $dirSearch, - UrnResolver $urnResolver, - FileIteratorFactory $iteratorFactory, - $fileName, - $defaultScope, - $searchFilesPattern - ) { - $this->componentDirSearch = $dirSearch; - $this->urnResolver = $urnResolver; - $this->fileName = $fileName; - $this->defaultScope = $defaultScope; - $this->searchFilesPattern = $searchFilesPattern; - $this->iteratorFactory = $iteratorFactory; - } - - /** - * Get list of xsd files - * - * @param string $filename - * @return array - */ - public function getListXsdFiles($filename) - { - return $this->iteratorFactory->create( - array_merge( - $this->componentDirSearch->collectFiles(ComponentRegistrar::MODULE, 'etc/' . $filename), - $this->componentDirSearch->collectFiles(ComponentRegistrar::LIBRARY, '*/etc/' . $filename) - ) - ); - } - - /** - * Read xsd files from list - * - * @param null $scope - * @return array - * @throws \Magento\Framework\Exception\LocalizedException - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function read($scope = null) - { - $fileList = $this->getListXsdFiles($this->fileName); - if (!count($fileList)) { - return []; - } - $mergeXsd = $this->readXsdFiles($fileList); - - return $mergeXsd; - } - - /** - * Get merged xsd file - * - * @param array $fileList - * @param string $baseXsd - * @return null|string - * @throws \Magento\Framework\Exception\LocalizedException - */ - public function readXsdFiles($fileList, $baseXsd = null) - { - $baseXsd = new \DOMDocument(); - $baseXsdPath = $this->urnResolver->getRealPath($this->searchFilesPattern . $this->fileName); - $baseXsd->load($baseXsdPath); - $configMerge = null; - foreach ($fileList as $key => $content) { - if ($key == $baseXsdPath) { - continue; - } - try { - if (!empty($content)) { - if ($configMerge) { - $configMerge = $this->mergeXsd($configMerge, $content); - } else { - $configMerge = $this->mergeXsd($baseXsd->saveXML(), $content); - } - } - } catch (\Magento\Framework\Config\Dom\ValidationException $e) { - throw new \Magento\Framework\Exception\LocalizedException( - new \Magento\Framework\Phrase("Invalid XSD in file %1:\n%2", [$key, $e->getMessage()]) - ); - } - } - - return $configMerge; - } - - /** - * Merge xsd files - * - * @param string $parent - * @param string $child - * @return string - */ - protected function mergeXsd($parent, $child) - { - $domParent = $this->createDomInstance($parent); - $domChild = $this->createDomInstance($child); - $domChild = $domChild->documentElement; - - $domParentElement = $domParent->getElementsByTagName('complexType'); - $parentDomElements = $this->findDomElement($domParentElement, 'name'); - foreach ($parentDomElements->childNodes as $findElement) { - if ($findElement instanceof \DOMElement) { - $domParentNode = $findElement; - break; - } - } - $domChildElement = $domChild->getElementsByTagName('extension'); - $childDomElements = $this->findDomElement($domChildElement, 'base'); - $domParent = $this->addHeadChildIntoParent($childDomElements, $domParent, $domParentNode); - $delete = $domChild->getElementsByTagName('redefine')->item(0); - $domChild->removeChild($delete); - $domParent = $this->addBodyChildIntoParent($domChild, $domParent); - - return $domParent->saveXML(); - } - - /** - * Create DOM instance - * - * @param string $source - * @return \DOMDocument - */ - protected function createDomInstance($source) - { - $domInstance = new \DOMDocument('1.0', 'UTF-8'); - $domInstance->formatOutput = true; - $domInstance->loadXML($source); - $domInstance->preserveWhiteSpace = true; - - return $domInstance; - } - - /** - * Find searched element in DOM - * - * @param \DOMNodeList $domParentElement - * @param string $attribute - * @return mixed - */ - protected function findDomElement(\DOMNodeList $domParentElement, $attribute) - { - foreach ($domParentElement as $child) { - if ($child->getAttribute($attribute) === 'mediaType' - && $child instanceof \DOMElement - && $child->hasChildNodes() - ) { - return $child; - } - } - } - - /** - * Add into parent head elements from child - * - * @param \DOMElement $childDomElements - * @param \DOMDocument $domParent - * @param \DOMElement $domParentNode - * @return \DOMDocument - */ - protected function addHeadChildIntoParent( - \DOMElement $childDomElements, - \DOMDocument $domParent, - \DOMElement $domParentNode - ) { - foreach ($childDomElements->childNodes as $sequence) { - if ($sequence instanceof \DOMElement && $sequence->hasChildNodes()) { - foreach ($sequence->childNodes as $findElement) { - if ($findElement instanceof \DOMElement) { - $importedNodes = $domParent->importNode($findElement, true); - $domParentNode->appendChild($importedNodes); - } - } - } - } - - return $domParent; - } - - /** - * Add into parent body elements from child - * - * @param \DOMElement $domChild - * @param \DOMDocument $domParent - * @return \DOMDocument - */ - protected function addBodyChildIntoParent(\DOMElement $domChild, \DOMDocument $domParent) - { - foreach ($domChild->childNodes as $node) { - $importNode = $domParent->importNode($node, true); - $domParent->documentElement->appendChild($importNode); - } - - return $domParent; - } -} diff --git a/lib/internal/Magento/Framework/Xml/Security.php b/lib/internal/Magento/Framework/Xml/Security.php index 1fade0a2aec7e0a48389168536a452559f1f0222..87c5f271a5bb5a422e4358c8d2a7541e3b713f13 100644 --- a/lib/internal/Magento/Framework/Xml/Security.php +++ b/lib/internal/Magento/Framework/Xml/Security.php @@ -21,7 +21,7 @@ class Security */ private function heuristicScan($xmlContent) { - return strpos($xmlContent, '<!ENTITY') !== false; + return strpos($xmlContent, '<!ENTITY') === false; } /** diff --git a/lib/web/fotorama/fotorama.js b/lib/web/fotorama/fotorama.js index 445fe7d30c52ce4d576a1aafa426b75276bb9e0d..9aba3a85f0065c04581c081c677b238b83eca923 100644 --- a/lib/web/fotorama/fotorama.js +++ b/lib/web/fotorama/fotorama.js @@ -2229,14 +2229,9 @@ fotoramaVersion = '4.6.4'; stageLeft = 0, fadeStack = []; - if (Modernizr.touch) { - $wrap[STAGE_FRAME_KEY] = $('<a class="' + stageFrameClass + '" target="_blank"></a>'); - } else { - $wrap[STAGE_FRAME_KEY] = $('<div class="' + stageFrameClass + '"></div>'); - } + $wrap[STAGE_FRAME_KEY] = $('<div class="' + stageFrameClass + '"></div>'); $wrap[NAV_THUMB_FRAME_KEY] = $($.Fotorama.jst.thumb()); - $wrap[NAV_DOT_FRAME_KEY] = $($.Fotorama.jst.dots()); toDeactivate[STAGE_FRAME_KEY] = []; diff --git a/lib/web/fotorama/fotorama.min.js b/lib/web/fotorama/fotorama.min.js index dbce341e32242af7a80a4fb2d659857b8e5eb692..591010dd42366a66923f03716e0edc5f965009cc 100644 --- a/lib/web/fotorama/fotorama.min.js +++ b/lib/web/fotorama/fotorama.min.js @@ -1,5 +1,5 @@ /*! * Fotorama 4.6.4 | http://fotorama.io/license/ */ -fotoramaVersion="4.6.4",function(t,e,n,o,i){"use strict";function r(t){var e="bez_"+o.makeArray(arguments).join("_").replace(".","p");if("function"!=typeof o.easing[e]){var n=function(t,e){var n=[null,null],o=[null,null],i=[null,null],r=function(r,a){return i[a]=3*t[a],o[a]=3*(e[a]-t[a])-i[a],n[a]=1-i[a]-o[a],r*(i[a]+r*(o[a]+r*n[a]))},a=function(t){return i[0]+t*(2*o[0]+3*n[0]*t)},s=function(t){for(var e,n=t,o=0;++o<14&&(e=r(n,0)-t,!(Math.abs(e)<.001));)n-=e/a(n);return n};return function(t){return r(s(t),1)}};o.easing[e]=function(e,o,i,r,a){return r*n([t[0],t[1]],[t[2],t[3]])(o/a)+i}}return e}function a(){}function s(t,e,n){return Math.max(isNaN(e)?-1/0:e,Math.min(isNaN(n)?1/0:n,t))}function u(t,e){return t.match(/ma/)&&t.match(/-?\d+(?!d)/g)[t.match(/3d/)?"vertical"===e?13:12:"vertical"===e?5:4]}function l(t,e){return On?+u(t.css("transform"),e):+t.css("vertical"===e?"top":"left").replace("px","")}function c(t,e){var n={};if(On)switch(e){case"vertical":n.transform="translate3d(0, "+t+"px,0)";break;case"list":break;default:n.transform="translate3d("+t+"px,0,0)"}else"vertical"===e?n.top=t:n.left=t;return n}function d(t){return{"transition-duration":t+"ms"}}function f(t,e){return isNaN(t)?e:t}function h(t,e){return f(+String(t).replace(e||"px",""))}function m(t){return/%$/.test(t)?h(t,"%"):i}function p(t,e){return f(m(t)/100*e,h(t))}function v(t){return(!isNaN(h(t))||!isNaN(h(t,"%")))&&t}function g(t,e,n,o){return(t-(o||0))*(e+(n||0))}function w(t,e,n,o){return-Math.round(t/(e+(n||0))-(o||0))}function y(t){var e=t.data();if(!e.tEnd){var n=t[0],o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",msTransition:"MSTransitionEnd",transition:"transitionend"};V(n,o[Tn.prefixed("transition")],function(t){e.tProp&&t.propertyName.match(e.tProp)&&e.onEndFn()}),e.tEnd=!0}}function b(t,e,n,o){var i,r=t.data();r&&(r.onEndFn=function(){i||(i=!0,clearTimeout(r.tT),n())},r.tProp=e,clearTimeout(r.tT),r.tT=setTimeout(function(){r.onEndFn()},1.5*o),y(t))}function x(t,e){var n=t.navdir||"horizontal";if(t.length){var o=t.data();On?(t.css(d(0)),o.onEndFn=a,clearTimeout(o.tT)):t.stop();var i=_(e,function(){return l(t,n)});return t.css(c(i,n)),i}}function _(){for(var t,e=0,n=arguments.length;n>e&&(t=e?arguments[e]():arguments[e],"number"!=typeof t);e++);return t}function C(t,e){return Math.round(t+(e-t)/1.5)}function k(){return k.p=k.p||("https:"===n.protocol?"https://":"http://"),k.p}function T(t){var n=e.createElement("a");return n.href=t,n}function P(t,e){if("string"!=typeof t)return t;t=T(t);var n,o;if(t.host.match(/youtube\.com/)&&t.search){if(n=t.search.split("v=")[1]){var i=n.indexOf("&");-1!==i&&(n=n.substring(0,i)),o="youtube"}}else t.host.match(/youtube\.com|youtu\.be/)?(n=t.pathname.replace(/^\/(embed\/|v\/)?/,"").replace(/\/.*/,""),o="youtube"):t.host.match(/vimeo\.com/)&&(o="vimeo",n=t.pathname.replace(/^\/(video\/)?/,"").replace(/\/.*/,""));return n&&o||!e||(n=t.href,o="custom"),n?{id:n,type:o,s:t.search.replace(/^\?/,""),p:k()}:!1}function S(t,e,n){var i,r,a=t.video;return"youtube"===a.type?(r=k()+"img.youtube.com/vi/"+a.id+"/default.jpg",i=r.replace(/\/default.jpg$/,"/hqdefault.jpg"),t.thumbsReady=!0):"vimeo"===a.type?o.ajax({url:k()+"vimeo.com/api/v2/video/"+a.id+".json",dataType:"jsonp",success:function(o){t.thumbsReady=!0,M(e,{img:o[0].thumbnail_large,thumb:o[0].thumbnail_small},t.i,n)}}):t.thumbsReady=!0,{img:i,thumb:r}}function M(t,e,n,i){for(var r=0,a=t.length;a>r;r++){var s=t[r];if(s.i===n&&s.thumbsReady){var u={videoReady:!0};u[to]=u[no]=u[eo]=!1,i.splice(r,1,o.extend({},s,u,e));break}}}function E(t){function e(t,e,i){var r=t.children("img").eq(0),a=t.attr("href"),s=t.attr("src"),u=r.attr("src"),l=e.video,c=i?P(a,l===!0):!1;c?a=!1:c=l,n(t,r,o.extend(e,{video:c,img:e.img||a||s||u,thumb:e.thumb||u||s||a}))}function n(t,e,n){var i=n.thumb&&n.img!==n.thumb,r=h(n.width||t.attr("width")),a=h(n.height||t.attr("height"));o.extend(n,{width:r,height:a,thumbratio:K(n.thumbratio||h(n.thumbwidth||e&&e.attr("width")||i||r)/h(n.thumbheight||e&&e.attr("height")||i||a))})}var i=[];return t.children().each(function(){var t=o(this),r=H(o.extend(t.data(),{id:t.attr("id")}));if(t.is("a, img"))e(t,r,!0);else{if(t.is(":empty"))return;n(t,null,o.extend(r,{html:this,_html:t.html()}))}i.push(r)}),i}function F(t){return 0===t.offsetWidth&&0===t.offsetHeight}function j(t){return!o.contains(e.documentElement,t)}function z(t,e,n,o){return z.i||(z.i=1,z.ii=[!0]),o=o||z.i,"undefined"==typeof z.ii[o]&&(z.ii[o]=!0),t()?e():z.ii[o]&&setTimeout(function(){z.ii[o]&&z(t,e,n,o)},n||100),z.i++}function N(t,e){var n=t.data(),o=n.measures;if(o&&(!n.l||n.l.W!==o.width||n.l.H!==o.height||n.l.r!==o.ratio||n.l.w!==e.w||n.l.h!==e.h)){var i=s(e.h,0,o.height),r=i*o.ratio;po.setRatio(t,r,i),n.l={W:o.width,H:o.height,r:o.ratio,w:e.w,h:e.h}}return!0}function $(t,e){var n=t[0];n.styleSheet?n.styleSheet.cssText=e:t.html(e)}function q(t,e,n,o){return e===n?!1:"vertical"===o?e>=t?"top":t>=n?"bottom":"top bottom":e>=t?"left":t>=n?"right":"left right"}function L(t,e,n){n=n||{},t.each(function(){var t,i=o(this),r=i.data();r.clickOn||(r.clickOn=!0,o.extend(oe(i,{onStart:function(e){t=e,(n.onStart||a).call(this,e)},onMove:n.onMove||a,onTouchEnd:n.onTouchEnd||a,onEnd:function(n){n.moved||e.call(this,t)}}),{noMove:!0}))})}function A(t,e){return'<div class="'+t+'">'+(e||"")+"</div>"}function I(t){return"."+t}function O(t){var e='<iframe src="'+t.p+t.type+".com/embed/"+t.id+'" frameborder="0" allowfullscreen></iframe>';return e}function D(t){for(var e=t.length;e;){var n=Math.floor(Math.random()*e--),o=t[e];t[e]=t[n],t[n]=o}return t}function R(t){return"[object Array]"==Object.prototype.toString.call(t)&&o.map(t,function(t){return o.extend({},t)})}function W(t,e,n){t.scrollLeft(e||0).scrollTop(n||0)}function H(t){if(t){var e={};return o.each(t,function(t,n){e[t.toLowerCase()]=n}),e}}function K(t){if(t){var e=+t;return isNaN(e)?(e=t.split("/"),+e[0]/+e[1]||i):e}}function V(t,e,n,o){e&&(t.addEventListener?t.addEventListener(e,n,!!o):t.attachEvent("on"+e,n))}function B(t,e){return t>e.max?t=e.max:t<e.min&&(t=e.min),t}function Q(t,e,n,o,i,r,a){var s,u,l;return"horizontal"===a?(u=t.thumbwidth,l=r.width()):(u=t.thumbheight,l=r.height()),s=(u+t.margin)*(n+1)>=l-o?"horizontal"===a?-i.position().left:-i.position().top:(u+t.margin)*n<=Math.abs(o)?"horizontal"===a?-i.position().left+l-(u+t.margin):-i.position().top+l-(u+t.margin):o,s=B(s,e),s||0}function X(t){return!!t.getAttribute("disabled")}function U(t){return{tabindex:-1*t+"",disabled:t}}function Y(t,e){V(t,"keyup",function(n){X(t)||13==n.keyCode&&e.call(t,n)})}function G(t,e){V(t,"focus",t.onfocusin=function(n){e.call(t,n)},!0)}function J(t,e){t.preventDefault?t.preventDefault():t.returnValue=!1,e&&t.stopPropagation&&t.stopPropagation()}function Z(t){return t?">":"<"}function te(t,e){var n=t.data(),i=Math.round(e.pos),r=function(){n&&n.sliding&&(n.sliding=!1),(e.onEnd||a)()};"undefined"!=typeof e.overPos&&e.overPos!==e.pos&&(i=e.overPos);var s=o.extend(c(i,e.direction),e.width&&{width:e.width},e.height&&{height:e.height});n&&n.sliding&&(n.sliding=!0),On?(t.css(o.extend(d(e.time),s)),e.time>10?b(t,"transform",r,e.time):r()):t.stop().animate(s,e.time,io,r)}function ee(t,e,n,i,r,s){var u="undefined"!=typeof s;if(u||(r.push(arguments),Array.prototype.push.call(arguments,r.length),!(r.length>1))){t=t||o(t),e=e||o(e);var l=t[0],c=e[0],d="crossfade"===i.method,f=function(){if(!f.done){f.done=!0;var t=(u||r.shift())&&r.shift();t&&ee.apply(this,t),(i.onEnd||a)(!!t)}},h=i.time/(s||1);n.removeClass(Ke+" "+He),t.stop().addClass(Ke),e.stop().addClass(He),d&&c&&t.fadeTo(0,0),t.fadeTo(d?h:0,1,d&&f),e.fadeTo(h,0,f),l&&d||c||f()}}function ne(t){var e=(t.touches||[])[0]||t;t._x=e.pageX,t._y=e.clientY,t._now=o.now()}function oe(t,n){function i(t){return f=o(t.target),b.checked=p=v=w=!1,c||b.flow||t.touches&&t.touches.length>1||t.which>1||lo&&lo.type!==t.type&&fo||(p=n.select&&f.is(n.select,y))?p:(m="touchstart"===t.type,v=f.is("a, a *",y),h=b.control,g=b.noMove||b.noSwipe||h?16:b.snap?0:4,ne(t),d=lo=t,co=t.type.replace(/down|start/,"move").replace(/Down/,"Move"),(n.onStart||a).call(y,t,{control:h,$target:f}),c=b.flow=!0,void((!m||b.go)&&J(t)))}function r(t){if(t.touches&&t.touches.length>1||Kn&&!t.isPrimary||co!==t.type||!c)return c&&s(),void(n.onTouchEnd||a)();ne(t);var e=Math.abs(t._x-d._x),o=Math.abs(t._y-d._y),i=e-o,r=(b.go||b.x||i>=0)&&!b.noSwipe,u=0>i;m&&!b.checked?(c=r)&&J(t):(J(t),(n.onMove||a).call(y,t,{touch:m})),!w&&Math.sqrt(Math.pow(e,2)+Math.pow(o,2))>g&&(w=!0),b.checked=b.checked||r||u}function s(t){(n.onTouchEnd||a)();var e=c;b.control=c=!1,e&&(b.flow=!1),!e||v&&!b.checked||(t&&J(t),fo=!0,clearTimeout(ho),ho=setTimeout(function(){fo=!1},1e3),(n.onEnd||a).call(y,{moved:w,$target:f,control:h,touch:m,startEvent:d,aborted:!t||"MSPointerCancel"===t.type}))}function u(){b.flow||setTimeout(function(){b.flow=!0},10)}function l(){b.flow&&setTimeout(function(){b.flow=!1},Bn)}var c,d,f,h,m,p,v,g,w,y=t[0],b={};return Kn?(V(y,"MSPointerDown",i),V(e,"MSPointerMove",r),V(e,"MSPointerCancel",s),V(e,"MSPointerUp",s)):(V(y,"touchstart",i),V(y,"touchmove",r),V(y,"touchend",s),V(e,"touchstart",u),V(e,"touchend",l),V(e,"touchcancel",l),qn.on("scroll",l),t.on("mousedown",i),Ln.on("mousemove",r).on("mouseup",s)),mo=Tn.touch?"a":"div",t.on("click",mo,function(t){b.checked&&J(t)}),b}function ie(t,e){function n(n,o){S=!0,l=d="vertical"===_?n._y:n._x,v=n._now,p=[[v,l]],f=h=F.noMove||o?0:x(t,(e.getPos||a)()),(e.onStart||a).call(M,n)}function i(e,o){w=F.min,y=F.max,b=F.snap,_=F.direction||"horizontal",t.navdir=_,k=e.altKey,S=P=!1,T=o.control,T||E.sliding||n(e)}function r(o,i){F.noSwipe||(S||n(o),d="vertical"===_?o._y:o._x,p.push([o._now,d]),h=f-(l-d),m=q(h,w,y,_),w>=h?h=C(h,w):h>=y&&(h=C(h,y)),F.noMove||(t.css(c(h,_)),P||(P=!0,i.touch||Kn||t.addClass(un)),(e.onMove||a).call(M,o,{pos:h,edge:m})))}function u(i){if(!F.noSwipe||!i.moved){S||n(i.startEvent,!0),i.touch||Kn||t.removeClass(un),g=o.now();for(var r,u,l,c,m,v,x,C,T,P=g-Bn,E=null,j=Qn,z=e.friction,N=p.length-1;N>=0;N--){if(r=p[N][0],u=Math.abs(r-P),null===E||l>u)E=r,c=p[N][1];else if(E===P||u>l)break;l=u}x=s(h,w,y);var $=c-d,q=$>=0,L=g-E,A=L>Bn,I=!A&&h!==f&&x===h;b&&(x=s(Math[I?q?"floor":"ceil":"round"](h/b)*b,w,y),w=y=x),I&&(b||x===h)&&(T=-($/L),j*=s(Math.abs(T),e.timeLow,e.timeHigh),m=Math.round(h+T*j/z),b||(x=m),(!q&&m>y||q&&w>m)&&(v=q?w:y,C=m-v,b||(x=v),C=s(x+.03*C,v-50,v+50),j=Math.abs((h-C)/(T/z)))),j*=k?10:1,(e.onEnd||a).call(M,o.extend(i,{moved:i.moved||A&&b,pos:h,newPos:x,overPos:C,time:j,dir:_}))}}var l,d,f,h,m,p,v,g,w,y,b,_,k,T,P,S,M=t[0],E=t.data(),F={};return F=o.extend(oe(e.$wrap,o.extend({},e,{onStart:i,onMove:r,onEnd:u})),F)}function re(t,e){var n,i,r,s=t[0],u={prevent:{}};return V(s,Vn,function(t){var s=t.wheelDeltaY||-1*t.deltaY||0,l=t.wheelDeltaX||-1*t.deltaX||0,c=Math.abs(l)&&!Math.abs(s),d=Z(0>l),f=i===d,h=o.now(),m=Bn>h-r;i=d,r=h,c&&u.ok&&(!u.prevent[d]||n)&&(J(t,!0),n&&f&&m||(e.shift&&(n=!0,clearTimeout(u.t),u.t=setTimeout(function(){n=!1},Xn)),(e.onEnd||a)(t,e.shift?d:l)))}),u}function ae(){o.each(o.Fotorama.instances,function(t,e){e.index=t})}function se(t){o.Fotorama.instances.push(t),ae()}function ue(t){o.Fotorama.instances.splice(t.index,1),ae()}var le="fotorama",ce="fotorama__fullscreen",de=le+"__wrap",fe=de+"--css2",he=de+"--css3",me=de+"--video",pe=de+"--fade",ve=de+"--slide",ge=de+"--no-controls",we=de+"--no-shadows",ye=de+"--pan-y",be=de+"--rtl",xe=de+"--no-captions",_e=de+"--toggle-arrows",Ce=le+"__stage",ke=Ce+"__frame",Te=ke+"--video",Pe=Ce+"__shaft",Se=le+"__grab",Me=le+"__pointer",Ee=le+"__arr",Fe=Ee+"--disabled",je=Ee+"--prev",ze=Ee+"--next",Ne=le+"__nav",$e=Ne+"-wrap",qe=Ne+"__shaft",Le=$e+"--vertical",Ae=$e+"--list",Ie=$e+"--horizontal",Oe=Ne+"--dots",De=Ne+"--thumbs",Re=Ne+"__frame",We=le+"__fade",He=We+"-front",Ke=We+"-rear",Ve=le+"__shadow",Be=Ve+"s",Qe=Be+"--left",Xe=Be+"--right",Ue=Be+"--top",Ye=Be+"--bottom",Ge=le+"__active",Je=le+"__select",Ze=le+"--hidden",tn=le+"--fullscreen",en=le+"__fullscreen-icon",nn=le+"__error",on=le+"__loading",rn=le+"__loaded",an=rn+"--full",sn=rn+"--img",un=le+"__grabbing",ln=le+"__img",cn=ln+"--full",dn=le+"__thumb",fn=dn+"__arr--left",hn=dn+"__arr--right",mn=dn+"-border",pn=le+"__html",vn=le+"-video-container",gn=le+"__video",wn=gn+"-play",yn=gn+"-close",bn=le+"__spinner",xn=le+"_horizontal_ratio",_n=le+"_vertical_ratio",Cn=o&&o.fn.jquery.split(".");if(!Cn||Cn[0]<1||1==Cn[0]&&Cn[1]<8)throw"Fotorama requires jQuery 1.8 or later and will not run without it.";var kn={},Tn=function(t,e,n){function o(t){g.cssText=t}function i(t,e){return typeof t===e}function r(t,e){return!!~(""+t).indexOf(e)}function a(t,e){for(var o in t){var i=t[o];if(!r(i,"-")&&g[i]!==n)return"pfx"==e?i:!0}return!1}function s(t,e,o){for(var r in t){var a=e[t[r]];if(a!==n)return o===!1?t[r]:i(a,"function")?a.bind(o||e):a}return!1}function u(t,e,n){var o=t.charAt(0).toUpperCase()+t.slice(1),r=(t+" "+b.join(o+" ")+o).split(" ");return i(e,"string")||i(e,"undefined")?a(r,e):(r=(t+" "+x.join(o+" ")+o).split(" "),s(r,e,n))}var l,c,d,f="2.8.3",h={},m=e.documentElement,p="modernizr",v=e.createElement(p),g=v.style,w=({}.toString," -webkit- -moz- -o- -ms- ".split(" ")),y="Webkit Moz O ms",b=y.split(" "),x=y.toLowerCase().split(" "),_={},C=[],k=C.slice,T=function(t,n,o,i){var r,a,s,u,l=e.createElement("div"),c=e.body,d=c||e.createElement("body");if(parseInt(o,10))for(;o--;)s=e.createElement("div"),s.id=i?i[o]:p+(o+1),l.appendChild(s);return r=["­",'<style id="s',p,'">',t,"</style>"].join(""),l.id=p,(c?l:d).innerHTML+=r,d.appendChild(l),c||(d.style.background="",d.style.overflow="hidden",u=m.style.overflow,m.style.overflow="hidden",m.appendChild(d)),a=n(l,t),c?l.parentNode.removeChild(l):(d.parentNode.removeChild(d),m.style.overflow=u),!!a},P={}.hasOwnProperty;d=i(P,"undefined")||i(P.call,"undefined")?function(t,e){return e in t&&i(t.constructor.prototype[e],"undefined")}:function(t,e){return P.call(t,e)},Function.prototype.bind||(Function.prototype.bind=function(t){var e=this;if("function"!=typeof e)throw new TypeError;var n=k.call(arguments,1),o=function(){if(this instanceof o){var i=function(){};i.prototype=e.prototype;var r=new i,a=e.apply(r,n.concat(k.call(arguments)));return Object(a)===a?a:r}return e.apply(t,n.concat(k.call(arguments)))};return o}),_.touch=function(){var n;return"ontouchstart"in t||t.DocumentTouch&&e instanceof DocumentTouch?n=!0:T(["@media (",w.join("touch-enabled),("),p,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(t){n=9===t.offsetTop}),n},_.csstransforms3d=function(){var t=!!u("perspective");return t&&"webkitPerspective"in m.style&&T("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(e){t=9===e.offsetLeft&&3===e.offsetHeight}),t},_.csstransitions=function(){return u("transition")};for(var S in _)d(_,S)&&(c=S.toLowerCase(),h[c]=_[S](),C.push((h[c]?"":"no-")+c));return h.addTest=function(t,e){if("object"==typeof t)for(var o in t)d(t,o)&&h.addTest(o,t[o]);else{if(t=t.toLowerCase(),h[t]!==n)return h;e="function"==typeof e?e():e,"undefined"!=typeof enableClasses&&enableClasses&&(m.className+=" "+(e?"":"no-")+t),h[t]=e}return h},o(""),v=l=null,h._version=f,h._prefixes=w,h._domPrefixes=x,h._cssomPrefixes=b,h.testProp=function(t){return a([t])},h.testAllProps=u,h.testStyles=T,h.prefixed=function(t,e,n){return e?u(t,e,n):u(t,"pfx")},h}(t,e),Pn={ok:!1,is:function(){return!1},request:function(){},cancel:function(){},event:"",prefix:""},Sn="webkit moz o ms khtml".split(" ");if("undefined"!=typeof e.cancelFullScreen)Pn.ok=!0;else for(var Mn=0,En=Sn.length;En>Mn;Mn++)if(Pn.prefix=Sn[Mn],"undefined"!=typeof e[Pn.prefix+"CancelFullScreen"]){Pn.ok=!0;break}Pn.ok&&(Pn.event=Pn.prefix+"fullscreenchange",Pn.is=function(){switch(this.prefix){case"":return e.fullScreen;case"webkit":return e.webkitIsFullScreen;default:return e[this.prefix+"FullScreen"]}},Pn.request=function(t){return""===this.prefix?t.requestFullScreen():t[this.prefix+"RequestFullScreen"]()},Pn.cancel=function(){return""===this.prefix?e.cancelFullScreen():e[this.prefix+"CancelFullScreen"]()});var Fn,jn={lines:12,length:5,width:2,radius:7,corners:1,rotate:15,color:"rgba(128, 128, 128, .75)",hwaccel:!0},zn={top:"auto",left:"auto",className:""};!function(t,e){Fn=e()}(this,function(){function t(t,n){var o,i=e.createElement(t||"div");for(o in n)i[o]=n[o];return i}function n(t){for(var e=1,n=arguments.length;n>e;e++)t.appendChild(arguments[e]);return t}function o(t,e,n,o){var i=["opacity",e,~~(100*t),n,o].join("-"),r=.01+n/o*100,a=Math.max(1-(1-t)/e*(100-r),t),s=f.substring(0,f.indexOf("Animation")).toLowerCase(),u=s&&"-"+s+"-"||"";return m[i]||(p.insertRule("@"+u+"keyframes "+i+"{0%{opacity:"+a+"}"+r+"%{opacity:"+t+"}"+(r+.01)+"%{opacity:1}"+(r+e)%100+"%{opacity:"+t+"}100%{opacity:"+a+"}}",p.cssRules.length),m[i]=1),i}function r(t,e){var n,o,r=t.style;for(e=e.charAt(0).toUpperCase()+e.slice(1),o=0;o<h.length;o++)if(n=h[o]+e,r[n]!==i)return n;return r[e]!==i?e:void 0}function a(t,e){for(var n in e)t.style[r(t,n)||n]=e[n];return t}function s(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)t[o]===i&&(t[o]=n[o])}return t}function u(t){for(var e={x:t.offsetLeft,y:t.offsetTop};t=t.offsetParent;)e.x+=t.offsetLeft,e.y+=t.offsetTop;return e}function l(t,e){return"string"==typeof t?t:t[e%t.length]}function c(t){return"undefined"==typeof this?new c(t):void(this.opts=s(t||{},c.defaults,v))}function d(){function e(e,n){return t("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',n)}p.addRule(".spin-vml","behavior:url(#default#VML)"),c.prototype.lines=function(t,o){function i(){return a(e("group",{coordsize:c+" "+c,coordorigin:-u+" "+-u}),{width:c,height:c})}function r(t,r,s){n(f,n(a(i(),{rotation:360/o.lines*t+"deg",left:~~r}),n(a(e("roundrect",{arcsize:o.corners}),{width:u,height:o.width,left:o.radius,top:-o.width>>1,filter:s}),e("fill",{color:l(o.color,t),opacity:o.opacity}),e("stroke",{opacity:0}))))}var s,u=o.length+o.width,c=2*u,d=2*-(o.width+o.length)+"px",f=a(i(),{position:"absolute",top:d,left:d});if(o.shadow)for(s=1;s<=o.lines;s++)r(s,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(s=1;s<=o.lines;s++)r(s);return n(t,f)},c.prototype.opacity=function(t,e,n,o){var i=t.firstChild;o=o.shadow&&o.lines||0,i&&e+o<i.childNodes.length&&(i=i.childNodes[e+o],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}}var f,h=["webkit","Moz","ms","O"],m={},p=function(){var o=t("style",{type:"text/css"});return n(e.getElementsByTagName("head")[0],o),o.sheet||o.styleSheet}(),v={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",direction:1,speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto",position:"relative"};c.defaults={},s(c.prototype,{spin:function(e){this.stop();var n,o,i=this,r=i.opts,s=i.el=a(t(0,{className:r.className}),{position:r.position,width:0,zIndex:r.zIndex}),l=r.radius+r.length+r.width;if(e&&(e.insertBefore(s,e.firstChild||null),o=u(e),n=u(s),a(s,{left:("auto"==r.left?o.x-n.x+(e.offsetWidth>>1):parseInt(r.left,10)+l)+"px",top:("auto"==r.top?o.y-n.y+(e.offsetHeight>>1):parseInt(r.top,10)+l)+"px"})),s.setAttribute("role","progressbar"),i.lines(s,i.opts),!f){var c,d=0,h=(r.lines-1)*(1-r.direction)/2,m=r.fps,p=m/r.speed,v=(1-r.opacity)/(p*r.trail/100),g=p/r.lines;!function w(){d++;for(var t=0;t<r.lines;t++)c=Math.max(1-(d+(r.lines-t)*g)%p*v,r.opacity),i.opacity(s,t*r.direction+h,c,r);i.timeout=i.el&&setTimeout(w,~~(1e3/m))}()}return i},stop:function(){var t=this.el;return t&&(clearTimeout(this.timeout),t.parentNode&&t.parentNode.removeChild(t),this.el=i),this},lines:function(e,i){function r(e,n){return a(t(),{position:"absolute",width:i.length+i.width+"px",height:i.width+"px",background:e,boxShadow:n,transformOrigin:"left",transform:"rotate("+~~(360/i.lines*u+i.rotate)+"deg) translate("+i.radius+"px,0)",borderRadius:(i.corners*i.width>>1)+"px"})}for(var s,u=0,c=(i.lines-1)*(1-i.direction)/2;u<i.lines;u++)s=a(t(),{position:"absolute",top:1+~(i.width/2)+"px",transform:i.hwaccel?"translate3d(0,0,0)":"",opacity:i.opacity,animation:f&&o(i.opacity,i.trail,c+u*i.direction,i.lines)+" "+1/i.speed+"s linear infinite"}),i.shadow&&n(s,a(r("#000","0 0 4px #000"),{top:"2px"})),n(e,n(s,r(l(i.color,u),"0 0 1px rgba(0,0,0,.1)")));return e},opacity:function(t,e,n){e<t.childNodes.length&&(t.childNodes[e].style.opacity=n)}});var g=a(t("group"),{behavior:"url(#default#VML)"});return!r(g,"transform")&&g.adj?d():f=r(g,"animation"),c});var Nn,$n,qn=o(t),Ln=o(e),An="quirks"===n.hash.replace("#",""),In=Tn.csstransforms3d,On=In&&!An,Dn=In||"CSS1Compat"===e.compatMode,Rn=Pn.ok,Wn=navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i),Hn=!On||Wn,Kn=navigator.msPointerEnabled,Vn="onwheel"in e.createElement("div")?"wheel":e.onmousewheel!==i?"mousewheel":"DOMMouseScroll",Bn=250,Qn=300,Xn=1400,Un=5e3,Yn=2,Gn=64,Jn=500,Zn=333,to="$stageFrame",eo="$navDotFrame",no="$navThumbFrame",oo="auto",io=r([.1,0,.25,1]),ro=1200,ao=1,so={width:null,minwidth:null,maxwidth:"100%",height:null,minheight:null,maxheight:null,ratio:null,margin:Yn,nav:"dots",navposition:"bottom",navwidth:null,thumbwidth:Gn,thumbheight:Gn,thumbmargin:Yn,thumbborderwidth:Yn,allowfullscreen:!1,transition:"slide",clicktransition:null,transitionduration:Qn,captions:!0,startindex:0,loop:!1,autoplay:!1,stopautoplayontouch:!0,keyboard:!1,arrows:!0,click:!0,swipe:!1,trackpad:!1,shuffle:!1,direction:"ltr",shadows:!0,spinner:null,showcaption:!0,navdir:"horizontal",navarrows:!0,navtype:"thumbs"},uo={left:!0,right:!0,down:!1,up:!1,space:!1,home:!1,end:!1};z.stop=function(t){z.ii[t]=!1};var lo,co,fo,ho,mo,po=function(){function t(t,e,n){var o=e/n;1>=o?(t.parent().removeClass(xn),t.parent().addClass(_n)):(t.parent().removeClass(_n),t.parent().addClass(xn))}function e(t,e,n){var r=n;t.attr(r)||t.attr(r)===i||t.attr(r,e),t.find("["+r+"]").length&&t.find("["+r+"]").each(function(){o(this).attr(r,e)})}function n(t,e,n){var o,i=!1;return o=t.showCaption===n||t.showCaption===!0?!0:!1,e?(t.caption&&o&&(i=!0),i):!1}return{setRatio:t,setThumbAttr:e,isExpectedCaption:n}}(po||{},jQuery);jQuery.Fotorama=function(n,r){function a(){o.each(Ro,function(t,e){if(!e.i){e.i=Ei++;var n=P(e.video,!0);if(n){var o={};e.video=n,e.img||e.thumb?e.thumbsReady=!0:o=S(e,Ro,Ti),M(Ro,{img:o.img,thumb:o.thumb},e.i,Ti)}}})}function u(t){return mi[t]||Ti.fullScreen}function f(){if($i!==i)if("vertical"==r.navdir){var t=r.thumbwidth+r.thumbmargin;$i.css("left",t),Ii.css("right",t),Xi.css("right",t),Ni.css("width",Ni.css("width")+t),qi.css("max-width",Ni.width()-t)}else $i.css("left",""),Ii.css("right",""),Xi.css("right",""),Ni.css("width",Ni.css("width")+t),qi.css("max-width","")}function m(t){var e,n="keydown."+le,o=le+Pi,i="keydown."+o,a="keyup."+o,s="resize."+o+" orientationchange."+o;t?(Ln.on(i,function(t){var n,o;Vo&&27===t.keyCode?(n=!0,Eo(Vo,!0,!0)):(Ti.fullScreen||r.keyboard&&!Ti.index)&&(27===t.keyCode?(n=!0,Ti.cancelFullScreen()):t.shiftKey&&32===t.keyCode&&u("space")||37===t.keyCode&&u("left")||38===t.keyCode&&u("up")?(Ti.longPress.progress(),o="<"):32===t.keyCode&&u("space")||39===t.keyCode&&u("right")||40===t.keyCode&&u("down")?(Ti.longPress.progress(),o=">"):36===t.keyCode&&u("home")?(Ti.longPress.progress(),o="<<"):35===t.keyCode&&u("end")&&(Ti.longPress.progress(),o=">>")),(n||o)&&J(t),e={index:o,slow:t.altKey,user:!0},o&&(Ti.longPress.inProgress?Ti.showWhileLongPress(e):Ti.show(e))}),t&&Ln.on(a,function(){Ti.longPress.inProgress&&Ti.showEndLongPress({user:!0}),Ti.longPress.reset()}),Ti.index||Ln.off(n).on(n,"textarea, input, select",function(t){!$n.hasClass(ce)&&t.stopPropagation()}),qn.on(s,Ti.resize)):(Ln.off(i),qn.off(s))}function y(t){t!==y.f&&(t?(n.addClass(le+" "+Si).before(zi).before(ji),se(Ti)):(zi.detach(),ji.detach(),n.html(Fi.urtext).removeClass(Si),ue(Ti)),m(t),y.f=t)}function b(){Ro=Ti.data=Ro||R(r.data)||E(n),Wo=Ti.size=Ro.length,Do.ok&&r.shuffle&&D(Ro),a(),tr=oe(tr),Wo&&y(!0)}function C(){var t=2>Wo||Vo;or.noMove=t||si,or.noSwipe=t||!r.swipe,!di&&qi.toggleClass(Se,!r.click&&!or.noMove&&!or.noSwipe),Kn&&Ni.toggleClass(ye,!or.noSwipe)}function k(t){t===!0&&(t=""),r.autoplay=Math.max(+t||Un,1.5*ci)}function T(t){t.navarrows&&"thumbs"===t.nav?(Bi.show(),Qi.show()):(Bi.hide(),Qi.hide())}function F(t,e){return Math.floor(Ni.width()/(e.thumbwidth+e.thumbmargin))}function X(){function t(t,n){e[t?"add":"remove"].push(n)}r.nav&&"dots"!==r.nav||(r.navdir="horizontal"),Ti.options=r=H(r),ao=F(Ni,r),si="crossfade"===r.transition||"dissolve"===r.transition,ei=r.loop&&(Wo>2||si&&(!di||"slide"!==di)),ci=+r.transitionduration||Qn,hi="rtl"===r.direction,mi=o.extend({},r.keyboard&&uo,r.keyboard),T(r);var e={add:[],remove:[]};Wo>1?(ni=r.nav,ii="top"===r.navposition,e.remove.push(Je),Oi.toggle(r.arrows)):(ni=!1,Oi.hide()),Cn(),Ko=new Fn(o.extend(jn,r.spinner,zn,{direction:hi?-1:1})),Yn(),so(),io(),r.autoplay&&k(r.autoplay),ui=h(r.thumbwidth)||Gn,li=h(r.thumbheight)||Gn,ir.ok=ar.ok=r.trackpad&&!Hn,C(),wo(r,[nr]),oi="thumbs"===ni,Di.filter(":hidden")&&ni&&Di.show(),oi?(Mn(Wo,"navThumb"),Ho=Ki,ki=no,$(ji,o.Fotorama.jst.style({w:ui,h:li,b:r.thumbborderwidth,m:r.thumbmargin,s:Pi,q:!Dn})),Ri.addClass(De).removeClass(Oe)):"dots"===ni?(Mn(Wo,"navDot"),Ho=Hi,ki=eo,Ri.addClass(Oe).removeClass(De)):(Di.hide(),ni=!1,Ri.removeClass(De+" "+Oe)),ni&&(ii?Di.insertBefore($i):Di.insertAfter($i),Wn.nav=!1,Wn(Ho,Wi,"nav")),ri=r.allowfullscreen,ri?(Xi.prependTo($i),ai=Rn&&"native"===ri):(Xi.detach(),ai=!1),t(si,pe),t(!si,ve),t(!r.captions,xe),t(hi,be),t("always"!==r.arrows,_e),fi=r.shadows&&!Hn,t(!fi,we),Ni.addClass(e.add.join(" ")).removeClass(e.remove.join(" ")),er=o.extend({},r),f()}function ne(t){return 0>t?(Wo+t%Wo)%Wo:t>=Wo?t%Wo:t}function oe(t){return s(t,0,Wo-1)}function ae(t){return ei?ne(t):oe(t)}function We(t){return t>0||ei?t-1:!1}function He(t){return Wo-1>t||ei?t+1:!1}function Ke(){or.min=ei?-1/0:-g(Wo-1,nr.w,r.margin,Xo),or.max=ei?1/0:-g(0,nr.w,r.margin,Xo),or.snap=nr.w+r.margin}function Ve(){var t="vertical"===r.navdir,e=t?Wi.height():Wi.width(),n=t?nr.h:nr.nw;rr.min=Math.min(0,n-e),rr.max=0,rr.direction=r.navdir,Wi.toggleClass(Se,!(rr.noMove=rr.min===rr.max))}function un(t,e,n){if("number"==typeof t){t=new Array(t);var i=!0}return o.each(t,function(t,o){if(i&&(o=t),"number"==typeof o){var r=Ro[ne(o)];if(r){var a="$"+e+"Frame",s=r[a];n.call(this,t,o,r,s,a,s&&s.data())}}})}function dn(t,e,n,o){(!pi||"*"===pi&&o===ti)&&(t=v(r.width)||v(t)||Jn,e=v(r.height)||v(e)||Zn,Ti.resize({width:t,ratio:r.ratio||n||t/e},0,o!==ti&&"*"))}function xn(t,e,n,i){un(t,e,function(t,a,s,u,l,c){function d(t){var e=ne(a);yo(t,{index:e,src:b,frame:Ro[e]})}function f(){g.remove(),o.Fotorama.cache[b]="error",s.html&&"stage"===e||!x||x===b?(!b||s.html||p?"stage"===e&&(u.trigger("f:load").removeClass(on+" "+nn).addClass(rn),d("load"),dn()):(u.trigger("f:error").removeClass(on).addClass(nn),d("error")),c.state="error",!(Wo>1&&Ro[a]===s)||s.html||s.deleted||s.video||p||(s.deleted=!0,Ti.splice(a,1))):(s[y]=b=x,xn([a],e,n,!0))}function h(){o.Fotorama.measures[b]=w.measures=o.Fotorama.measures[b]||{width:v.width,height:v.height,ratio:v.width/v.height},dn(w.measures.width,w.measures.height,w.measures.ratio,a),g.off("load error").addClass(ln+(p?" "+cn:"")).prependTo(u),u.hasClass(ke)&&!u.hasClass(vn)&&u.attr("href",g.attr("src")),N(g,(o.isFunction(n)?n():n)||nr),o.Fotorama.cache[b]=c.state="loaded",setTimeout(function(){u.trigger("f:load").removeClass(on+" "+nn).addClass(rn+" "+(p?an:sn)),"stage"===e?d("load"):(s.thumbratio===oo||!s.thumbratio&&r.thumbratio===oo)&&(s.thumbratio=w.measures.ratio,Io())},0)}function m(){var t=10;z(function(){return!_i||!t--&&!Hn},function(){h()})}if(u){var p=Ti.fullScreen&&s.full&&s.full!==s.img&&!c.$full&&"stage"===e;if(!c.$img||i||p){var v=new Image,g=o(v),w=g.data();c[p?"$full":"$img"]=g;var y="stage"===e?p?"full":"img":"thumb",b=s[y],x=p?null:s["stage"===e?"thumb":"img"];if("navThumb"===e&&(u=c.$wrap),!b)return void f();o.Fotorama.cache[b]?!function _(){"error"===o.Fotorama.cache[b]?f():"loaded"===o.Fotorama.cache[b]?setTimeout(m,0):setTimeout(_,100)}():(o.Fotorama.cache[b]="*",g.on("load",m).on("error",f)),c.state="",v.src=b,c.data.caption&&(v.alt=c.data.caption||""),po.isExpectedCaption(s,r.showcaption)&&o(v).attr("aria-labelledby",s.labelledby)}}})}function _n(t){Zi.append(Ko.spin().el).appendTo(t)}function Cn(){Zi.detach(),Ko&&Ko.stop()}function kn(){var t=Bo[to];t&&!t.data().state&&(_n(t),t.on("f:load f:error",function(){t.off("f:load f:error"),Cn()}))}function Sn(t){Y(t,qo),G(t,function(){setTimeout(function(){W(Ri)},0),fo({time:ci,guessIndex:o(this).data().eq,minMax:rr})})}function Mn(t,e){un(t,e,function(t,n,i,a,s,u){if(!a){a=i[s]=Ni[s].clone(),u=a.data(),u.data=i;var l=a[0],c="labelledby"+o.now();"stage"===e?(i.html&&o('<div class="'+pn+'"></div>').append(i._html?o(i.html).removeAttr("id").html(i._html):i.html).appendTo(a),i.id&&(c=i.id||c),i.labelledby=c,po.isExpectedCaption(i,r.showcaption)&&o(o.Fotorama.jst.frameCaption({caption:i.caption,labelledby:c})).appendTo(a),i.video&&a.addClass(Te).append(Yi.clone()),G(l,function(){setTimeout(function(){W($i)},0),zo({index:u.eq,user:!0})}),Li=Li.add(a)):"navDot"===e?(Sn(l),Hi=Hi.add(a)):"navThumb"===e&&(Sn(l),u.$wrap=a.children(":first"),Ki=Ki.add(a),i.video&&u.$wrap.append(Yi.clone()))}})}function En(t,e){return t&&t.length&&N(t,e)}function An(t){un(t,"stage",function(t,e,n,i,a,s){if(i){var u=ne(e);s.eq=u,ur[to][u]=i.css(o.extend({left:si?0:g(e,nr.w,r.margin,Xo)},si&&d(0))),j(i[0])&&(i.appendTo(qi),Eo(n.$video)),En(s.$img,nr),En(s.$full,nr),!i.hasClass(ke)||"false"===i.attr("aria-hidden")&&i.hasClass(Ge)||i.attr("aria-hidden","true")}})}function In(t,e){var n,i;"thumbs"!==ni||isNaN(t)||(n=-t,i=-t+nr.nw,"vertical"===r.navdir&&(t-=r.thumbheight,i=-t+nr.h),Ki.each(function(){var t=o(this),a=t.data(),s=a.eq,u=function(){return{h:li,w:a.w}},l=u(),c="vertical"===r.navdir?a.t>i:a.l>i;l.w=a.w,a.l+a.w<n||c||En(a.$img,l)||e&&xn([s],"navThumb",u)}))}function Wn(t,e,n){if(!Wn[n]){var i="nav"===n&&oi,a=0,s=0;e.append(t.filter(function(){for(var t,e=o(this),n=e.data(),i=0,r=Ro.length;r>i;i++)if(n.data===Ro[i]){t=!0,n.eq=i;break}return t||e.remove()&&!1}).sort(function(t,e){return o(t).data().eq-o(e).data().eq}).each(function(){var t=o(this),e=t.data();po.setThumbAttr(t,e.data.caption,"aria-label")}).each(function(){if(i){var t=o(this),e=t.data(),n=Math.round(li*e.data.thumbratio)||ui,u=Math.round(ui/e.data.thumbratio)||li;e.t=s,e.h=u,e.l=a,e.w=n,t.css({width:n}),s+=u+r.thumbmargin,a+=n+r.thumbmargin}})),Wn[n]=!0}}function Vn(t){return t-lr>nr.w/3}function Xn(t){return!(ei||tr+t&&tr-Wo+t||Vo)}function Yn(){var t=Xn(0),e=Xn(1);Ai.toggleClass(Fe,t).attr(U(t)),Ii.toggleClass(Fe,e).attr(U(e))}function io(){var t=!1,e=!1;if("thumbs"!==r.navtype||r.loop||(t=0==tr?!0:!1,e=tr==r.data.length-1?!0:!1),"slides"===r.navtype){var n=l(Wi,r.navdir);t=n>=rr.max?!0:!1,e=n<=rr.min?!0:!1}Bi.toggleClass(Fe,t).attr(U(t)),Qi.toggleClass(Fe,e).attr(U(e))}function so(){ir.ok&&(ir.prevent={"<":Xn(0),">":Xn(1)})}function lo(t){var e,n,o,i,a=t.data();oi?(e=a.l,n=a.t,o=a.w,i=a.h):(e=t.position().left,o=t.width());var s={c:e+o/2,min:-e+10*r.thumbmargin,max:-e+nr.w-o-10*r.thumbmargin},u={c:n+i/2,min:-n+10*r.thumbmargin,max:-n+nr.h-i-10*r.thumbmargin};return"vertical"===r.navdir?u:s}function co(t){var e=Bo[ki].data();te(Vi,{time:1.2*t,pos:"vertical"===r.navdir?e.t:e.l,width:e.w,height:e.h,direction:r.navdir})}function fo(t){var e,n,o,i,a,u,c,d,f=Ro[t.guessIndex][ki],h=r.navtype;f&&("thumbs"===h?(e=rr.min!==rr.max,o=t.minMax||e&&lo(Bo[ki]),i=e&&(t.keep&&fo.t?fo.l:s((t.coo||nr.nw/2)-lo(f).c,o.min,o.max)),a=e&&(t.keep&&fo.l?fo.l:s((t.coo||nr.nw/2)-lo(f).c,o.min,o.max)),u="vertical"===r.navdir?i:a,c=e&&s(u,rr.min,rr.max)||0,n=1.1*t.time,te(Wi,{time:n,pos:c,direction:r.navdir,onEnd:function(){In(c,!0),io()}}),Mo(Ri,q(c,rr.min,rr.max,r.navdir)),fo.l=u):(d=l(Wi,r.navdir),n=1.11*t.time,c=Q(r,rr,t.guessIndex,d,f,Di,r.navdir),te(Wi,{time:n,pos:c,direction:r.navdir,onEnd:function(){In(c,!0),io() -}}),Mo(Ri,q(c,rr.min,rr.max,r.navdir))))}function ho(){mo(ki),sr[ki].push(Bo[ki].addClass(Ge).attr("data-active",!0))}function mo(t){for(var e=sr[t];e.length;)e.shift().removeClass(Ge).attr("data-active",!1)}function vo(t){var e=ur[t];o.each(Qo,function(t,n){delete e[ne(n)]}),o.each(e,function(t,n){delete e[t],n.detach()})}function go(t){Xo=Uo=tr;var e=Bo[to];e&&(mo(to),sr[to].push(e.addClass(Ge).attr("data-active",!0)),e.hasClass(ke)&&e.attr("aria-hidden","false"),t||Ti.showStage.onEnd(!0),x(qi,0,!0),vo(to),An(Qo),Ke(),Ve(),Y(qi[0],function(){n.hasClass(tn)||(Ti.requestFullScreen(),o(Ui).trigger("focus"))}))}function wo(t,e){t&&o.each(e,function(e,n){n&&o.extend(n,{width:t.width||n.width,height:t.height,minwidth:t.minwidth,maxwidth:t.maxwidth,minheight:t.minheight,maxheight:t.maxheight,ratio:K(t.ratio)})})}function yo(t,e){n.trigger(le+":"+t,[Ti,e])}function bo(){clearTimeout(xo.t),_i=1,r.stopautoplayontouch?Ti.stopAutoplay():yi=!0}function xo(){_i&&(r.stopautoplayontouch||(_o(),Co()),xo.t=setTimeout(function(){_i=0},Qn+Bn))}function _o(){yi=!(!Vo&&!bi)}function Co(){if(clearTimeout(Co.t),z.stop(Co.w),!r.autoplay||yi)return void(Ti.autoplay&&(Ti.autoplay=!1,yo("stopautoplay")));Ti.autoplay||(Ti.autoplay=!0,yo("startautoplay"));var t=tr,e=Bo[to].data();Co.w=z(function(){return e.state||t!==tr},function(){Co.t=setTimeout(function(){if(!yi&&t===tr){var e=Zo,n=Ro[e][to].data();Co.w=z(function(){return n.state||e!==Zo},function(){yi||e!==Zo||Ti.show(ei?Z(!hi):Zo)})}},r.autoplay)})}function ko(t){var e;return"object"!=typeof t?(e=t,t={}):e=t.index,e=">"===e?Uo+1:"<"===e?Uo-1:"<<"===e?0:">>"===e?Wo-1:e,e=isNaN(e)?i:e,e="undefined"==typeof e?tr||0:e}function To(t){Ti.activeIndex=tr=ae(t),Go=We(tr),Jo=He(tr),Zo=ne(tr+(hi?-1:1)),Qo=[tr,Go,Jo],Uo=ei?t:tr}function Po(t){var e=Math.abs(Yo-Uo),n=_(t.time,function(){return Math.min(ci*(1+(e-1)/12),2*ci)});return t.slow&&(n*=10),n}function So(){Ti.fullScreen&&(Ti.fullScreen=!1,Rn&&Pn.cancel(Mi),$n.removeClass(ce),Nn.removeClass(ce),n.removeClass(tn).insertAfter(zi),nr=o.extend({},xi),Eo(Vo,!0,!0),$o("x",!1),Ti.resize(),xn(Qo,"stage"),W(qn,gi,vi),yo("fullscreenexit"))}function Mo(t,e){fi&&(t.removeClass(Qe+" "+Xe),t.removeClass(Ue+" "+Ye),e&&!Vo&&t.addClass(e.replace(/^|\s/g," "+Be+"--")))}function Eo(t,e,n){e&&(Ni.removeClass(me),Vo=!1,C()),t&&t!==Vo&&(t.remove(),yo("unloadvideo")),n&&(_o(),Co())}function Fo(t){Ni.toggleClass(ge,t)}function jo(t){if(!or.flow){var e=t?t.pageX:jo.x,n=e&&!Xn(Vn(e))&&r.click;jo.p!==n&&$i.toggleClass(Me,n)&&(jo.p=n,jo.x=e)}}function zo(t){clearTimeout(zo.t),r.clicktransition&&r.clicktransition!==r.transition?setTimeout(function(){var e=r.transition;Ti.setOptions({transition:r.clicktransition}),di=e,zo.t=setTimeout(function(){Ti.show(t)},10)},0):Ti.show(t)}function No(t,e){var n=t.target,i=o(n);i.hasClass(wn)?Ti.playVideo():n===Ui?Ti.toggleFullScreen():Vo?n===Ji&&Eo(Vo,!0,!0):e?Fo():r.click&&zo({index:t.shiftKey||Z(Vn(t._x)),slow:t.altKey,user:!0})}function $o(t,e){or[t]=rr[t]=e}function qo(t){var e=o(this).data().eq;zo("thumbs"===r.navtype?{index:e,slow:t.altKey,user:!0,coo:t._x-Ri.offset().left}:{index:e,slow:t.altKey,user:!0})}function Lo(t){zo({index:Oi.index(this)?">":"<",slow:t.altKey,user:!0})}function Ao(t){G(t,function(){setTimeout(function(){W($i)},0),Fo(!1)})}function Io(){if(b(),X(),!Io.i){Io.i=!0;var t=r.startindex;tr=Xo=Uo=Yo=ti=ae(t)||0}if(Wo){if(Oo())return;Vo&&Eo(Vo,!0),Qo=[],vo(to),Io.ok=!0,Ti.show({index:tr,time:0}),Ti.resize()}else Ti.destroy()}function Oo(){return!Oo.f===hi?(Oo.f=hi,tr=Wo-1-tr,Ti.reverse(),!0):void 0}function Do(){Do.ok&&(Do.ok=!1,yo("ready"))}Nn=o("html"),$n=o("body");var Ro,Wo,Ho,Ko,Vo,Bo,Qo,Xo,Uo,Yo,Go,Jo,Zo,ti,ei,ni,oi,ii,ri,ai,si,ui,li,ci,di,fi,hi,mi,pi,vi,gi,wi,yi,bi,xi,_i,Ci,ki,Ti=this,Pi=o.now(),Si=le+Pi,Mi=n[0],Ei=1,Fi=n.data(),ji=o("<style></style>"),zi=o(A(Ze)),Ni=n.find(I(de)),$i=Ni.find(I(Ce)),qi=($i[0],n.find(I(Pe))),Li=o(),Ai=n.find(I(je)),Ii=n.find(I(ze)),Oi=n.find(I(Ee)),Di=n.find(I($e)),Ri=Di.find(I(Ne)),Wi=Ri.find(I(qe)),Hi=o(),Ki=o(),Vi=(qi.data(),Wi.data(),n.find(I(mn))),Bi=n.find(I(fn)),Qi=n.find(I(hn)),Xi=n.find(I(en)),Ui=Xi[0],Yi=o(A(wn)),Gi=n.find(I(yn)),Ji=Gi[0],Zi=o(A(bn)),tr=!1,er={},nr={},or={},ir={},rr={},ar={},sr={},ur={},lr=0,cr=[];Ni[to]=o(Tn.touch?'<a class="'+ke+'" target="_blank"></a>':'<div class="'+ke+'"></div>'),Ni[no]=o(o.Fotorama.jst.thumb()),Ni[eo]=o(o.Fotorama.jst.dots()),sr[to]=[],sr[no]=[],sr[eo]=[],ur[to]={},Ni.addClass(On?he:fe),Fi.fotorama=this,Ti.startAutoplay=function(t){return Ti.autoplay?this:(yi=bi=!1,k(t||r.autoplay),Co(),this)},Ti.stopAutoplay=function(){return Ti.autoplay&&(yi=bi=!0,Co()),this},Ti.showSlide=function(t){var e,n=l(Wi,r.navdir),o=550,i="horizontal"===r.navdir?r.thumbwidth:r.thumbheight,a=function(){io()};"next"===t&&(e=n-(i+r.margin)*ao),"prev"===t&&(e=n+(i+r.margin)*ao),e=B(e,rr),In(e,!0),te(Wi,{time:o,pos:e,direction:r.navdir,onEnd:a})},Ti.showWhileLongPress=function(t){if(!Ti.longPress.singlePressInProgress){var e=ko(t);To(e);var n=Po(t)/50,o=Bo;Ti.activeFrame=Bo=Ro[tr];var i=o===Bo&&!t.user;return Ti.showNav(i,t,n),this}},Ti.showEndLongPress=function(t){if(!Ti.longPress.singlePressInProgress){var e=ko(t);To(e);var n=Po(t)/50,o=Bo;Ti.activeFrame=Bo=Ro[tr];var i=o===Bo&&!t.user;return Ti.showStage(i,t,n),wi="undefined"!=typeof Yo&&Yo!==tr,Yo=tr,this}},Ti.showStage=function(t,e,n){Eo(Vo,Bo.i!==Ro[ne(Xo)].i),Mn(Qo,"stage"),An(Hn?[Uo]:[Uo,We(Uo),He(Uo)]),$o("go",!0),t||yo("show",{user:e.user,time:n}),yi=!0;var o=e.overPos,i=Ti.showStage.onEnd=function(n){if(!i.ok){if(i.ok=!0,n||go(!0),t||yo("showend",{user:e.user}),!n&&di&&di!==r.transition)return Ti.setOptions({transition:di}),void(di=!1);kn(),xn(Qo,"stage"),$o("go",!1),so(),jo(),_o(),Co()}};if(si){var a=Bo[to],s=Ro[Yo]&&tr!==Yo?Ro[Yo][to]:null;ee(a,s,Li,{time:n,method:r.transition,onEnd:i},cr)}else te(qi,{pos:-g(Uo,nr.w,r.margin,Xo),overPos:o,time:n,onEnd:i});Yn()},Ti.showNav=function(t,e,n){if(io(),ni){ho();var o=oe(tr+s(Uo-Yo,-1,1));fo({time:n,coo:o!==tr&&e.coo,guessIndex:"undefined"!=typeof e.coo?o:tr,keep:t}),oi&&co(n)}},Ti.show=function(t){Ti.longPress.singlePressInProgress=!0;var e=ko(t);To(e);var n=Po(t),o=Bo;Ti.activeFrame=Bo=Ro[tr];var i=o===Bo&&!t.user;return Ti.showStage(i,t,n),Ti.showNav(i,t,n),wi="undefined"!=typeof Yo&&Yo!==tr,Yo=tr,Ti.longPress.singlePressInProgress=!1,this},Ti.requestFullScreen=function(){return ri&&!Ti.fullScreen&&(vi=qn.scrollTop(),gi=qn.scrollLeft(),W(qn),$o("x",!0),xi=o.extend({},nr),n.addClass(tn).appendTo($n.addClass(ce)),Nn.addClass(ce),Eo(Vo,!0,!0),Ti.fullScreen=!0,ai&&Pn.request(Mi),Ti.resize(),xn(Qo,"stage"),kn(),yo("fullscreenenter")),this},Ti.cancelFullScreen=function(){return ai&&Pn.is()?Pn.cancel(e):So(),this},Ti.toggleFullScreen=function(){return Ti[(Ti.fullScreen?"cancel":"request")+"FullScreen"]()},V(e,Pn.event,function(){!Ro||Pn.is()||Vo||So()}),Ti.resize=function(e){if(!Ro)return this;var n=arguments[1]||0,i=arguments[2];ao=F(Ni,r),wo(Ti.fullScreen?{width:o(t).width(),maxwidth:null,minwidth:null,height:o(t).height(),maxheight:null,minheight:null}:H(e),[nr,i||Ti.fullScreen||r]);var a=nr.width,u=nr.height,l=nr.ratio,c=qn.height()-(ni?Ri.height():0);if(v(a)&&(Ni.css({width:""}),Ni.css({height:""}),$i.css({width:""}),$i.css({height:""}),$i.css({"line-height":""}),qi.css({width:""}),qi.css({height:""}),Ri.css({width:""}),Ri.css({height:""}),Ni.css({minWidth:nr.minwidth||0,maxWidth:nr.maxwidth||ro}),a=nr.W=nr.w=Ni.width(),nr.nw=ni&&p(r.navwidth,a)||a,qi.css({width:nr.w,marginLeft:(nr.W-nr.w)/2}),u=p(u,c),u=u||l&&a/l)){if(a=Math.round(a),u=nr.h=Math.round(s(u,p(nr.minheight,c),p(nr.maxheight,c))),$i.css({width:a,height:u,"line-height":u+"px"}),"vertical"!==r.navdir||Ti.fullscreen||Ri.width(r.thumbwidth+2*r.thumbmargin),"horizontal"!==r.navdir||Ti.fullscreen||Ri.height(r.thumbheight+2*r.thumbmargin),"vertical"===r.navdir&&Ti.fullScreen&&$i.css("height",o(t).height()),"horizontal"===r.navdir&&Ti.fullScreen&&$i.css("height",o(t).height()-(r.thumbheight+2*r.thumbmargin)),ni){switch(r.navdir){case"vertical":Di.removeClass(Ie),Di.removeClass(Ae),Di.addClass(Le),Ri.stop().animate({height:nr.h,width:r.thumbwidth},n);break;case"list":Di.removeClass(Le),Di.removeClass(Ie),Di.addClass(Ae);break;default:Di.removeClass(Le),Di.removeClass(Ae),Di.addClass(Ie),Ri.stop().animate({width:nr.nw},n)}go(),fo({guessIndex:tr,time:n,keep:!0}),oi&&Wn.nav&&co(n)}pi=i||!0,Do.ok=!0,Do()}return lr=$i.offset().left,f(),this},Ti.setOptions=function(t){return o.extend(r,t),Io(),this},Ti.shuffle=function(){return Ro&&D(Ro)&&Io(),this},Ti.longPress={threshold:1,count:0,thumbSlideTime:20,progress:function(){this.inProgress||(this.count++,this.inProgress=this.count>this.threshold)},end:function(){this.inProgress&&(this.isEnded=!0)},reset:function(){this.count=0,this.inProgress=!1,this.isEnded=!1}},Ti.destroy=function(){return Ti.cancelFullScreen(),Ti.stopAutoplay(),Ro=Ti.data=null,y(),Qo=[],vo(to),Io.ok=!1,this},Ti.playVideo=function(){var t=Bo,e=t.video,n=tr;return"object"==typeof e&&t.videoReady&&(ai&&Ti.fullScreen&&Ti.cancelFullScreen(),z(function(){return!Pn.is()||n!==tr},function(){n===tr&&(t.$video=t.$video||o(A(gn)).append(O(e)),t.$video.appendTo(t[to]),Ni.addClass(me),Vo=t.$video,C(),Oi.blur(),Xi.blur(),yo("loadvideo"))})),this},Ti.stopVideo=function(){return Eo(Vo,!0,!0),this},$i.on("mousemove",jo),or=ie(qi,{onStart:bo,onMove:function(t,e){Mo($i,e.edge)},onTouchEnd:xo,onEnd:function(t){Mo($i);var e=(Kn&&!Ci||t.touch)&&r.arrows&&"always"!==r.arrows;if(t.moved||e&&t.pos!==t.newPos&&!t.control){var n=w(t.newPos,nr.w,r.margin,Xo);Ti.show({index:n,time:si?ci:t.time,overPos:t.overPos,user:!0})}else t.aborted||t.control||No(t.startEvent,e)},timeLow:1,timeHigh:1,friction:2,select:"."+Je+", ."+Je+" *",$wrap:$i,direction:"horizontal"}),rr=ie(Wi,{onStart:bo,onMove:function(t,e){Mo(Ri,e.edge)},onTouchEnd:xo,onEnd:function(t){function e(){fo.l=t.newPos,_o(),Co(),In(t.newPos,!0),io()}if(t.moved)t.pos!==t.newPos?(yi=!0,te(Wi,{time:t.time,pos:t.newPos,overPos:t.overPos,direction:r.navdir,onEnd:e}),In(t.newPos),fi&&Mo(Ri,q(t.newPos,rr.min,rr.max,t.dir))):e();else{var n=t.$target.closest("."+Re,Wi)[0];n&&qo.call(n,t.startEvent)}},timeLow:.5,timeHigh:2,friction:5,$wrap:Ri,direction:r.navdir}),ir=re($i,{shift:!0,onEnd:function(t,e){bo(),xo(),Ti.show({index:e,slow:t.altKey})}}),ar=re(Ri,{onEnd:function(t,e){bo(),xo();var n=x(Wi)+.25*e;Wi.css(c(s(n,rr.min,rr.max),r.navdir)),fi&&Mo(Ri,q(n,rr.min,rr.max,r.navdir)),ar.prevent={"<":n>=rr.max,">":n<=rr.min},clearTimeout(ar.t),ar.t=setTimeout(function(){fo.l=n,In(n,!0)},Bn),In(n)}}),Ni.hover(function(){setTimeout(function(){_i||Fo(!(Ci=!0))},0)},function(){Ci&&Fo(!(Ci=!1))}),L(Oi,function(t){J(t),Lo.call(this,t)},{onStart:function(){bo(),or.control=!0},onTouchEnd:xo}),L(Bi,function(t){J(t),"thumbs"===r.navtype?Ti.show("<"):Ti.showSlide("prev")}),L(Qi,function(t){J(t),"thumbs"===r.navtype?Ti.show(">"):Ti.showSlide("next")}),Oi.each(function(){Y(this,function(t){Lo.call(this,t)}),Ao(this)}),Y(Ui,function(){Ti.toggleFullScreen(),o(Ui).trigger("focus")}),Ao(Ui),o.each("load push pop shift unshift reverse sort splice".split(" "),function(t,e){Ti[e]=function(){return Ro=Ro||[],"load"!==e?Array.prototype[e].apply(Ro,arguments):arguments[0]&&"object"==typeof arguments[0]&&arguments[0].length&&(Ro=R(arguments[0])),Io(),Ti}}),Io()},o.fn.fotorama=function(e){return this.each(function(){var n=this,i=o(this),r=i.data(),a=r.fotorama;a?a.setOptions(e,!0):z(function(){return!F(n)},function(){r.urtext=i.html(),new o.Fotorama(i,o.extend({},so,t.fotoramaDefaults,e,r))})})},o.Fotorama.instances=[],o.Fotorama.cache={},o.Fotorama.measures={},o=o||{},o.Fotorama=o.Fotorama||{},o.Fotorama.jst=o.Fotorama.jst||{},o.Fotorama.jst.dots=function(){{var t="";kn.escape}return t+='<div class="fotorama__nav__frame fotorama__nav__frame--dot" tabindex="0" role="button" data-gallery-role="nav-frame" data-nav-type="thumb" aria-label>\r\n <div class="fotorama__dot"></div>\r\n</div>'},o.Fotorama.jst.frameCaption=function(t){{var e,n="";kn.escape}return n+='<div class="fotorama__caption" aria-hidden="true">\r\n <div class="fotorama__caption__wrap" id="'+(null==(e=t.labelledby)?"":e)+'">'+(null==(e=t.caption)?"":e)+"</div>\r\n</div>\r\n"},o.Fotorama.jst.style=function(t){{var e,n="";kn.escape}return n+=".fotorama"+(null==(e=t.s)?"":e)+" .fotorama__nav--thumbs .fotorama__nav__frame{\r\npadding:"+(null==(e=t.m)?"":e)+"px;\r\nheight:"+(null==(e=t.h)?"":e)+"px}\r\n.fotorama"+(null==(e=t.s)?"":e)+" .fotorama__thumb-border{\r\nheight:"+(null==(e=t.h)?"":e)+"px;\r\nborder-width:"+(null==(e=t.b)?"":e)+"px;\r\nmargin-top:"+(null==(e=t.m)?"":e)+"px}"},o.Fotorama.jst.thumb=function(){{var t="";kn.escape}return t+='<div class="fotorama__nav__frame fotorama__nav__frame--thumb" tabindex="0" role="button" data-gallery-role="nav-frame" data-nav-type="thumb" aria-label>\r\n <div class="fotorama__thumb">\r\n </div>\r\n</div>'}}(window,document,location,"undefined"!=typeof jQuery&&jQuery); \ No newline at end of file +fotoramaVersion="4.6.4",function(t,e,n,o,i){"use strict";function r(t){var e="bez_"+o.makeArray(arguments).join("_").replace(".","p");if("function"!=typeof o.easing[e]){var n=function(t,e){var n=[null,null],o=[null,null],i=[null,null],r=function(r,a){return i[a]=3*t[a],o[a]=3*(e[a]-t[a])-i[a],n[a]=1-i[a]-o[a],r*(i[a]+r*(o[a]+r*n[a]))},a=function(t){return i[0]+t*(2*o[0]+3*n[0]*t)},s=function(t){for(var e,n=t,o=0;++o<14&&(e=r(n,0)-t,!(Math.abs(e)<.001));)n-=e/a(n);return n};return function(t){return r(s(t),1)}};o.easing[e]=function(e,o,i,r,a){return r*n([t[0],t[1]],[t[2],t[3]])(o/a)+i}}return e}function a(){}function s(t,e,n){return Math.max(isNaN(e)?-1/0:e,Math.min(isNaN(n)?1/0:n,t))}function u(t,e){return t.match(/ma/)&&t.match(/-?\d+(?!d)/g)[t.match(/3d/)?"vertical"===e?13:12:"vertical"===e?5:4]}function l(t,e){return On?+u(t.css("transform"),e):+t.css("vertical"===e?"top":"left").replace("px","")}function c(t,e){var n={};if(On)switch(e){case"vertical":n.transform="translate3d(0, "+t+"px,0)";break;case"list":break;default:n.transform="translate3d("+t+"px,0,0)"}else"vertical"===e?n.top=t:n.left=t;return n}function d(t){return{"transition-duration":t+"ms"}}function f(t,e){return isNaN(t)?e:t}function h(t,e){return f(+String(t).replace(e||"px",""))}function m(t){return/%$/.test(t)?h(t,"%"):i}function p(t,e){return f(m(t)/100*e,h(t))}function v(t){return(!isNaN(h(t))||!isNaN(h(t,"%")))&&t}function g(t,e,n,o){return(t-(o||0))*(e+(n||0))}function w(t,e,n,o){return-Math.round(t/(e+(n||0))-(o||0))}function y(t){var e=t.data();if(!e.tEnd){var n=t[0],o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",msTransition:"MSTransitionEnd",transition:"transitionend"};V(n,o[Tn.prefixed("transition")],function(t){e.tProp&&t.propertyName.match(e.tProp)&&e.onEndFn()}),e.tEnd=!0}}function b(t,e,n,o){var i,r=t.data();r&&(r.onEndFn=function(){i||(i=!0,clearTimeout(r.tT),n())},r.tProp=e,clearTimeout(r.tT),r.tT=setTimeout(function(){r.onEndFn()},1.5*o),y(t))}function x(t,e){var n=t.navdir||"horizontal";if(t.length){var o=t.data();On?(t.css(d(0)),o.onEndFn=a,clearTimeout(o.tT)):t.stop();var i=_(e,function(){return l(t,n)});return t.css(c(i,n)),i}}function _(){for(var t,e=0,n=arguments.length;n>e&&(t=e?arguments[e]():arguments[e],"number"!=typeof t);e++);return t}function C(t,e){return Math.round(t+(e-t)/1.5)}function k(){return k.p=k.p||("https:"===n.protocol?"https://":"http://"),k.p}function T(t){var n=e.createElement("a");return n.href=t,n}function P(t,e){if("string"!=typeof t)return t;t=T(t);var n,o;if(t.host.match(/youtube\.com/)&&t.search){if(n=t.search.split("v=")[1]){var i=n.indexOf("&");-1!==i&&(n=n.substring(0,i)),o="youtube"}}else t.host.match(/youtube\.com|youtu\.be/)?(n=t.pathname.replace(/^\/(embed\/|v\/)?/,"").replace(/\/.*/,""),o="youtube"):t.host.match(/vimeo\.com/)&&(o="vimeo",n=t.pathname.replace(/^\/(video\/)?/,"").replace(/\/.*/,""));return n&&o||!e||(n=t.href,o="custom"),n?{id:n,type:o,s:t.search.replace(/^\?/,""),p:k()}:!1}function S(t,e,n){var i,r,a=t.video;return"youtube"===a.type?(r=k()+"img.youtube.com/vi/"+a.id+"/default.jpg",i=r.replace(/\/default.jpg$/,"/hqdefault.jpg"),t.thumbsReady=!0):"vimeo"===a.type?o.ajax({url:k()+"vimeo.com/api/v2/video/"+a.id+".json",dataType:"jsonp",success:function(o){t.thumbsReady=!0,M(e,{img:o[0].thumbnail_large,thumb:o[0].thumbnail_small},t.i,n)}}):t.thumbsReady=!0,{img:i,thumb:r}}function M(t,e,n,i){for(var r=0,a=t.length;a>r;r++){var s=t[r];if(s.i===n&&s.thumbsReady){var u={videoReady:!0};u[to]=u[no]=u[eo]=!1,i.splice(r,1,o.extend({},s,u,e));break}}}function E(t){function e(t,e,i){var r=t.children("img").eq(0),a=t.attr("href"),s=t.attr("src"),u=r.attr("src"),l=e.video,c=i?P(a,l===!0):!1;c?a=!1:c=l,n(t,r,o.extend(e,{video:c,img:e.img||a||s||u,thumb:e.thumb||u||s||a}))}function n(t,e,n){var i=n.thumb&&n.img!==n.thumb,r=h(n.width||t.attr("width")),a=h(n.height||t.attr("height"));o.extend(n,{width:r,height:a,thumbratio:K(n.thumbratio||h(n.thumbwidth||e&&e.attr("width")||i||r)/h(n.thumbheight||e&&e.attr("height")||i||a))})}var i=[];return t.children().each(function(){var t=o(this),r=H(o.extend(t.data(),{id:t.attr("id")}));if(t.is("a, img"))e(t,r,!0);else{if(t.is(":empty"))return;n(t,null,o.extend(r,{html:this,_html:t.html()}))}i.push(r)}),i}function F(t){return 0===t.offsetWidth&&0===t.offsetHeight}function j(t){return!o.contains(e.documentElement,t)}function z(t,e,n,o){return z.i||(z.i=1,z.ii=[!0]),o=o||z.i,"undefined"==typeof z.ii[o]&&(z.ii[o]=!0),t()?e():z.ii[o]&&setTimeout(function(){z.ii[o]&&z(t,e,n,o)},n||100),z.i++}function N(t,e){var n=t.data(),o=n.measures;if(o&&(!n.l||n.l.W!==o.width||n.l.H!==o.height||n.l.r!==o.ratio||n.l.w!==e.w||n.l.h!==e.h)){var i=s(e.h,0,o.height),r=i*o.ratio;po.setRatio(t,r,i),n.l={W:o.width,H:o.height,r:o.ratio,w:e.w,h:e.h}}return!0}function $(t,e){var n=t[0];n.styleSheet?n.styleSheet.cssText=e:t.html(e)}function q(t,e,n,o){return e===n?!1:"vertical"===o?e>=t?"top":t>=n?"bottom":"top bottom":e>=t?"left":t>=n?"right":"left right"}function L(t,e,n){n=n||{},t.each(function(){var t,i=o(this),r=i.data();r.clickOn||(r.clickOn=!0,o.extend(oe(i,{onStart:function(e){t=e,(n.onStart||a).call(this,e)},onMove:n.onMove||a,onTouchEnd:n.onTouchEnd||a,onEnd:function(n){n.moved||e.call(this,t)}}),{noMove:!0}))})}function A(t,e){return'<div class="'+t+'">'+(e||"")+"</div>"}function I(t){return"."+t}function O(t){var e='<iframe src="'+t.p+t.type+".com/embed/"+t.id+'" frameborder="0" allowfullscreen></iframe>';return e}function D(t){for(var e=t.length;e;){var n=Math.floor(Math.random()*e--),o=t[e];t[e]=t[n],t[n]=o}return t}function R(t){return"[object Array]"==Object.prototype.toString.call(t)&&o.map(t,function(t){return o.extend({},t)})}function W(t,e,n){t.scrollLeft(e||0).scrollTop(n||0)}function H(t){if(t){var e={};return o.each(t,function(t,n){e[t.toLowerCase()]=n}),e}}function K(t){if(t){var e=+t;return isNaN(e)?(e=t.split("/"),+e[0]/+e[1]||i):e}}function V(t,e,n,o){e&&(t.addEventListener?t.addEventListener(e,n,!!o):t.attachEvent("on"+e,n))}function B(t,e){return t>e.max?t=e.max:t<e.min&&(t=e.min),t}function Q(t,e,n,o,i,r,a){var s,u,l;return"horizontal"===a?(u=t.thumbwidth,l=r.width()):(u=t.thumbheight,l=r.height()),s=(u+t.margin)*(n+1)>=l-o?"horizontal"===a?-i.position().left:-i.position().top:(u+t.margin)*n<=Math.abs(o)?"horizontal"===a?-i.position().left+l-(u+t.margin):-i.position().top+l-(u+t.margin):o,s=B(s,e),s||0}function X(t){return!!t.getAttribute("disabled")}function U(t){return{tabindex:-1*t+"",disabled:t}}function Y(t,e){V(t,"keyup",function(n){X(t)||13==n.keyCode&&e.call(t,n)})}function G(t,e){V(t,"focus",t.onfocusin=function(n){e.call(t,n)},!0)}function J(t,e){t.preventDefault?t.preventDefault():t.returnValue=!1,e&&t.stopPropagation&&t.stopPropagation()}function Z(t){return t?">":"<"}function te(t,e){var n=t.data(),i=Math.round(e.pos),r=function(){n&&n.sliding&&(n.sliding=!1),(e.onEnd||a)()};"undefined"!=typeof e.overPos&&e.overPos!==e.pos&&(i=e.overPos);var s=o.extend(c(i,e.direction),e.width&&{width:e.width},e.height&&{height:e.height});n&&n.sliding&&(n.sliding=!0),On?(t.css(o.extend(d(e.time),s)),e.time>10?b(t,"transform",r,e.time):r()):t.stop().animate(s,e.time,io,r)}function ee(t,e,n,i,r,s){var u="undefined"!=typeof s;if(u||(r.push(arguments),Array.prototype.push.call(arguments,r.length),!(r.length>1))){t=t||o(t),e=e||o(e);var l=t[0],c=e[0],d="crossfade"===i.method,f=function(){if(!f.done){f.done=!0;var t=(u||r.shift())&&r.shift();t&&ee.apply(this,t),(i.onEnd||a)(!!t)}},h=i.time/(s||1);n.removeClass(Ke+" "+He),t.stop().addClass(Ke),e.stop().addClass(He),d&&c&&t.fadeTo(0,0),t.fadeTo(d?h:0,1,d&&f),e.fadeTo(h,0,f),l&&d||c||f()}}function ne(t){var e=(t.touches||[])[0]||t;t._x=e.pageX,t._y=e.clientY,t._now=o.now()}function oe(t,n){function i(t){return f=o(t.target),b.checked=p=v=w=!1,c||b.flow||t.touches&&t.touches.length>1||t.which>1||lo&&lo.type!==t.type&&fo||(p=n.select&&f.is(n.select,y))?p:(m="touchstart"===t.type,v=f.is("a, a *",y),h=b.control,g=b.noMove||b.noSwipe||h?16:b.snap?0:4,ne(t),d=lo=t,co=t.type.replace(/down|start/,"move").replace(/Down/,"Move"),(n.onStart||a).call(y,t,{control:h,$target:f}),c=b.flow=!0,void((!m||b.go)&&J(t)))}function r(t){if(t.touches&&t.touches.length>1||Kn&&!t.isPrimary||co!==t.type||!c)return c&&s(),void(n.onTouchEnd||a)();ne(t);var e=Math.abs(t._x-d._x),o=Math.abs(t._y-d._y),i=e-o,r=(b.go||b.x||i>=0)&&!b.noSwipe,u=0>i;m&&!b.checked?(c=r)&&J(t):(J(t),(n.onMove||a).call(y,t,{touch:m})),!w&&Math.sqrt(Math.pow(e,2)+Math.pow(o,2))>g&&(w=!0),b.checked=b.checked||r||u}function s(t){(n.onTouchEnd||a)();var e=c;b.control=c=!1,e&&(b.flow=!1),!e||v&&!b.checked||(t&&J(t),fo=!0,clearTimeout(ho),ho=setTimeout(function(){fo=!1},1e3),(n.onEnd||a).call(y,{moved:w,$target:f,control:h,touch:m,startEvent:d,aborted:!t||"MSPointerCancel"===t.type}))}function u(){b.flow||setTimeout(function(){b.flow=!0},10)}function l(){b.flow&&setTimeout(function(){b.flow=!1},Bn)}var c,d,f,h,m,p,v,g,w,y=t[0],b={};return Kn?(V(y,"MSPointerDown",i),V(e,"MSPointerMove",r),V(e,"MSPointerCancel",s),V(e,"MSPointerUp",s)):(V(y,"touchstart",i),V(y,"touchmove",r),V(y,"touchend",s),V(e,"touchstart",u),V(e,"touchend",l),V(e,"touchcancel",l),qn.on("scroll",l),t.on("mousedown",i),Ln.on("mousemove",r).on("mouseup",s)),mo=Tn.touch?"a":"div",t.on("click",mo,function(t){b.checked&&J(t)}),b}function ie(t,e){function n(n,o){S=!0,l=d="vertical"===_?n._y:n._x,v=n._now,p=[[v,l]],f=h=F.noMove||o?0:x(t,(e.getPos||a)()),(e.onStart||a).call(M,n)}function i(e,o){w=F.min,y=F.max,b=F.snap,_=F.direction||"horizontal",t.navdir=_,k=e.altKey,S=P=!1,T=o.control,T||E.sliding||n(e)}function r(o,i){F.noSwipe||(S||n(o),d="vertical"===_?o._y:o._x,p.push([o._now,d]),h=f-(l-d),m=q(h,w,y,_),w>=h?h=C(h,w):h>=y&&(h=C(h,y)),F.noMove||(t.css(c(h,_)),P||(P=!0,i.touch||Kn||t.addClass(un)),(e.onMove||a).call(M,o,{pos:h,edge:m})))}function u(i){if(!F.noSwipe||!i.moved){S||n(i.startEvent,!0),i.touch||Kn||t.removeClass(un),g=o.now();for(var r,u,l,c,m,v,x,C,T,P=g-Bn,E=null,j=Qn,z=e.friction,N=p.length-1;N>=0;N--){if(r=p[N][0],u=Math.abs(r-P),null===E||l>u)E=r,c=p[N][1];else if(E===P||u>l)break;l=u}x=s(h,w,y);var $=c-d,q=$>=0,L=g-E,A=L>Bn,I=!A&&h!==f&&x===h;b&&(x=s(Math[I?q?"floor":"ceil":"round"](h/b)*b,w,y),w=y=x),I&&(b||x===h)&&(T=-($/L),j*=s(Math.abs(T),e.timeLow,e.timeHigh),m=Math.round(h+T*j/z),b||(x=m),(!q&&m>y||q&&w>m)&&(v=q?w:y,C=m-v,b||(x=v),C=s(x+.03*C,v-50,v+50),j=Math.abs((h-C)/(T/z)))),j*=k?10:1,(e.onEnd||a).call(M,o.extend(i,{moved:i.moved||A&&b,pos:h,newPos:x,overPos:C,time:j,dir:_}))}}var l,d,f,h,m,p,v,g,w,y,b,_,k,T,P,S,M=t[0],E=t.data(),F={};return F=o.extend(oe(e.$wrap,o.extend({},e,{onStart:i,onMove:r,onEnd:u})),F)}function re(t,e){var n,i,r,s=t[0],u={prevent:{}};return V(s,Vn,function(t){var s=t.wheelDeltaY||-1*t.deltaY||0,l=t.wheelDeltaX||-1*t.deltaX||0,c=Math.abs(l)&&!Math.abs(s),d=Z(0>l),f=i===d,h=o.now(),m=Bn>h-r;i=d,r=h,c&&u.ok&&(!u.prevent[d]||n)&&(J(t,!0),n&&f&&m||(e.shift&&(n=!0,clearTimeout(u.t),u.t=setTimeout(function(){n=!1},Xn)),(e.onEnd||a)(t,e.shift?d:l)))}),u}function ae(){o.each(o.Fotorama.instances,function(t,e){e.index=t})}function se(t){o.Fotorama.instances.push(t),ae()}function ue(t){o.Fotorama.instances.splice(t.index,1),ae()}var le="fotorama",ce="fotorama__fullscreen",de=le+"__wrap",fe=de+"--css2",he=de+"--css3",me=de+"--video",pe=de+"--fade",ve=de+"--slide",ge=de+"--no-controls",we=de+"--no-shadows",ye=de+"--pan-y",be=de+"--rtl",xe=de+"--no-captions",_e=de+"--toggle-arrows",Ce=le+"__stage",ke=Ce+"__frame",Te=ke+"--video",Pe=Ce+"__shaft",Se=le+"__grab",Me=le+"__pointer",Ee=le+"__arr",Fe=Ee+"--disabled",je=Ee+"--prev",ze=Ee+"--next",Ne=le+"__nav",$e=Ne+"-wrap",qe=Ne+"__shaft",Le=$e+"--vertical",Ae=$e+"--list",Ie=$e+"--horizontal",Oe=Ne+"--dots",De=Ne+"--thumbs",Re=Ne+"__frame",We=le+"__fade",He=We+"-front",Ke=We+"-rear",Ve=le+"__shadow",Be=Ve+"s",Qe=Be+"--left",Xe=Be+"--right",Ue=Be+"--top",Ye=Be+"--bottom",Ge=le+"__active",Je=le+"__select",Ze=le+"--hidden",tn=le+"--fullscreen",en=le+"__fullscreen-icon",nn=le+"__error",on=le+"__loading",rn=le+"__loaded",an=rn+"--full",sn=rn+"--img",un=le+"__grabbing",ln=le+"__img",cn=ln+"--full",dn=le+"__thumb",fn=dn+"__arr--left",hn=dn+"__arr--right",mn=dn+"-border",pn=le+"__html",vn=le+"-video-container",gn=le+"__video",wn=gn+"-play",yn=gn+"-close",bn=le+"__spinner",xn=le+"_horizontal_ratio",_n=le+"_vertical_ratio",Cn=o&&o.fn.jquery.split(".");if(!Cn||Cn[0]<1||1==Cn[0]&&Cn[1]<8)throw"Fotorama requires jQuery 1.8 or later and will not run without it.";var kn={},Tn=function(t,e,n){function o(t){g.cssText=t}function i(t,e){return typeof t===e}function r(t,e){return!!~(""+t).indexOf(e)}function a(t,e){for(var o in t){var i=t[o];if(!r(i,"-")&&g[i]!==n)return"pfx"==e?i:!0}return!1}function s(t,e,o){for(var r in t){var a=e[t[r]];if(a!==n)return o===!1?t[r]:i(a,"function")?a.bind(o||e):a}return!1}function u(t,e,n){var o=t.charAt(0).toUpperCase()+t.slice(1),r=(t+" "+b.join(o+" ")+o).split(" ");return i(e,"string")||i(e,"undefined")?a(r,e):(r=(t+" "+x.join(o+" ")+o).split(" "),s(r,e,n))}var l,c,d,f="2.8.3",h={},m=e.documentElement,p="modernizr",v=e.createElement(p),g=v.style,w=({}.toString," -webkit- -moz- -o- -ms- ".split(" ")),y="Webkit Moz O ms",b=y.split(" "),x=y.toLowerCase().split(" "),_={},C=[],k=C.slice,T=function(t,n,o,i){var r,a,s,u,l=e.createElement("div"),c=e.body,d=c||e.createElement("body");if(parseInt(o,10))for(;o--;)s=e.createElement("div"),s.id=i?i[o]:p+(o+1),l.appendChild(s);return r=["­",'<style id="s',p,'">',t,"</style>"].join(""),l.id=p,(c?l:d).innerHTML+=r,d.appendChild(l),c||(d.style.background="",d.style.overflow="hidden",u=m.style.overflow,m.style.overflow="hidden",m.appendChild(d)),a=n(l,t),c?l.parentNode.removeChild(l):(d.parentNode.removeChild(d),m.style.overflow=u),!!a},P={}.hasOwnProperty;d=i(P,"undefined")||i(P.call,"undefined")?function(t,e){return e in t&&i(t.constructor.prototype[e],"undefined")}:function(t,e){return P.call(t,e)},Function.prototype.bind||(Function.prototype.bind=function(t){var e=this;if("function"!=typeof e)throw new TypeError;var n=k.call(arguments,1),o=function(){if(this instanceof o){var i=function(){};i.prototype=e.prototype;var r=new i,a=e.apply(r,n.concat(k.call(arguments)));return Object(a)===a?a:r}return e.apply(t,n.concat(k.call(arguments)))};return o}),_.touch=function(){var n;return"ontouchstart"in t||t.DocumentTouch&&e instanceof DocumentTouch?n=!0:T(["@media (",w.join("touch-enabled),("),p,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(t){n=9===t.offsetTop}),n},_.csstransforms3d=function(){var t=!!u("perspective");return t&&"webkitPerspective"in m.style&&T("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(e){t=9===e.offsetLeft&&3===e.offsetHeight}),t},_.csstransitions=function(){return u("transition")};for(var S in _)d(_,S)&&(c=S.toLowerCase(),h[c]=_[S](),C.push((h[c]?"":"no-")+c));return h.addTest=function(t,e){if("object"==typeof t)for(var o in t)d(t,o)&&h.addTest(o,t[o]);else{if(t=t.toLowerCase(),h[t]!==n)return h;e="function"==typeof e?e():e,"undefined"!=typeof enableClasses&&enableClasses&&(m.className+=" "+(e?"":"no-")+t),h[t]=e}return h},o(""),v=l=null,h._version=f,h._prefixes=w,h._domPrefixes=x,h._cssomPrefixes=b,h.testProp=function(t){return a([t])},h.testAllProps=u,h.testStyles=T,h.prefixed=function(t,e,n){return e?u(t,e,n):u(t,"pfx")},h}(t,e),Pn={ok:!1,is:function(){return!1},request:function(){},cancel:function(){},event:"",prefix:""},Sn="webkit moz o ms khtml".split(" ");if("undefined"!=typeof e.cancelFullScreen)Pn.ok=!0;else for(var Mn=0,En=Sn.length;En>Mn;Mn++)if(Pn.prefix=Sn[Mn],"undefined"!=typeof e[Pn.prefix+"CancelFullScreen"]){Pn.ok=!0;break}Pn.ok&&(Pn.event=Pn.prefix+"fullscreenchange",Pn.is=function(){switch(this.prefix){case"":return e.fullScreen;case"webkit":return e.webkitIsFullScreen;default:return e[this.prefix+"FullScreen"]}},Pn.request=function(t){return""===this.prefix?t.requestFullScreen():t[this.prefix+"RequestFullScreen"]()},Pn.cancel=function(){return""===this.prefix?e.cancelFullScreen():e[this.prefix+"CancelFullScreen"]()});var Fn,jn={lines:12,length:5,width:2,radius:7,corners:1,rotate:15,color:"rgba(128, 128, 128, .75)",hwaccel:!0},zn={top:"auto",left:"auto",className:""};!function(t,e){Fn=e()}(this,function(){function t(t,n){var o,i=e.createElement(t||"div");for(o in n)i[o]=n[o];return i}function n(t){for(var e=1,n=arguments.length;n>e;e++)t.appendChild(arguments[e]);return t}function o(t,e,n,o){var i=["opacity",e,~~(100*t),n,o].join("-"),r=.01+n/o*100,a=Math.max(1-(1-t)/e*(100-r),t),s=f.substring(0,f.indexOf("Animation")).toLowerCase(),u=s&&"-"+s+"-"||"";return m[i]||(p.insertRule("@"+u+"keyframes "+i+"{0%{opacity:"+a+"}"+r+"%{opacity:"+t+"}"+(r+.01)+"%{opacity:1}"+(r+e)%100+"%{opacity:"+t+"}100%{opacity:"+a+"}}",p.cssRules.length),m[i]=1),i}function r(t,e){var n,o,r=t.style;for(e=e.charAt(0).toUpperCase()+e.slice(1),o=0;o<h.length;o++)if(n=h[o]+e,r[n]!==i)return n;return r[e]!==i?e:void 0}function a(t,e){for(var n in e)t.style[r(t,n)||n]=e[n];return t}function s(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)t[o]===i&&(t[o]=n[o])}return t}function u(t){for(var e={x:t.offsetLeft,y:t.offsetTop};t=t.offsetParent;)e.x+=t.offsetLeft,e.y+=t.offsetTop;return e}function l(t,e){return"string"==typeof t?t:t[e%t.length]}function c(t){return"undefined"==typeof this?new c(t):void(this.opts=s(t||{},c.defaults,v))}function d(){function e(e,n){return t("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',n)}p.addRule(".spin-vml","behavior:url(#default#VML)"),c.prototype.lines=function(t,o){function i(){return a(e("group",{coordsize:c+" "+c,coordorigin:-u+" "+-u}),{width:c,height:c})}function r(t,r,s){n(f,n(a(i(),{rotation:360/o.lines*t+"deg",left:~~r}),n(a(e("roundrect",{arcsize:o.corners}),{width:u,height:o.width,left:o.radius,top:-o.width>>1,filter:s}),e("fill",{color:l(o.color,t),opacity:o.opacity}),e("stroke",{opacity:0}))))}var s,u=o.length+o.width,c=2*u,d=2*-(o.width+o.length)+"px",f=a(i(),{position:"absolute",top:d,left:d});if(o.shadow)for(s=1;s<=o.lines;s++)r(s,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(s=1;s<=o.lines;s++)r(s);return n(t,f)},c.prototype.opacity=function(t,e,n,o){var i=t.firstChild;o=o.shadow&&o.lines||0,i&&e+o<i.childNodes.length&&(i=i.childNodes[e+o],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}}var f,h=["webkit","Moz","ms","O"],m={},p=function(){var o=t("style",{type:"text/css"});return n(e.getElementsByTagName("head")[0],o),o.sheet||o.styleSheet}(),v={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",direction:1,speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto",position:"relative"};c.defaults={},s(c.prototype,{spin:function(e){this.stop();var n,o,i=this,r=i.opts,s=i.el=a(t(0,{className:r.className}),{position:r.position,width:0,zIndex:r.zIndex}),l=r.radius+r.length+r.width;if(e&&(e.insertBefore(s,e.firstChild||null),o=u(e),n=u(s),a(s,{left:("auto"==r.left?o.x-n.x+(e.offsetWidth>>1):parseInt(r.left,10)+l)+"px",top:("auto"==r.top?o.y-n.y+(e.offsetHeight>>1):parseInt(r.top,10)+l)+"px"})),s.setAttribute("role","progressbar"),i.lines(s,i.opts),!f){var c,d=0,h=(r.lines-1)*(1-r.direction)/2,m=r.fps,p=m/r.speed,v=(1-r.opacity)/(p*r.trail/100),g=p/r.lines;!function w(){d++;for(var t=0;t<r.lines;t++)c=Math.max(1-(d+(r.lines-t)*g)%p*v,r.opacity),i.opacity(s,t*r.direction+h,c,r);i.timeout=i.el&&setTimeout(w,~~(1e3/m))}()}return i},stop:function(){var t=this.el;return t&&(clearTimeout(this.timeout),t.parentNode&&t.parentNode.removeChild(t),this.el=i),this},lines:function(e,i){function r(e,n){return a(t(),{position:"absolute",width:i.length+i.width+"px",height:i.width+"px",background:e,boxShadow:n,transformOrigin:"left",transform:"rotate("+~~(360/i.lines*u+i.rotate)+"deg) translate("+i.radius+"px,0)",borderRadius:(i.corners*i.width>>1)+"px"})}for(var s,u=0,c=(i.lines-1)*(1-i.direction)/2;u<i.lines;u++)s=a(t(),{position:"absolute",top:1+~(i.width/2)+"px",transform:i.hwaccel?"translate3d(0,0,0)":"",opacity:i.opacity,animation:f&&o(i.opacity,i.trail,c+u*i.direction,i.lines)+" "+1/i.speed+"s linear infinite"}),i.shadow&&n(s,a(r("#000","0 0 4px #000"),{top:"2px"})),n(e,n(s,r(l(i.color,u),"0 0 1px rgba(0,0,0,.1)")));return e},opacity:function(t,e,n){e<t.childNodes.length&&(t.childNodes[e].style.opacity=n)}});var g=a(t("group"),{behavior:"url(#default#VML)"});return!r(g,"transform")&&g.adj?d():f=r(g,"animation"),c});var Nn,$n,qn=o(t),Ln=o(e),An="quirks"===n.hash.replace("#",""),In=Tn.csstransforms3d,On=In&&!An,Dn=In||"CSS1Compat"===e.compatMode,Rn=Pn.ok,Wn=navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i),Hn=!On||Wn,Kn=navigator.msPointerEnabled,Vn="onwheel"in e.createElement("div")?"wheel":e.onmousewheel!==i?"mousewheel":"DOMMouseScroll",Bn=250,Qn=300,Xn=1400,Un=5e3,Yn=2,Gn=64,Jn=500,Zn=333,to="$stageFrame",eo="$navDotFrame",no="$navThumbFrame",oo="auto",io=r([.1,0,.25,1]),ro=1200,ao=1,so={width:null,minwidth:null,maxwidth:"100%",height:null,minheight:null,maxheight:null,ratio:null,margin:Yn,nav:"dots",navposition:"bottom",navwidth:null,thumbwidth:Gn,thumbheight:Gn,thumbmargin:Yn,thumbborderwidth:Yn,allowfullscreen:!1,transition:"slide",clicktransition:null,transitionduration:Qn,captions:!0,startindex:0,loop:!1,autoplay:!1,stopautoplayontouch:!0,keyboard:!1,arrows:!0,click:!0,swipe:!1,trackpad:!1,shuffle:!1,direction:"ltr",shadows:!0,spinner:null,showcaption:!0,navdir:"horizontal",navarrows:!0,navtype:"thumbs"},uo={left:!0,right:!0,down:!1,up:!1,space:!1,home:!1,end:!1};z.stop=function(t){z.ii[t]=!1};var lo,co,fo,ho,mo,po=function(){function t(t,e,n){var o=e/n;1>=o?(t.parent().removeClass(xn),t.parent().addClass(_n)):(t.parent().removeClass(_n),t.parent().addClass(xn))}function e(t,e,n){var r=n;t.attr(r)||t.attr(r)===i||t.attr(r,e),t.find("["+r+"]").length&&t.find("["+r+"]").each(function(){o(this).attr(r,e)})}function n(t,e,n){var o,i=!1;return o=t.showCaption===n||t.showCaption===!0?!0:!1,e?(t.caption&&o&&(i=!0),i):!1}return{setRatio:t,setThumbAttr:e,isExpectedCaption:n}}(po||{},jQuery);jQuery.Fotorama=function(n,r){function a(){o.each(Do,function(t,e){if(!e.i){e.i=Mi++;var n=P(e.video,!0);if(n){var o={};e.video=n,e.img||e.thumb?e.thumbsReady=!0:o=S(e,Do,ki),M(Do,{img:o.img,thumb:o.thumb},e.i,ki)}}})}function u(t){return hi[t]||ki.fullScreen}function f(){if(Ni!==i)if("vertical"==r.navdir){var t=r.thumbwidth+r.thumbmargin;Ni.css("left",t),Ai.css("right",t),Qi.css("right",t),zi.css("width",zi.css("width")+t),$i.css("max-width",zi.width()-t)}else Ni.css("left",""),Ai.css("right",""),Qi.css("right",""),zi.css("width",zi.css("width")+t),$i.css("max-width","")}function m(t){var e,n="keydown."+le,o=le+Ti,i="keydown."+o,a="keyup."+o,s="resize."+o+" orientationchange."+o;t?(Ln.on(i,function(t){var n,o;Ko&&27===t.keyCode?(n=!0,Mo(Ko,!0,!0)):(ki.fullScreen||r.keyboard&&!ki.index)&&(27===t.keyCode?(n=!0,ki.cancelFullScreen()):t.shiftKey&&32===t.keyCode&&u("space")||37===t.keyCode&&u("left")||38===t.keyCode&&u("up")?(ki.longPress.progress(),o="<"):32===t.keyCode&&u("space")||39===t.keyCode&&u("right")||40===t.keyCode&&u("down")?(ki.longPress.progress(),o=">"):36===t.keyCode&&u("home")?(ki.longPress.progress(),o="<<"):35===t.keyCode&&u("end")&&(ki.longPress.progress(),o=">>")),(n||o)&&J(t),e={index:o,slow:t.altKey,user:!0},o&&(ki.longPress.inProgress?ki.showWhileLongPress(e):ki.show(e))}),t&&Ln.on(a,function(){ki.longPress.inProgress&&ki.showEndLongPress({user:!0}),ki.longPress.reset()}),ki.index||Ln.off(n).on(n,"textarea, input, select",function(t){!$n.hasClass(ce)&&t.stopPropagation()}),qn.on(s,ki.resize)):(Ln.off(i),qn.off(s))}function y(t){t!==y.f&&(t?(n.addClass(le+" "+Pi).before(ji).before(Fi),se(ki)):(ji.detach(),Fi.detach(),n.html(Ei.urtext).removeClass(Pi),ue(ki)),m(t),y.f=t)}function b(){Do=ki.data=Do||R(r.data)||E(n),Ro=ki.size=Do.length,Oo.ok&&r.shuffle&&D(Do),a(),Zi=oe(Zi),Ro&&y(!0)}function C(){var t=2>Ro||Ko;nr.noMove=t||ai,nr.noSwipe=t||!r.swipe,!ci&&$i.toggleClass(Se,!r.click&&!nr.noMove&&!nr.noSwipe),Kn&&zi.toggleClass(ye,!nr.noSwipe)}function k(t){t===!0&&(t=""),r.autoplay=Math.max(+t||Un,1.5*li)}function T(t){t.navarrows&&"thumbs"===t.nav?(Vi.show(),Bi.show()):(Vi.hide(),Bi.hide())}function F(t,e){return Math.floor(zi.width()/(e.thumbwidth+e.thumbmargin))}function X(){function t(t,n){e[t?"add":"remove"].push(n)}r.nav&&"dots"!==r.nav||(r.navdir="horizontal"),ki.options=r=H(r),ao=F(zi,r),ai="crossfade"===r.transition||"dissolve"===r.transition,ti=r.loop&&(Ro>2||ai&&(!ci||"slide"!==ci)),li=+r.transitionduration||Qn,fi="rtl"===r.direction,hi=o.extend({},r.keyboard&&uo,r.keyboard),T(r);var e={add:[],remove:[]};Ro>1?(ei=r.nav,oi="top"===r.navposition,e.remove.push(Je),Ii.toggle(r.arrows)):(ei=!1,Ii.hide()),Cn(),Ho=new Fn(o.extend(jn,r.spinner,zn,{direction:fi?-1:1})),Xn(),io(),Yn(),r.autoplay&&k(r.autoplay),si=h(r.thumbwidth)||Gn,ui=h(r.thumbheight)||Gn,or.ok=rr.ok=r.trackpad&&!Hn,C(),go(r,[er]),ni="thumbs"===ei,Oi.filter(":hidden")&&ei&&Oi.show(),ni?(Sn(Ro,"navThumb"),Wo=Hi,Ci=no,$(Fi,o.Fotorama.jst.style({w:si,h:ui,b:r.thumbborderwidth,m:r.thumbmargin,s:Ti,q:!Dn})),Di.addClass(De).removeClass(Oe)):"dots"===ei?(Sn(Ro,"navDot"),Wo=Wi,Ci=eo,Di.addClass(Oe).removeClass(De)):(Oi.hide(),ei=!1,Di.removeClass(De+" "+Oe)),ei&&(oi?Oi.insertBefore(Ni):Oi.insertAfter(Ni),In.nav=!1,In(Wo,Ri,"nav")),ii=r.allowfullscreen,ii?(Qi.prependTo(Ni),ri=Rn&&"native"===ii):(Qi.detach(),ri=!1),t(ai,pe),t(!ai,ve),t(!r.captions,xe),t(fi,be),t("always"!==r.arrows,_e),di=r.shadows&&!Hn,t(!di,we),zi.addClass(e.add.join(" ")).removeClass(e.remove.join(" ")),tr=o.extend({},r),f()}function ne(t){return 0>t?(Ro+t%Ro)%Ro:t>=Ro?t%Ro:t}function oe(t){return s(t,0,Ro-1)}function ae(t){return ti?ne(t):oe(t)}function We(t){return t>0||ti?t-1:!1}function He(t){return Ro-1>t||ti?t+1:!1}function Ke(){nr.min=ti?-1/0:-g(Ro-1,er.w,r.margin,Qo),nr.max=ti?1/0:-g(0,er.w,r.margin,Qo),nr.snap=er.w+r.margin}function Ve(){var t="vertical"===r.navdir,e=t?Ri.height():Ri.width(),n=t?er.h:er.nw;ir.min=Math.min(0,n-e),ir.max=0,ir.direction=r.navdir,Ri.toggleClass(Se,!(ir.noMove=ir.min===ir.max))}function un(t,e,n){if("number"==typeof t){t=new Array(t);var i=!0}return o.each(t,function(t,o){if(i&&(o=t),"number"==typeof o){var r=Do[ne(o)];if(r){var a="$"+e+"Frame",s=r[a];n.call(this,t,o,r,s,a,s&&s.data())}}})}function dn(t,e,n,o){(!mi||"*"===mi&&o===Zo)&&(t=v(r.width)||v(t)||Jn,e=v(r.height)||v(e)||Zn,ki.resize({width:t,ratio:r.ratio||n||t/e},0,o!==Zo&&"*"))}function xn(t,e,n,i){un(t,e,function(t,a,s,u,l,c){function d(t){var e=ne(a);wo(t,{index:e,src:b,frame:Do[e]})}function f(){g.remove(),o.Fotorama.cache[b]="error",s.html&&"stage"===e||!x||x===b?(!b||s.html||p?"stage"===e&&(u.trigger("f:load").removeClass(on+" "+nn).addClass(rn),d("load"),dn()):(u.trigger("f:error").removeClass(on).addClass(nn),d("error")),c.state="error",!(Ro>1&&Do[a]===s)||s.html||s.deleted||s.video||p||(s.deleted=!0,ki.splice(a,1))):(s[y]=b=x,xn([a],e,n,!0))}function h(){o.Fotorama.measures[b]=w.measures=o.Fotorama.measures[b]||{width:v.width,height:v.height,ratio:v.width/v.height},dn(w.measures.width,w.measures.height,w.measures.ratio,a),g.off("load error").addClass(ln+(p?" "+cn:"")).prependTo(u),u.hasClass(ke)&&!u.hasClass(vn)&&u.attr("href",g.attr("src")),N(g,(o.isFunction(n)?n():n)||er),o.Fotorama.cache[b]=c.state="loaded",setTimeout(function(){u.trigger("f:load").removeClass(on+" "+nn).addClass(rn+" "+(p?an:sn)),"stage"===e?d("load"):(s.thumbratio===oo||!s.thumbratio&&r.thumbratio===oo)&&(s.thumbratio=w.measures.ratio,Ao())},0)}function m(){var t=10;z(function(){return!xi||!t--&&!Hn},function(){h()})}if(u){var p=ki.fullScreen&&s.full&&s.full!==s.img&&!c.$full&&"stage"===e;if(!c.$img||i||p){var v=new Image,g=o(v),w=g.data();c[p?"$full":"$img"]=g;var y="stage"===e?p?"full":"img":"thumb",b=s[y],x=p?null:s["stage"===e?"thumb":"img"];if("navThumb"===e&&(u=c.$wrap),!b)return void f();o.Fotorama.cache[b]?!function _(){"error"===o.Fotorama.cache[b]?f():"loaded"===o.Fotorama.cache[b]?setTimeout(m,0):setTimeout(_,100)}():(o.Fotorama.cache[b]="*",g.on("load",m).on("error",f)),c.state="",v.src=b,c.data.caption&&(v.alt=c.data.caption||""),po.isExpectedCaption(s,r.showcaption)&&o(v).attr("aria-labelledby",s.labelledby)}}})}function _n(t){Ji.append(Ho.spin().el).appendTo(t)}function Cn(){Ji.detach(),Ho&&Ho.stop()}function kn(){var t=Vo[to];t&&!t.data().state&&(_n(t),t.on("f:load f:error",function(){t.off("f:load f:error"),Cn()}))}function Tn(t){Y(t,$o),G(t,function(){setTimeout(function(){W(Di)},0),co({time:li,guessIndex:o(this).data().eq,minMax:ir})})}function Sn(t,e){un(t,e,function(t,n,i,a,s,u){if(!a){a=i[s]=zi[s].clone(),u=a.data(),u.data=i;var l=a[0],c="labelledby"+o.now();"stage"===e?(i.html&&o('<div class="'+pn+'"></div>').append(i._html?o(i.html).removeAttr("id").html(i._html):i.html).appendTo(a),i.id&&(c=i.id||c),i.labelledby=c,po.isExpectedCaption(i,r.showcaption)&&o(o.Fotorama.jst.frameCaption({caption:i.caption,labelledby:c})).appendTo(a),i.video&&a.addClass(Te).append(Ui.clone()),G(l,function(){setTimeout(function(){W(Ni)},0),jo({index:u.eq,user:!0})}),qi=qi.add(a)):"navDot"===e?(Tn(l),Wi=Wi.add(a)):"navThumb"===e&&(Tn(l),u.$wrap=a.children(":first"),Hi=Hi.add(a),i.video&&u.$wrap.append(Ui.clone()))}})}function Mn(t,e){return t&&t.length&&N(t,e)}function En(t){un(t,"stage",function(t,e,n,i,a,s){if(i){var u=ne(e);s.eq=u,sr[to][u]=i.css(o.extend({left:ai?0:g(e,er.w,r.margin,Qo)},ai&&d(0))),j(i[0])&&(i.appendTo($i),Mo(n.$video)),Mn(s.$img,er),Mn(s.$full,er),!i.hasClass(ke)||"false"===i.attr("aria-hidden")&&i.hasClass(Ge)||i.attr("aria-hidden","true")}})}function An(t,e){var n,i;"thumbs"!==ei||isNaN(t)||(n=-t,i=-t+er.nw,"vertical"===r.navdir&&(t-=r.thumbheight,i=-t+er.h),Hi.each(function(){var t=o(this),a=t.data(),s=a.eq,u=function(){return{h:ui,w:a.w}},l=u(),c="vertical"===r.navdir?a.t>i:a.l>i;l.w=a.w,a.l+a.w<n||c||Mn(a.$img,l)||e&&xn([s],"navThumb",u)}))}function In(t,e,n){if(!In[n]){var i="nav"===n&&ni,a=0,s=0;e.append(t.filter(function(){for(var t,e=o(this),n=e.data(),i=0,r=Do.length;r>i;i++)if(n.data===Do[i]){t=!0,n.eq=i;break}return t||e.remove()&&!1}).sort(function(t,e){return o(t).data().eq-o(e).data().eq}).each(function(){var t=o(this),e=t.data();po.setThumbAttr(t,e.data.caption,"aria-label")}).each(function(){if(i){var t=o(this),e=t.data(),n=Math.round(ui*e.data.thumbratio)||si,u=Math.round(si/e.data.thumbratio)||ui;e.t=s,e.h=u,e.l=a,e.w=n,t.css({width:n}),s+=u+r.thumbmargin,a+=n+r.thumbmargin}})),In[n]=!0}}function Wn(t){return t-ur>er.w/3}function Vn(t){return!(ti||Zi+t&&Zi-Ro+t||Ko)}function Xn(){var t=Vn(0),e=Vn(1);Li.toggleClass(Fe,t).attr(U(t)),Ai.toggleClass(Fe,e).attr(U(e))}function Yn(){var t=!1,e=!1;if("thumbs"!==r.navtype||r.loop||(t=0==Zi?!0:!1,e=Zi==r.data.length-1?!0:!1),"slides"===r.navtype){var n=l(Ri,r.navdir);t=n>=ir.max?!0:!1,e=n<=ir.min?!0:!1}Vi.toggleClass(Fe,t).attr(U(t)),Bi.toggleClass(Fe,e).attr(U(e))}function io(){or.ok&&(or.prevent={"<":Vn(0),">":Vn(1)})}function so(t){var e,n,o,i,a=t.data();ni?(e=a.l,n=a.t,o=a.w,i=a.h):(e=t.position().left,o=t.width());var s={c:e+o/2,min:-e+10*r.thumbmargin,max:-e+er.w-o-10*r.thumbmargin},u={c:n+i/2,min:-n+10*r.thumbmargin,max:-n+er.h-i-10*r.thumbmargin};return"vertical"===r.navdir?u:s}function lo(t){var e=Vo[Ci].data();te(Ki,{time:1.2*t,pos:"vertical"===r.navdir?e.t:e.l,width:e.w,height:e.h,direction:r.navdir})}function co(t){var e,n,o,i,a,u,c,d,f=Do[t.guessIndex][Ci],h=r.navtype;f&&("thumbs"===h?(e=ir.min!==ir.max,o=t.minMax||e&&so(Vo[Ci]),i=e&&(t.keep&&co.t?co.l:s((t.coo||er.nw/2)-so(f).c,o.min,o.max)),a=e&&(t.keep&&co.l?co.l:s((t.coo||er.nw/2)-so(f).c,o.min,o.max)),u="vertical"===r.navdir?i:a,c=e&&s(u,ir.min,ir.max)||0,n=1.1*t.time,te(Ri,{time:n,pos:c,direction:r.navdir,onEnd:function(){An(c,!0),Yn()}}),So(Di,q(c,ir.min,ir.max,r.navdir)),co.l=u):(d=l(Ri,r.navdir),n=1.11*t.time,c=Q(r,ir,t.guessIndex,d,f,Oi,r.navdir),te(Ri,{time:n,pos:c,direction:r.navdir,onEnd:function(){An(c,!0),Yn() +}}),So(Di,q(c,ir.min,ir.max,r.navdir))))}function fo(){ho(Ci),ar[Ci].push(Vo[Ci].addClass(Ge).attr("data-active",!0))}function ho(t){for(var e=ar[t];e.length;)e.shift().removeClass(Ge).attr("data-active",!1)}function mo(t){var e=sr[t];o.each(Bo,function(t,n){delete e[ne(n)]}),o.each(e,function(t,n){delete e[t],n.detach()})}function vo(t){Qo=Xo=Zi;var e=Vo[to];e&&(ho(to),ar[to].push(e.addClass(Ge).attr("data-active",!0)),e.hasClass(ke)&&e.attr("aria-hidden","false"),t||ki.showStage.onEnd(!0),x($i,0,!0),mo(to),En(Bo),Ke(),Ve(),Y($i[0],function(){n.hasClass(tn)||(ki.requestFullScreen(),o(Xi).trigger("focus"))}))}function go(t,e){t&&o.each(e,function(e,n){n&&o.extend(n,{width:t.width||n.width,height:t.height,minwidth:t.minwidth,maxwidth:t.maxwidth,minheight:t.minheight,maxheight:t.maxheight,ratio:K(t.ratio)})})}function wo(t,e){n.trigger(le+":"+t,[ki,e])}function yo(){clearTimeout(bo.t),xi=1,r.stopautoplayontouch?ki.stopAutoplay():wi=!0}function bo(){xi&&(r.stopautoplayontouch||(xo(),_o()),bo.t=setTimeout(function(){xi=0},Qn+Bn))}function xo(){wi=!(!Ko&&!yi)}function _o(){if(clearTimeout(_o.t),z.stop(_o.w),!r.autoplay||wi)return void(ki.autoplay&&(ki.autoplay=!1,wo("stopautoplay")));ki.autoplay||(ki.autoplay=!0,wo("startautoplay"));var t=Zi,e=Vo[to].data();_o.w=z(function(){return e.state||t!==Zi},function(){_o.t=setTimeout(function(){if(!wi&&t===Zi){var e=Jo,n=Do[e][to].data();_o.w=z(function(){return n.state||e!==Jo},function(){wi||e!==Jo||ki.show(ti?Z(!fi):Jo)})}},r.autoplay)})}function Co(t){var e;return"object"!=typeof t?(e=t,t={}):e=t.index,e=">"===e?Xo+1:"<"===e?Xo-1:"<<"===e?0:">>"===e?Ro-1:e,e=isNaN(e)?i:e,e="undefined"==typeof e?Zi||0:e}function ko(t){ki.activeIndex=Zi=ae(t),Yo=We(Zi),Go=He(Zi),Jo=ne(Zi+(fi?-1:1)),Bo=[Zi,Yo,Go],Xo=ti?t:Zi}function To(t){var e=Math.abs(Uo-Xo),n=_(t.time,function(){return Math.min(li*(1+(e-1)/12),2*li)});return t.slow&&(n*=10),n}function Po(){ki.fullScreen&&(ki.fullScreen=!1,Rn&&Pn.cancel(Si),$n.removeClass(ce),Nn.removeClass(ce),n.removeClass(tn).insertAfter(ji),er=o.extend({},bi),Mo(Ko,!0,!0),No("x",!1),ki.resize(),xn(Bo,"stage"),W(qn,vi,pi),wo("fullscreenexit"))}function So(t,e){di&&(t.removeClass(Qe+" "+Xe),t.removeClass(Ue+" "+Ye),e&&!Ko&&t.addClass(e.replace(/^|\s/g," "+Be+"--")))}function Mo(t,e,n){e&&(zi.removeClass(me),Ko=!1,C()),t&&t!==Ko&&(t.remove(),wo("unloadvideo")),n&&(xo(),_o())}function Eo(t){zi.toggleClass(ge,t)}function Fo(t){if(!nr.flow){var e=t?t.pageX:Fo.x,n=e&&!Vn(Wn(e))&&r.click;Fo.p!==n&&Ni.toggleClass(Me,n)&&(Fo.p=n,Fo.x=e)}}function jo(t){clearTimeout(jo.t),r.clicktransition&&r.clicktransition!==r.transition?setTimeout(function(){var e=r.transition;ki.setOptions({transition:r.clicktransition}),ci=e,jo.t=setTimeout(function(){ki.show(t)},10)},0):ki.show(t)}function zo(t,e){var n=t.target,i=o(n);i.hasClass(wn)?ki.playVideo():n===Xi?ki.toggleFullScreen():Ko?n===Gi&&Mo(Ko,!0,!0):e?Eo():r.click&&jo({index:t.shiftKey||Z(Wn(t._x)),slow:t.altKey,user:!0})}function No(t,e){nr[t]=ir[t]=e}function $o(t){var e=o(this).data().eq;jo("thumbs"===r.navtype?{index:e,slow:t.altKey,user:!0,coo:t._x-Di.offset().left}:{index:e,slow:t.altKey,user:!0})}function qo(t){jo({index:Ii.index(this)?">":"<",slow:t.altKey,user:!0})}function Lo(t){G(t,function(){setTimeout(function(){W(Ni)},0),Eo(!1)})}function Ao(){if(b(),X(),!Ao.i){Ao.i=!0;var t=r.startindex;Zi=Qo=Xo=Uo=Zo=ae(t)||0}if(Ro){if(Io())return;Ko&&Mo(Ko,!0),Bo=[],mo(to),Ao.ok=!0,ki.show({index:Zi,time:0}),ki.resize()}else ki.destroy()}function Io(){return!Io.f===fi?(Io.f=fi,Zi=Ro-1-Zi,ki.reverse(),!0):void 0}function Oo(){Oo.ok&&(Oo.ok=!1,wo("ready"))}Nn=o("html"),$n=o("body");var Do,Ro,Wo,Ho,Ko,Vo,Bo,Qo,Xo,Uo,Yo,Go,Jo,Zo,ti,ei,ni,oi,ii,ri,ai,si,ui,li,ci,di,fi,hi,mi,pi,vi,gi,wi,yi,bi,xi,_i,Ci,ki=this,Ti=o.now(),Pi=le+Ti,Si=n[0],Mi=1,Ei=n.data(),Fi=o("<style></style>"),ji=o(A(Ze)),zi=n.find(I(de)),Ni=zi.find(I(Ce)),$i=(Ni[0],n.find(I(Pe))),qi=o(),Li=n.find(I(je)),Ai=n.find(I(ze)),Ii=n.find(I(Ee)),Oi=n.find(I($e)),Di=Oi.find(I(Ne)),Ri=Di.find(I(qe)),Wi=o(),Hi=o(),Ki=($i.data(),Ri.data(),n.find(I(mn))),Vi=n.find(I(fn)),Bi=n.find(I(hn)),Qi=n.find(I(en)),Xi=Qi[0],Ui=o(A(wn)),Yi=n.find(I(yn)),Gi=Yi[0],Ji=o(A(bn)),Zi=!1,tr={},er={},nr={},or={},ir={},rr={},ar={},sr={},ur=0,lr=[];zi[to]=o('<div class="'+ke+'"></div>'),zi[no]=o(o.Fotorama.jst.thumb()),zi[eo]=o(o.Fotorama.jst.dots()),ar[to]=[],ar[no]=[],ar[eo]=[],sr[to]={},zi.addClass(On?he:fe),Ei.fotorama=this,ki.startAutoplay=function(t){return ki.autoplay?this:(wi=yi=!1,k(t||r.autoplay),_o(),this)},ki.stopAutoplay=function(){return ki.autoplay&&(wi=yi=!0,_o()),this},ki.showSlide=function(t){var e,n=l(Ri,r.navdir),o=550,i="horizontal"===r.navdir?r.thumbwidth:r.thumbheight,a=function(){Yn()};"next"===t&&(e=n-(i+r.margin)*ao),"prev"===t&&(e=n+(i+r.margin)*ao),e=B(e,ir),An(e,!0),te(Ri,{time:o,pos:e,direction:r.navdir,onEnd:a})},ki.showWhileLongPress=function(t){if(!ki.longPress.singlePressInProgress){var e=Co(t);ko(e);var n=To(t)/50,o=Vo;ki.activeFrame=Vo=Do[Zi];var i=o===Vo&&!t.user;return ki.showNav(i,t,n),this}},ki.showEndLongPress=function(t){if(!ki.longPress.singlePressInProgress){var e=Co(t);ko(e);var n=To(t)/50,o=Vo;ki.activeFrame=Vo=Do[Zi];var i=o===Vo&&!t.user;return ki.showStage(i,t,n),gi="undefined"!=typeof Uo&&Uo!==Zi,Uo=Zi,this}},ki.showStage=function(t,e,n){Mo(Ko,Vo.i!==Do[ne(Qo)].i),Sn(Bo,"stage"),En(Hn?[Xo]:[Xo,We(Xo),He(Xo)]),No("go",!0),t||wo("show",{user:e.user,time:n}),wi=!0;var o=e.overPos,i=ki.showStage.onEnd=function(n){if(!i.ok){if(i.ok=!0,n||vo(!0),t||wo("showend",{user:e.user}),!n&&ci&&ci!==r.transition)return ki.setOptions({transition:ci}),void(ci=!1);kn(),xn(Bo,"stage"),No("go",!1),io(),Fo(),xo(),_o()}};if(ai){var a=Vo[to],s=Do[Uo]&&Zi!==Uo?Do[Uo][to]:null;ee(a,s,qi,{time:n,method:r.transition,onEnd:i},lr)}else te($i,{pos:-g(Xo,er.w,r.margin,Qo),overPos:o,time:n,onEnd:i});Xn()},ki.showNav=function(t,e,n){if(Yn(),ei){fo();var o=oe(Zi+s(Xo-Uo,-1,1));co({time:n,coo:o!==Zi&&e.coo,guessIndex:"undefined"!=typeof e.coo?o:Zi,keep:t}),ni&&lo(n)}},ki.show=function(t){ki.longPress.singlePressInProgress=!0;var e=Co(t);ko(e);var n=To(t),o=Vo;ki.activeFrame=Vo=Do[Zi];var i=o===Vo&&!t.user;return ki.showStage(i,t,n),ki.showNav(i,t,n),gi="undefined"!=typeof Uo&&Uo!==Zi,Uo=Zi,ki.longPress.singlePressInProgress=!1,this},ki.requestFullScreen=function(){return ii&&!ki.fullScreen&&(pi=qn.scrollTop(),vi=qn.scrollLeft(),W(qn),No("x",!0),bi=o.extend({},er),n.addClass(tn).appendTo($n.addClass(ce)),Nn.addClass(ce),Mo(Ko,!0,!0),ki.fullScreen=!0,ri&&Pn.request(Si),ki.resize(),xn(Bo,"stage"),kn(),wo("fullscreenenter")),this},ki.cancelFullScreen=function(){return ri&&Pn.is()?Pn.cancel(e):Po(),this},ki.toggleFullScreen=function(){return ki[(ki.fullScreen?"cancel":"request")+"FullScreen"]()},V(e,Pn.event,function(){!Do||Pn.is()||Ko||Po()}),ki.resize=function(e){if(!Do)return this;var n=arguments[1]||0,i=arguments[2];ao=F(zi,r),go(ki.fullScreen?{width:o(t).width(),maxwidth:null,minwidth:null,height:o(t).height(),maxheight:null,minheight:null}:H(e),[er,i||ki.fullScreen||r]);var a=er.width,u=er.height,l=er.ratio,c=qn.height()-(ei?Di.height():0);if(v(a)&&(zi.css({width:""}),zi.css({height:""}),Ni.css({width:""}),Ni.css({height:""}),Ni.css({"line-height":""}),$i.css({width:""}),$i.css({height:""}),Di.css({width:""}),Di.css({height:""}),zi.css({minWidth:er.minwidth||0,maxWidth:er.maxwidth||ro}),a=er.W=er.w=zi.width(),er.nw=ei&&p(r.navwidth,a)||a,$i.css({width:er.w,marginLeft:(er.W-er.w)/2}),u=p(u,c),u=u||l&&a/l)){if(a=Math.round(a),u=er.h=Math.round(s(u,p(er.minheight,c),p(er.maxheight,c))),Ni.css({width:a,height:u,"line-height":u+"px"}),"vertical"!==r.navdir||ki.fullscreen||Di.width(r.thumbwidth+2*r.thumbmargin),"horizontal"!==r.navdir||ki.fullscreen||Di.height(r.thumbheight+2*r.thumbmargin),"vertical"===r.navdir&&ki.fullScreen&&Ni.css("height",o(t).height()),"horizontal"===r.navdir&&ki.fullScreen&&Ni.css("height",o(t).height()-(r.thumbheight+2*r.thumbmargin)),ei){switch(r.navdir){case"vertical":Oi.removeClass(Ie),Oi.removeClass(Ae),Oi.addClass(Le),Di.stop().animate({height:er.h,width:r.thumbwidth},n);break;case"list":Oi.removeClass(Le),Oi.removeClass(Ie),Oi.addClass(Ae);break;default:Oi.removeClass(Le),Oi.removeClass(Ae),Oi.addClass(Ie),Di.stop().animate({width:er.nw},n)}vo(),co({guessIndex:Zi,time:n,keep:!0}),ni&&In.nav&&lo(n)}mi=i||!0,Oo.ok=!0,Oo()}return ur=Ni.offset().left,f(),this},ki.setOptions=function(t){return o.extend(r,t),Ao(),this},ki.shuffle=function(){return Do&&D(Do)&&Ao(),this},ki.longPress={threshold:1,count:0,thumbSlideTime:20,progress:function(){this.inProgress||(this.count++,this.inProgress=this.count>this.threshold)},end:function(){this.inProgress&&(this.isEnded=!0)},reset:function(){this.count=0,this.inProgress=!1,this.isEnded=!1}},ki.destroy=function(){return ki.cancelFullScreen(),ki.stopAutoplay(),Do=ki.data=null,y(),Bo=[],mo(to),Ao.ok=!1,this},ki.playVideo=function(){var t=Vo,e=t.video,n=Zi;return"object"==typeof e&&t.videoReady&&(ri&&ki.fullScreen&&ki.cancelFullScreen(),z(function(){return!Pn.is()||n!==Zi},function(){n===Zi&&(t.$video=t.$video||o(A(gn)).append(O(e)),t.$video.appendTo(t[to]),zi.addClass(me),Ko=t.$video,C(),Ii.blur(),Qi.blur(),wo("loadvideo"))})),this},ki.stopVideo=function(){return Mo(Ko,!0,!0),this},Ni.on("mousemove",Fo),nr=ie($i,{onStart:yo,onMove:function(t,e){So(Ni,e.edge)},onTouchEnd:bo,onEnd:function(t){So(Ni);var e=(Kn&&!_i||t.touch)&&r.arrows&&"always"!==r.arrows;if(t.moved||e&&t.pos!==t.newPos&&!t.control){var n=w(t.newPos,er.w,r.margin,Qo);ki.show({index:n,time:ai?li:t.time,overPos:t.overPos,user:!0})}else t.aborted||t.control||zo(t.startEvent,e)},timeLow:1,timeHigh:1,friction:2,select:"."+Je+", ."+Je+" *",$wrap:Ni,direction:"horizontal"}),ir=ie(Ri,{onStart:yo,onMove:function(t,e){So(Di,e.edge)},onTouchEnd:bo,onEnd:function(t){function e(){co.l=t.newPos,xo(),_o(),An(t.newPos,!0),Yn()}if(t.moved)t.pos!==t.newPos?(wi=!0,te(Ri,{time:t.time,pos:t.newPos,overPos:t.overPos,direction:r.navdir,onEnd:e}),An(t.newPos),di&&So(Di,q(t.newPos,ir.min,ir.max,t.dir))):e();else{var n=t.$target.closest("."+Re,Ri)[0];n&&$o.call(n,t.startEvent)}},timeLow:.5,timeHigh:2,friction:5,$wrap:Di,direction:r.navdir}),or=re(Ni,{shift:!0,onEnd:function(t,e){yo(),bo(),ki.show({index:e,slow:t.altKey})}}),rr=re(Di,{onEnd:function(t,e){yo(),bo();var n=x(Ri)+.25*e;Ri.css(c(s(n,ir.min,ir.max),r.navdir)),di&&So(Di,q(n,ir.min,ir.max,r.navdir)),rr.prevent={"<":n>=ir.max,">":n<=ir.min},clearTimeout(rr.t),rr.t=setTimeout(function(){co.l=n,An(n,!0)},Bn),An(n)}}),zi.hover(function(){setTimeout(function(){xi||Eo(!(_i=!0))},0)},function(){_i&&Eo(!(_i=!1))}),L(Ii,function(t){J(t),qo.call(this,t)},{onStart:function(){yo(),nr.control=!0},onTouchEnd:bo}),L(Vi,function(t){J(t),"thumbs"===r.navtype?ki.show("<"):ki.showSlide("prev")}),L(Bi,function(t){J(t),"thumbs"===r.navtype?ki.show(">"):ki.showSlide("next")}),Ii.each(function(){Y(this,function(t){qo.call(this,t)}),Lo(this)}),Y(Xi,function(){ki.toggleFullScreen(),o(Xi).trigger("focus")}),Lo(Xi),o.each("load push pop shift unshift reverse sort splice".split(" "),function(t,e){ki[e]=function(){return Do=Do||[],"load"!==e?Array.prototype[e].apply(Do,arguments):arguments[0]&&"object"==typeof arguments[0]&&arguments[0].length&&(Do=R(arguments[0])),Ao(),ki}}),Ao()},o.fn.fotorama=function(e){return this.each(function(){var n=this,i=o(this),r=i.data(),a=r.fotorama;a?a.setOptions(e,!0):z(function(){return!F(n)},function(){r.urtext=i.html(),new o.Fotorama(i,o.extend({},so,t.fotoramaDefaults,e,r))})})},o.Fotorama.instances=[],o.Fotorama.cache={},o.Fotorama.measures={},o=o||{},o.Fotorama=o.Fotorama||{},o.Fotorama.jst=o.Fotorama.jst||{},o.Fotorama.jst.dots=function(){{var t="";kn.escape}return t+='<div class="fotorama__nav__frame fotorama__nav__frame--dot" tabindex="0" role="button" data-gallery-role="nav-frame" data-nav-type="thumb" aria-label>\r\n <div class="fotorama__dot"></div>\r\n</div>'},o.Fotorama.jst.frameCaption=function(t){{var e,n="";kn.escape}return n+='<div class="fotorama__caption" aria-hidden="true">\r\n <div class="fotorama__caption__wrap" id="'+(null==(e=t.labelledby)?"":e)+'">'+(null==(e=t.caption)?"":e)+"</div>\r\n</div>\r\n"},o.Fotorama.jst.style=function(t){{var e,n="";kn.escape}return n+=".fotorama"+(null==(e=t.s)?"":e)+" .fotorama__nav--thumbs .fotorama__nav__frame{\r\npadding:"+(null==(e=t.m)?"":e)+"px;\r\nheight:"+(null==(e=t.h)?"":e)+"px}\r\n.fotorama"+(null==(e=t.s)?"":e)+" .fotorama__thumb-border{\r\nheight:"+(null==(e=t.h)?"":e)+"px;\r\nborder-width:"+(null==(e=t.b)?"":e)+"px;\r\nmargin-top:"+(null==(e=t.m)?"":e)+"px}"},o.Fotorama.jst.thumb=function(){{var t="";kn.escape}return t+='<div class="fotorama__nav__frame fotorama__nav__frame--thumb" tabindex="0" role="button" data-gallery-role="nav-frame" data-nav-type="thumb" aria-label>\r\n <div class="fotorama__thumb">\r\n </div>\r\n</div>'}}(window,document,location,"undefined"!=typeof jQuery&&jQuery); \ No newline at end of file diff --git a/lib/web/legacy-build.min.js b/lib/web/legacy-build.min.js index e6c723156294c1337da171abb4a71eafff53bc38..289cf49e76a13c09e121bca1233be56459494be7 100644 --- a/lib/web/legacy-build.min.js +++ b/lib/web/legacy-build.min.js @@ -5,4 +5,4 @@ var Prototype={Version:"1.7",Browser:(function(){var d=navigator.userAgent;var b * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ -(function(){var w=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,p=0,g=Object.prototype.toString,u=false,o=true;[0,0].sort(function(){o=false;return 0});var d=function(L,B,I,D){I=I||[];var e=B=B||document;if(B.nodeType!==1&&B.nodeType!==9){return[]}if(!L||typeof L!=="string"){return I}var J=[],K,G,P,O,H,A,z=true,E=v(B),N=L;while((w.exec(""),K=w.exec(N))!==null){N=K[3];J.push(K[1]);if(K[2]){A=K[3];break}}if(J.length>1&&q.exec(L)){if(J.length===2&&h.relative[J[0]]){G=l(J[0]+J[1],B)}else{G=h.relative[J[0]]?[B]:d(J.shift(),B);while(J.length){L=J.shift();if(h.relative[L]){L+=J.shift()}G=l(L,G)}}}else{if(!D&&J.length>1&&B.nodeType===9&&!E&&h.match.ID.test(J[0])&&!h.match.ID.test(J[J.length-1])){var Q=d.find(J.shift(),B,E);B=Q.expr?d.filter(Q.expr,Q.set)[0]:Q.set[0]}if(B){var Q=D?{expr:J.pop(),set:b(D)}:d.find(J.pop(),J.length===1&&(J[0]==="~"||J[0]==="+")&&B.parentNode?B.parentNode:B,E);G=Q.expr?d.filter(Q.expr,Q.set):Q.set;if(J.length>0){P=b(G)}else{z=false}while(J.length){var C=J.pop(),F=C;if(!h.relative[C]){C=""}else{F=J.pop()}if(F==null){F=B}h.relative[C](P,F,E)}}else{P=J=[]}}if(!P){P=G}if(!P){throw"Syntax error, unrecognized expression: "+(C||L)}if(g.call(P)==="[object Array]"){if(!z){I.push.apply(I,P)}else{if(B&&B.nodeType===1){for(var M=0;P[M]!=null;M++){if(P[M]&&(P[M]===true||P[M].nodeType===1&&n(B,P[M]))){I.push(G[M])}}}else{for(var M=0;P[M]!=null;M++){if(P[M]&&P[M].nodeType===1){I.push(G[M])}}}}}else{b(P,I)}if(A){d(A,e,I,D);d.uniqueSort(I)}return I};d.uniqueSort=function(z){if(f){u=o;z.sort(f);if(u){for(var e=1;e<z.length;e++){if(z[e]===z[e-1]){z.splice(e--,1)}}}}return z};d.matches=function(e,z){return d(e,null,null,z)};d.find=function(F,e,G){var E,C;if(!F){return[]}for(var B=0,A=h.order.length;B<A;B++){var D=h.order[B],C;if((C=h.leftMatch[D].exec(F))){var z=C[1];C.splice(1,1);if(z.substr(z.length-1)!=="\\"){C[1]=(C[1]||"").replace(/\\/g,"");E=h.find[D](C,e,G);if(E!=null){F=F.replace(h.match[D],"");break}}}}if(!E){E=e.getElementsByTagName("*")}return{set:E,expr:F}};d.filter=function(I,H,L,B){var A=I,N=[],F=H,D,e,E=H&&H[0]&&v(H[0]);while(I&&H.length){for(var G in h.filter){if((D=h.match[G].exec(I))!=null){var z=h.filter[G],M,K;e=false;if(F==N){N=[]}if(h.preFilter[G]){D=h.preFilter[G](D,F,L,N,B,E);if(!D){e=M=true}else{if(D===true){continue}}}if(D){for(var C=0;(K=F[C])!=null;C++){if(K){M=z(K,D,C,F);var J=B^!!M;if(L&&M!=null){if(J){e=true}else{F[C]=false}}else{if(J){N.push(K);e=true}}}}}if(M!==undefined){if(!L){F=N}I=I.replace(h.match[G],"");if(!e){return[]}break}}}if(I==A){if(e==null){throw"Syntax error, unrecognized expression: "+I}else{break}}A=I}return F};var h=d.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")}},relative:{"+":function(F,e,E){var C=typeof e==="string",G=C&&!/\W/.test(e),D=C&&!G;if(G&&!E){e=e.toUpperCase()}for(var B=0,A=F.length,z;B<A;B++){if((z=F[B])){while((z=z.previousSibling)&&z.nodeType!==1){}F[B]=D||z&&z.nodeName===e?z||false:z===e}}if(D){d.filter(e,F,true)}},">":function(E,z,F){var C=typeof z==="string";if(C&&!/\W/.test(z)){z=F?z:z.toUpperCase();for(var A=0,e=E.length;A<e;A++){var D=E[A];if(D){var B=D.parentNode;E[A]=B.nodeName===z?B:false}}}else{for(var A=0,e=E.length;A<e;A++){var D=E[A];if(D){E[A]=C?D.parentNode:D.parentNode===z}}if(C){d.filter(z,E,true)}}},"":function(B,z,D){var A=p++,e=y;if(!/\W/.test(z)){var C=z=D?z:z.toUpperCase();e=t}e("parentNode",z,A,B,C,D)},"~":function(B,z,D){var A=p++,e=y;if(typeof z==="string"&&!/\W/.test(z)){var C=z=D?z:z.toUpperCase();e=t}e("previousSibling",z,A,B,C,D)}},find:{ID:function(z,A,B){if(typeof A.getElementById!=="undefined"&&!B){var e=A.getElementById(z[1]);return e?[e]:[]}},NAME:function(A,D,E){if(typeof D.getElementsByName!=="undefined"){var z=[],C=D.getElementsByName(A[1]);for(var B=0,e=C.length;B<e;B++){if(C[B].getAttribute("name")===A[1]){z.push(C[B])}}return z.length===0?null:z}},TAG:function(e,z){return z.getElementsByTagName(e[1])}},preFilter:{CLASS:function(B,z,A,e,E,F){B=" "+B[1].replace(/\\/g,"")+" ";if(F){return B}for(var C=0,D;(D=z[C])!=null;C++){if(D){if(E^(D.className&&(" "+D.className+" ").indexOf(B)>=0)){if(!A){e.push(D)}}else{if(A){z[C]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(z,e){for(var A=0;e[A]===false;A++){}return e[A]&&v(e[A])?z[1]:z[1].toUpperCase()},CHILD:function(e){if(e[1]=="nth"){var z=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]=="even"&&"2n"||e[2]=="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(z[1]+(z[2]||1))-0;e[3]=z[3]-0}e[0]=p++;return e},ATTR:function(C,z,A,e,D,E){var B=C[1].replace(/\\/g,"");if(!E&&h.attrMap[B]){C[1]=h.attrMap[B]}if(C[2]==="~="){C[4]=" "+C[4]+" "}return C},PSEUDO:function(C,z,A,e,D){if(C[1]==="not"){if((w.exec(C[3])||"").length>1||/^\w/.test(C[3])){C[3]=d(C[3],null,null,z)}else{var B=d.filter(C[3],z,A,true^D);if(!A){e.push.apply(e,B)}return false}}else{if(h.match.POS.test(C[0])||h.match.CHILD.test(C[0])){return true}}return C},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(A,z,e){return !!d(e[3],A).length},header:function(e){return/h\d/i.test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toUpperCase()==="BUTTON"},input:function(e){return/input|select|textarea|button/i.test(e.nodeName)}},setFilters:{first:function(z,e){return e===0},last:function(A,z,e,B){return z===B.length-1},even:function(z,e){return e%2===0},odd:function(z,e){return e%2===1},lt:function(A,z,e){return z<e[3]-0},gt:function(A,z,e){return z>e[3]-0},nth:function(A,z,e){return e[3]-0==z},eq:function(A,z,e){return e[3]-0==z}},filter:{PSEUDO:function(E,A,B,F){var z=A[1],C=h.filters[z];if(C){return C(E,B,A,F)}else{if(z==="contains"){return(E.textContent||E.innerText||"").indexOf(A[3])>=0}else{if(z==="not"){var D=A[3];for(var B=0,e=D.length;B<e;B++){if(D[B]===E){return false}}return true}}}},CHILD:function(e,B){var E=B[1],z=e;switch(E){case"only":case"first":while((z=z.previousSibling)){if(z.nodeType===1){return false}}if(E=="first"){return true}z=e;case"last":while((z=z.nextSibling)){if(z.nodeType===1){return false}}return true;case"nth":var A=B[2],H=B[3];if(A==1&&H==0){return true}var D=B[0],G=e.parentNode;if(G&&(G.sizcache!==D||!e.nodeIndex)){var C=0;for(z=G.firstChild;z;z=z.nextSibling){if(z.nodeType===1){z.nodeIndex=++C}}G.sizcache=D}var F=e.nodeIndex-H;if(A==0){return F==0}else{return(F%A==0&&F/A>=0)}}},ID:function(z,e){return z.nodeType===1&&z.getAttribute("id")===e},TAG:function(z,e){return(e==="*"&&z.nodeType===1)||z.nodeName===e},CLASS:function(z,e){return(" "+(z.className||z.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(D,B){var A=B[1],e=h.attrHandle[A]?h.attrHandle[A](D):D[A]!=null?D[A]:D.getAttribute(A),E=e+"",C=B[2],z=B[4];return e==null?C==="!=":C==="="?E===z:C==="*="?E.indexOf(z)>=0:C==="~="?(" "+E+" ").indexOf(z)>=0:!z?E&&e!==false:C==="!="?E!=z:C==="^="?E.indexOf(z)===0:C==="$="?E.substr(E.length-z.length)===z:C==="|="?E===z||E.substr(0,z.length+1)===z+"-":false},POS:function(C,z,A,D){var e=z[2],B=h.setFilters[e];if(B){return B(C,A,z,D)}}}};var q=h.match.POS;for(var s in h.match){h.match[s]=new RegExp(h.match[s].source+/(?![^\[]*\])(?![^\(]*\))/.source);h.leftMatch[s]=new RegExp(/(^(?:.|\r|\n)*?)/.source+h.match[s].source)}var b=function(z,e){z=Array.prototype.slice.call(z,0);if(e){e.push.apply(e,z);return e}return z};try{Array.prototype.slice.call(document.documentElement.childNodes,0)}catch(r){b=function(C,B){var z=B||[];if(g.call(C)==="[object Array]"){Array.prototype.push.apply(z,C)}else{if(typeof C.length==="number"){for(var A=0,e=C.length;A<e;A++){z.push(C[A])}}else{for(var A=0;C[A];A++){z.push(C[A])}}}return z}}var f;if(document.documentElement.compareDocumentPosition){f=function(z,e){if(!z.compareDocumentPosition||!e.compareDocumentPosition){if(z==e){u=true}return 0}var A=z.compareDocumentPosition(e)&4?-1:z===e?0:1;if(A===0){u=true}return A}}else{if("sourceIndex" in document.documentElement){f=function(z,e){if(!z.sourceIndex||!e.sourceIndex){if(z==e){u=true}return 0}var A=z.sourceIndex-e.sourceIndex;if(A===0){u=true}return A}}else{if(document.createRange){f=function(B,z){if(!B.ownerDocument||!z.ownerDocument){if(B==z){u=true}return 0}var A=B.ownerDocument.createRange(),e=z.ownerDocument.createRange();A.setStart(B,0);A.setEnd(B,0);e.setStart(z,0);e.setEnd(z,0);var C=A.compareBoundaryPoints(Range.START_TO_END,e);if(C===0){u=true}return C}}}}(function(){var z=document.createElement("div"),A="script"+(new Date).getTime();z.innerHTML="<a name='"+A+"'/>";var e=document.documentElement;e.insertBefore(z,e.firstChild);if(!!document.getElementById(A)){h.find.ID=function(C,D,E){if(typeof D.getElementById!=="undefined"&&!E){var B=D.getElementById(C[1]);return B?B.id===C[1]||typeof B.getAttributeNode!=="undefined"&&B.getAttributeNode("id").nodeValue===C[1]?[B]:undefined:[]}};h.filter.ID=function(D,B){var C=typeof D.getAttributeNode!=="undefined"&&D.getAttributeNode("id");return D.nodeType===1&&C&&C.nodeValue===B}}e.removeChild(z);e=z=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){h.find.TAG=function(z,D){var C=D.getElementsByTagName(z[1]);if(z[1]==="*"){var B=[];for(var A=0;C[A];A++){if(C[A].nodeType===1){B.push(C[A])}}C=B}return C}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){h.attrHandle.href=function(z){return z.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=d,A=document.createElement("div");A.innerHTML="<p class='TEST'></p>";if(A.querySelectorAll&&A.querySelectorAll(".TEST").length===0){return}d=function(E,D,B,C){D=D||document;if(!C&&D.nodeType===9&&!v(D)){try{return b(D.querySelectorAll(E),B)}catch(F){}}return e(E,D,B,C)};for(var z in e){d[z]=e[z]}A=null})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}h.order.splice(1,0,"CLASS");h.find.CLASS=function(z,A,B){if(typeof A.getElementsByClassName!=="undefined"&&!B){return A.getElementsByClassName(z[1])}};e=null})()}function t(z,E,D,I,F,H){var G=z=="previousSibling"&&!H;for(var B=0,A=I.length;B<A;B++){var e=I[B];if(e){if(G&&e.nodeType===1){e.sizcache=D;e.sizset=B}e=e[z];var C=false;while(e){if(e.sizcache===D){C=I[e.sizset];break}if(e.nodeType===1&&!H){e.sizcache=D;e.sizset=B}if(e.nodeName===E){C=e;break}e=e[z]}I[B]=C}}}function y(z,E,D,I,F,H){var G=z=="previousSibling"&&!H;for(var B=0,A=I.length;B<A;B++){var e=I[B];if(e){if(G&&e.nodeType===1){e.sizcache=D;e.sizset=B}e=e[z];var C=false;while(e){if(e.sizcache===D){C=I[e.sizset];break}if(e.nodeType===1){if(!H){e.sizcache=D;e.sizset=B}if(typeof E!=="string"){if(e===E){C=true;break}}else{if(d.filter(E,[e]).length>0){C=e;break}}}e=e[z]}I[B]=C}}}var n=document.compareDocumentPosition?function(z,e){return z.compareDocumentPosition(e)&16}:function(z,e){return z!==e&&(z.contains?z.contains(e):true)};var v=function(e){return e.nodeType===9&&e.documentElement.nodeName!=="HTML"||!!e.ownerDocument&&e.ownerDocument.documentElement.nodeName!=="HTML"};var l=function(e,F){var B=[],C="",D,A=F.nodeType?[F]:F;while((D=h.match.PSEUDO.exec(e))){C+=D[0];e=e.replace(h.match.PSEUDO,"")}e=h.relative[e]?e+"*":e;for(var E=0,z=A.length;E<z;E++){d(e,A[E],B)}return d.filter(C,B)};window.Sizzle=d})();(function(e){var f=Prototype.Selector.extendElements;function b(g,h){return f(e(g,h||document))}function d(h,g){return e.matches(g,[h]).length==1}Prototype.Selector.engine=e;Prototype.Selector.select=b;Prototype.Selector.match=d})(Sizzle);window.Sizzle=Prototype._original_property;delete Prototype._original_property;var Form={reset:function(b){b=$(b);b.reset();return b},serializeElements:function(n,f){if(typeof f!="object"){f={hash:!!f}}else{if(Object.isUndefined(f.hash)){f.hash=true}}var g,l,b=false,h=f.submit,d,e;if(f.hash){e={};d=function(o,p,q){if(p in o){if(!Object.isArray(o[p])){o[p]=[o[p]]}o[p].push(q)}else{o[p]=q}return o}}else{e="";d=function(o,p,q){return o+(o?"&":"")+encodeURIComponent(p)+"="+encodeURIComponent(q)}}return n.inject(e,function(o,p){if(!p.disabled&&p.name){g=p.name;l=$(p).getValue();if(l!=null&&p.type!="file"&&(p.type!="submit"||(!b&&h!==false&&(!h||g==h)&&(b=true)))){o=d(o,g,l)}}return o})}};Form.Methods={serialize:function(d,b){return Form.serializeElements(Form.getElements(d),b)},getElements:function(g){var h=$(g).getElementsByTagName("*"),f,b=[],e=Form.Element.Serializers;for(var d=0;f=h[d];d++){b.push(f)}return b.inject([],function(l,n){if(e[n.tagName.toLowerCase()]){l.push(Element.extend(n))}return l})},getInputs:function(l,e,f){l=$(l);var b=l.getElementsByTagName("input");if(!e&&!f){return $A(b).map(Element.extend)}for(var g=0,n=[],h=b.length;g<h;g++){var d=b[g];if((e&&d.type!=e)||(f&&d.name!=f)){continue}n.push(Element.extend(d))}return n},disable:function(b){b=$(b);Form.getElements(b).invoke("disable");return b},enable:function(b){b=$(b);Form.getElements(b).invoke("enable");return b},findFirstElement:function(d){var e=$(d).getElements().findAll(function(f){return"hidden"!=f.type&&!f.disabled});var b=e.findAll(function(f){return f.hasAttribute("tabIndex")&&f.tabIndex>=0}).sortBy(function(f){return f.tabIndex}).first();return b?b:e.find(function(f){return/^(?:input|select|textarea)$/i.test(f.tagName)})},focusFirstElement:function(d){d=$(d);var b=d.findFirstElement();if(b){b.activate()}return d},request:function(d,b){d=$(d),b=Object.clone(b||{});var f=b.parameters,e=d.readAttribute("action")||"";if(e.blank()){e=window.location.href}b.parameters=d.serialize(true);if(f){if(Object.isString(f)){f=f.toQueryParams()}Object.extend(b.parameters,f)}if(d.hasAttribute("method")&&!b.method){b.method=d.method}return new Ajax.Request(e,b)}};Form.Element={focus:function(b){$(b).focus();return b},select:function(b){$(b).select();return b}};Form.Element.Methods={serialize:function(b){b=$(b);if(!b.disabled&&b.name){var d=b.getValue();if(d!=undefined){var e={};e[b.name]=d;return Object.toQueryString(e)}}return""},getValue:function(b){b=$(b);var d=b.tagName.toLowerCase();return Form.Element.Serializers[d](b)},setValue:function(b,d){b=$(b);var e=b.tagName.toLowerCase();Form.Element.Serializers[e](b,d);return b},clear:function(b){$(b).value="";return b},present:function(b){return $(b).value!=""},activate:function(b){b=$(b);try{b.focus();if(b.select&&(b.tagName.toLowerCase()!="input"||!(/^(?:button|reset|submit)$/i.test(b.type)))){b.select()}}catch(d){}return b},disable:function(b){b=$(b);b.disabled=true;return b},enable:function(b){b=$(b);b.disabled=false;return b}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers=(function(){function d(n,o){switch(n.type.toLowerCase()){case"checkbox":case"radio":return h(n,o);default:return g(n,o)}}function h(n,o){if(Object.isUndefined(o)){return n.checked?n.value:null}else{n.checked=!!o}}function g(n,o){if(Object.isUndefined(o)){return n.value}else{n.value=o}}function b(p,s){if(Object.isUndefined(s)){return(p.type==="select-one"?e:f)(p)}var o,q,t=!Object.isArray(s);for(var n=0,r=p.length;n<r;n++){o=p.options[n];q=this.optionValue(o);if(t){if(q==s){o.selected=true;return}}else{o.selected=s.include(q)}}}function e(o){var n=o.selectedIndex;return n>=0?l(o.options[n]):null}function f(q){var n,r=q.length;if(!r){return null}for(var p=0,n=[];p<r;p++){var o=q.options[p];if(o.selected){n.push(l(o))}}return n}function l(n){return Element.hasAttribute(n,"value")?n.value:n.text}return{input:d,inputSelector:h,textarea:g,select:b,selectOne:e,selectMany:f,optionValue:l,button:g}})();Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,b,d,e){$super(e,d);this.element=$(b);this.lastValue=this.getValue()},execute:function(){var b=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(b)?this.lastValue!=b:String(this.lastValue)!=String(b)){this.callback(this.element,b);this.lastValue=b}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element)}});Abstract.EventObserver=Class.create({initialize:function(b,d){this.element=$(b);this.callback=d;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks()}else{this.registerCallback(this.element)}},onElementEvent:function(){var b=this.getValue();if(this.lastValue!=b){this.callback(this.element,b);this.lastValue=b}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this)},registerCallback:function(b){if(b.type){switch(b.type.toLowerCase()){case"checkbox":case"radio":Event.observe(b,"click",this.onElementEvent.bind(this));break;default:Event.observe(b,"change",this.onElementEvent.bind(this));break}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element)}});(function(){var J={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{}};var h=document.documentElement;var K="onmouseenter" in h&&"onmouseleave" in h;var b=function(L){return false};if(window.attachEvent){if(window.addEventListener){b=function(L){return !(L instanceof window.Event)}}else{b=function(L){return true}}}var y;function H(M,L){return M.which?(M.which===L+1):(M.button===L)}var u={0:1,1:4,2:2};function F(M,L){return M.button===u[L]}function I(M,L){switch(L){case 0:return M.which==1&&!M.metaKey;case 1:return M.which==2||(M.which==1&&M.metaKey);case 2:return M.which==3;default:return false}}if(window.attachEvent){if(!window.addEventListener){y=F}else{y=function(M,L){return b(M)?F(M,L):H(M,L)}}}else{if(Prototype.Browser.WebKit){y=I}else{y=H}}function C(L){return y(L,0)}function A(L){return y(L,1)}function t(L){return y(L,2)}function f(N){N=J.extend(N);var M=N.target,L=N.type,O=N.currentTarget;if(O&&O.tagName){if(L==="load"||L==="error"||(L==="click"&&O.tagName.toLowerCase()==="input"&&O.type==="radio")){M=O}}if(M.nodeType==Node.TEXT_NODE){M=M.parentNode}return Element.extend(M)}function v(M,N){var L=J.element(M);if(!N){return L}while(L){if(Object.isElement(L)&&Prototype.Selector.match(L,N)){return Element.extend(L)}L=L.parentNode}}function z(L){return{x:e(L),y:d(L)}}function e(N){var M=document.documentElement,L=document.body||{scrollLeft:0};return N.pageX||(N.clientX+(M.scrollLeft||L.scrollLeft)-(M.clientLeft||0))}function d(N){var M=document.documentElement,L=document.body||{scrollTop:0};return N.pageY||(N.clientY+(M.scrollTop||L.scrollTop)-(M.clientTop||0))}function w(L){J.extend(L);L.preventDefault();L.stopPropagation();L.stopped=true}J.Methods={isLeftClick:C,isMiddleClick:A,isRightClick:t,element:f,findElement:v,pointer:z,pointerX:e,pointerY:d,stop:w};var E=Object.keys(J.Methods).inject({},function(L,M){L[M]=J.Methods[M].methodize();return L});if(window.attachEvent){function o(M){var L;switch(M.type){case"mouseover":case"mouseenter":L=M.fromElement;break;case"mouseout":case"mouseleave":L=M.toElement;break;default:return null}return Element.extend(L)}var B={stopPropagation:function(){this.cancelBubble=true},preventDefault:function(){this.returnValue=false},inspect:function(){return"[object Event]"}};J.extend=function(M,L){if(!M){return false}if(!b(M)){return M}if(M._extendedByPrototype){return M}M._extendedByPrototype=Prototype.emptyFunction;var N=J.pointer(M);Object.extend(M,{target:M.srcElement||L,relatedTarget:o(M),pageX:N.x,pageY:N.y});Object.extend(M,E);Object.extend(M,B);return M}}else{J.extend=Prototype.K}if(window.addEventListener){J.prototype=window.Event.prototype||document.createEvent("HTMLEvents").__proto__;Object.extend(J.prototype,E)}function s(P,O,Q){var N=Element.retrieve(P,"prototype_event_registry");if(Object.isUndefined(N)){g.push(P);N=Element.retrieve(P,"prototype_event_registry",$H())}var L=N.get(O);if(Object.isUndefined(L)){L=[];N.set(O,L)}if(L.pluck("handler").include(Q)){return false}var M;if(O.include(":")){M=function(R){if(Object.isUndefined(R.eventName)){return false}if(R.eventName!==O){return false}J.extend(R,P);Q.call(P,R)}}else{if(!K&&(O==="mouseenter"||O==="mouseleave")){if(O==="mouseenter"||O==="mouseleave"){M=function(S){J.extend(S,P);var R=S.relatedTarget;while(R&&R!==P){try{R=R.parentNode}catch(T){R=P}}if(R===P){return}Q.call(P,S)}}}else{M=function(R){J.extend(R,P);Q.call(P,R)}}}M.handler=Q;L.push(M);return M}function n(){for(var L=0,M=g.length;L<M;L++){J.stopObserving(g[L]);g[L]=null}}var g=[];if(Prototype.Browser.IE){window.attachEvent("onunload",n)}if(Prototype.Browser.WebKit){window.addEventListener("unload",Prototype.emptyFunction,false)}var r=Prototype.K,l={mouseenter:"mouseover",mouseleave:"mouseout"};if(!K){r=function(L){return(l[L]||L)}}function D(O,N,P){O=$(O);var M=s(O,N,P);if(!M){return O}if(N.include(":")){if(O.addEventListener){O.addEventListener("dataavailable",M,false)}else{O.attachEvent("ondataavailable",M);O.attachEvent("onlosecapture",M)}}else{var L=r(N);if(O.addEventListener){O.addEventListener(L,M,false)}else{O.attachEvent("on"+L,M)}}return O}function q(R,O,S){R=$(R);var N=Element.retrieve(R,"prototype_event_registry");if(!N){return R}if(!O){N.each(function(U){var T=U.key;q(R,T)});return R}var P=N.get(O);if(!P){return R}if(!S){P.each(function(T){q(R,O,T.handler)});return R}var Q=P.length,M;while(Q--){if(P[Q].handler===S){M=P[Q];break}}if(!M){return R}if(O.include(":")){if(R.removeEventListener){R.removeEventListener("dataavailable",M,false)}else{R.detachEvent("ondataavailable",M);R.detachEvent("onlosecapture",M)}}else{var L=r(O);if(R.removeEventListener){R.removeEventListener(L,M,false)}else{R.detachEvent("on"+L,M)}}N.set(O,P.without(M));return R}function G(O,N,M,L){O=$(O);if(Object.isUndefined(L)){L=true}if(O==document&&document.createEvent&&!O.dispatchEvent){O=document.documentElement}var P;if(document.createEvent){P=document.createEvent("HTMLEvents");P.initEvent("dataavailable",L,true)}else{P=document.createEventObject();P.eventType=L?"ondataavailable":"onlosecapture"}P.eventName=N;P.memo=M||{};if(document.createEvent){O.dispatchEvent(P)}else{O.fireEvent(P.eventType,P)}return J.extend(P)}J.Handler=Class.create({initialize:function(N,M,L,O){this.element=$(N);this.eventName=M;this.selector=L;this.callback=O;this.handler=this.handleEvent.bind(this)},start:function(){J.observe(this.element,this.eventName,this.handler);return this},stop:function(){J.stopObserving(this.element,this.eventName,this.handler);return this},handleEvent:function(M){var L=J.findElement(M,this.selector);if(L){this.callback.call(this.element,M,L)}}});function p(N,M,L,O){N=$(N);if(Object.isFunction(L)&&Object.isUndefined(O)){O=L,L=null}return new J.Handler(N,M,L,O).start()}Object.extend(J,J.Methods);Object.extend(J,{fire:G,observe:D,stopObserving:q,on:p});Element.addMethods({fire:G,observe:D,stopObserving:q,on:p});Object.extend(document,{fire:G.methodize(),observe:D.methodize(),stopObserving:q.methodize(),on:p.methodize(),loaded:false});if(window.Event){Object.extend(window.Event,J)}else{window.Event=J}})();(function(){var e;function b(){if(document.loaded){return}if(e){window.clearTimeout(e)}document.loaded=true;document.fire("dom:loaded")}function d(){if(document.readyState==="complete"){document.stopObserving("readystatechange",d);b()}}if(document.addEventListener){document.addEventListener("DOMContentLoaded",b,false)}else{document.observe("readystatechange",d);if(window==top){var e=window.setInterval(function(){try{document.documentElement.doScroll("left")}catch(f){return}window.clearInterval(e);b()},5)}}Event.observe(window,"load",b)})();Element.addMethods();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(b,d){return Element.insert(b,{before:d})},Top:function(b,d){return Element.insert(b,{top:d})},Bottom:function(b,d){return Element.insert(b,{bottom:d})},After:function(b,d){return Element.insert(b,{after:d})}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(d,b,e){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(d,b,e)}this.xcomp=b;this.ycomp=e;this.offset=Element.cumulativeOffset(d);return(e>=this.offset[1]&&e<this.offset[1]+d.offsetHeight&&b>=this.offset[0]&&b<this.offset[0]+d.offsetWidth)},withinIncludingScrolloffsets:function(d,b,f){var e=Element.cumulativeScrollOffset(d);this.xcomp=b+e[0]-this.deltaX;this.ycomp=f+e[1]-this.deltaY;this.offset=Element.cumulativeOffset(d);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+d.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+d.offsetWidth)},overlap:function(d,b){if(!d){return 0}if(d=="vertical"){return((this.offset[1]+b.offsetHeight)-this.ycomp)/b.offsetHeight}if(d=="horizontal"){return((this.offset[0]+b.offsetWidth)-this.xcomp)/b.offsetWidth}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(b){Position.prepare();return Element.absolutize(b)},relativize:function(b){Position.prepare();return Element.relativize(b)},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(d,e,b){b=b||{};return Element.clonePosition(e,d,b)}};if(!document.getElementsByClassName){document.getElementsByClassName=function(d){function b(e){return e.blank()?null:"[contains(concat(' ', @class, ' '), ' "+e+" ')]"}d.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(e,g){g=g.toString().strip();var f=/\s/.test(g)?$w(g).map(b).join(""):b(g);return f?document._getElementsByXPath(".//*"+f,e):[]}:function(g,h){h=h.toString().strip();var l=[],n=(/\s/.test(h)?$w(h):null);if(!n&&!h){return l}var e=$(g).getElementsByTagName("*");h=" "+h+" ";for(var f=0,p,o;p=e[f];f++){if(p.className&&(o=" "+p.className+" ")&&(o.include(h)||(n&&n.all(function(q){return !q.toString().blank()&&o.include(" "+q+" ")})))){l.push(Element.extend(p))}}return l};return function(f,e){return $(e||document.body).getElementsByClassName(f)}}(Element.Methods)}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(b){this.element=$(b)},_each:function(b){this.element.className.split(/\s+/).select(function(d){return d.length>0})._each(b)},set:function(b){this.element.className=b},add:function(b){if(this.include(b)){return}this.set($A(this).concat(b).join(" "))},remove:function(b){if(!this.include(b)){return}this.set($A(this).without(b).join(" "))},toString:function(){return $A(this).join(" ")}};Object.extend(Element.ClassNames.prototype,Enumerable);(function(){window.Selector=Class.create({initialize:function(b){this.expression=b.strip()},findElements:function(b){return Prototype.Selector.select(this.expression,b)},match:function(b){return Prototype.Selector.match(b,this.expression)},toString:function(){return this.expression},inspect:function(){return"#<Selector: "+this.expression+">"}});Object.extend(Selector,{matchElements:function(h,l){var b=Prototype.Selector.match,f=[];for(var e=0,g=h.length;e<g;e++){var d=h[e];if(b(d,l)){f.push(Element.extend(d))}}return f},findElement:function(h,l,d){d=d||0;var b=0,f;for(var e=0,g=h.length;e<g;e++){f=h[e];if(Prototype.Selector.match(f,l)&&d===b++){return Element.extend(f)}}},findChildElements:function(d,e){var b=e.toArray().join(", ");return Prototype.Selector.select(b,d||document)}})})();var Window=Class.create();Window.keepMultiModalWindow=false;Window.hasEffectLib=(typeof Effect!="undefined");Window.resizeEffectDuration=0.4;Window.prototype={initialize:function(){var e;var d=0;if(arguments.length>0){if(typeof arguments[0]=="string"){e=arguments[0];d=1}else{e=arguments[0]?arguments[0].id:null}}if(!e){e="window_"+new Date().getTime()}if($(e)){alert("Window "+e+" is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor")}this.options=Object.extend({className:"dialog",windowClassName:null,blurClassName:null,minWidth:100,minHeight:20,resizable:true,closable:true,minimizable:true,maximizable:true,draggable:true,userData:null,showEffect:(Window.hasEffectLib?Effect.Appear:Element.show),hideEffect:(Window.hasEffectLib?Effect.Fade:Element.hide),showEffectOptions:{},hideEffectOptions:{},effectOptions:null,parent:document.body,title:" ",url:null,onload:Prototype.emptyFunction,width:200,height:300,opacity:1,recenterAuto:true,wiredDrag:false,closeOnEsc:true,closeCallback:null,destroyOnClose:false,gridX:1,gridY:1},arguments[d]||{});if(this.options.blurClassName){this.options.focusClassName=this.options.className}if(typeof this.options.top=="undefined"&&typeof this.options.bottom=="undefined"){this.options.top=this._round(Math.random()*500,this.options.gridY)}if(typeof this.options.left=="undefined"&&typeof this.options.right=="undefined"){this.options.left=this._round(Math.random()*500,this.options.gridX)}if(this.options.effectOptions){Object.extend(this.options.hideEffectOptions,this.options.effectOptions);Object.extend(this.options.showEffectOptions,this.options.effectOptions);if(this.options.showEffect==Element.Appear){this.options.showEffectOptions.to=this.options.opacity}}if(Window.hasEffectLib){if(this.options.showEffect==Effect.Appear){this.options.showEffectOptions.to=this.options.opacity}if(this.options.hideEffect==Effect.Fade){this.options.hideEffectOptions.from=this.options.opacity}}if(this.options.hideEffect==Element.hide){this.options.hideEffect=function(){Element.hide(this.element);if(this.options.destroyOnClose){this.destroy()}}.bind(this)}if(this.options.parent!=document.body){this.options.parent=$(this.options.parent)}this.element=this._createWindow(e);this.element.win=this;this.eventMouseDown=this._initDrag.bindAsEventListener(this);this.eventMouseUp=this._endDrag.bindAsEventListener(this);this.eventMouseMove=this._updateDrag.bindAsEventListener(this);this.eventOnLoad=this._getWindowBorderSize.bindAsEventListener(this);this.eventMouseDownContent=this.toFront.bindAsEventListener(this);this.eventResize=this._recenter.bindAsEventListener(this);this.eventKeyUp=this._keyUp.bindAsEventListener(this);this.topbar=$(this.element.id+"_top");this.bottombar=$(this.element.id+"_bottom");this.content=$(this.element.id+"_content");Event.observe(this.topbar,"mousedown",this.eventMouseDown);Event.observe(this.bottombar,"mousedown",this.eventMouseDown);Event.observe(this.content,"mousedown",this.eventMouseDownContent);Event.observe(window,"load",this.eventOnLoad);Event.observe(window,"resize",this.eventResize);Event.observe(window,"scroll",this.eventResize);Event.observe(document,"keyup",this.eventKeyUp);Event.observe(this.options.parent,"scroll",this.eventResize);if(this.options.draggable){var b=this;[this.topbar,this.topbar.up().previous(),this.topbar.up().next()].each(function(f){f.observe("mousedown",b.eventMouseDown);f.addClassName("top_draggable")});[this.bottombar.up(),this.bottombar.up().previous(),this.bottombar.up().next()].each(function(f){f.observe("mousedown",b.eventMouseDown);f.addClassName("bottom_draggable")})}if(this.options.resizable){this.sizer=$(this.element.id+"_sizer");Event.observe(this.sizer,"mousedown",this.eventMouseDown)}this.useLeft=null;this.useTop=null;if(typeof this.options.left!="undefined"){this.element.setStyle({left:parseFloat(this.options.left)+"px"});this.useLeft=true}else{this.element.setStyle({right:parseFloat(this.options.right)+"px"});this.useLeft=false}if(typeof this.options.top!="undefined"){this.element.setStyle({top:parseFloat(this.options.top)+"px"});this.useTop=true}else{this.element.setStyle({bottom:parseFloat(this.options.bottom)+"px"});this.useTop=false}this.storedLocation=null;this.setOpacity(this.options.opacity);if(this.options.zIndex){this.setZIndex(this.options.zIndex)}else{this.setZIndex(this.getMaxZIndex())}if(this.options.destroyOnClose){this.setDestroyOnClose(true)}this._getWindowBorderSize();this.width=this.options.width;this.height=this.options.height;this.visible=false;this.constraint=false;this.constraintPad={top:0,left:0,bottom:0,right:0};if(this.width&&this.height){this.setSize(this.options.width,this.options.height)}this.setTitle(this.options.title);Windows.register(this)},getMaxZIndex:function(){var b=0,d;var g=document.body.childNodes;for(d=0;d<g.length;d++){var e=g[d];var f=e.nodeType==1?parseInt(e.style.zIndex,10)||0:0;if(f<10000){b=Math.max(b,f)}}return b+10},destroy:function(){this._notify("onDestroy");Event.stopObserving(this.topbar,"mousedown",this.eventMouseDown);Event.stopObserving(this.bottombar,"mousedown",this.eventMouseDown);Event.stopObserving(this.content,"mousedown",this.eventMouseDownContent);Event.stopObserving(window,"load",this.eventOnLoad);Event.stopObserving(window,"resize",this.eventResize);Event.stopObserving(window,"scroll",this.eventResize);Event.stopObserving(this.content,"load",this.options.onload);Event.stopObserving(document,"keyup",this.eventKeyUp);if(this._oldParent){var e=this.getContent();var b=null;for(var d=0;d<e.childNodes.length;d++){b=e.childNodes[d];if(b.nodeType==1){break}b=null}if(b){this._oldParent.appendChild(b)}this._oldParent=null}if(this.sizer){Event.stopObserving(this.sizer,"mousedown",this.eventMouseDown)}if(this.options.url){this.content.src=null}if(this.iefix){Element.remove(this.iefix)}Element.remove(this.element);Windows.unregister(this)},setCloseCallback:function(b){this.options.closeCallback=b},getContent:function(){return this.content},setContent:function(n,l,e){var b=$(n);if(null==b){throw"Unable to find element '"+n+"' in DOM"}this._oldParent=b.parentNode;var h=null;var g=null;if(l){h=Element.getDimensions(b)}if(e){g=Position.cumulativeOffset(b)}var f=this.getContent();this.setHTMLContent("");f=this.getContent();f.appendChild(b);b.show();if(l){this.setSize(h.width,h.height)}if(e){this.setLocation(g[1]-this.heightN,g[0]-this.widthW)}},setHTMLContent:function(b){if(this.options.url){this.content.src=null;this.options.url=null;var d='<div id="'+this.getId()+'_content" class="'+this.options.className+'_content"> </div>';$(this.getId()+"_table_content").innerHTML=d;this.content=$(this.element.id+"_content")}this.getContent().innerHTML=b},setAjaxContent:function(d,b,f,e){this.showFunction=f?"showCenter":"show";this.showModal=e||false;b=b||{};this.setHTMLContent("");this.onComplete=b.onComplete;if(!this._onCompleteHandler){this._onCompleteHandler=this._setAjaxContent.bind(this)}b.onComplete=this._onCompleteHandler;new Ajax.Request(d,b);b.onComplete=this.onComplete},_setAjaxContent:function(b){Element.update(this.getContent(),b.responseText);if(this.onComplete){this.onComplete(b)}this.onComplete=null;this[this.showFunction](this.showModal)},setURL:function(b){if(this.options.url){this.content.src=null}this.options.url=b;var d="<iframe frameborder='0' name='"+this.getId()+"_content' id='"+this.getId()+"_content' src='"+b+"' width='"+this.width+"' height='"+this.height+"'> </iframe>";$(this.getId()+"_table_content").innerHTML=d;this.content=$(this.element.id+"_content")},getURL:function(){return this.options.url?this.options.url:null},refresh:function(){if(this.options.url){$(this.element.getAttribute("id")+"_content").src=this.options.url}},setCookie:function(d,e,t,g,b){d=d||this.element.id;this.cookie=[d,e,t,g,b];var r=WindowUtilities.getCookie(d);if(r){var s=r.split(",");var p=s[0].split(":");var o=s[1].split(":");var q=parseFloat(s[2]),l=parseFloat(s[3]);var n=s[4];var f=s[5];this.setSize(q,l);if(n=="true"){this.doMinimize=true}else{if(f=="true"){this.doMaximize=true}}this.useLeft=p[0]=="l";this.useTop=o[0]=="t";this.element.setStyle(this.useLeft?{left:p[1]}:{right:p[1]});this.element.setStyle(this.useTop?{top:o[1]}:{bottom:o[1]})}},getId:function(){return this.element.id},setDestroyOnClose:function(){this.options.destroyOnClose=true},setConstraint:function(b,d){this.constraint=b;this.constraintPad=Object.extend(this.constraintPad,d||{});if(this.useTop&&this.useLeft){this.setLocation(parseFloat(this.element.style.top),parseFloat(this.element.style.left))}},_initDrag:function(d){if(Event.element(d)==this.sizer&&this.isMinimized()){return}if(Event.element(d)!=this.sizer&&this.isMaximized()){return}if(Prototype.Browser.IE&&this.heightN==0){this._getWindowBorderSize()}this.pointer=[this._round(Event.pointerX(d),this.options.gridX),this._round(Event.pointerY(d),this.options.gridY)];if(this.options.wiredDrag){this.currentDrag=this._createWiredElement()}else{this.currentDrag=this.element}if(Event.element(d)==this.sizer){this.doResize=true;this.widthOrg=this.width;this.heightOrg=this.height;this.bottomOrg=parseFloat(this.element.getStyle("bottom"));this.rightOrg=parseFloat(this.element.getStyle("right"));this._notify("onStartResize")}else{this.doResize=false;var b=$(this.getId()+"_close");if(b&&Position.within(b,this.pointer[0],this.pointer[1])){this.currentDrag=null;return}this.toFront();if(!this.options.draggable){return}this._notify("onStartMove")}Event.observe(document,"mouseup",this.eventMouseUp,false);Event.observe(document,"mousemove",this.eventMouseMove,false);WindowUtilities.disableScreen("__invisible__","__invisible__",this.overlayOpacity);document.body.ondrag=function(){return false};document.body.onselectstart=function(){return false};this.currentDrag.show();Event.stop(d)},_round:function(d,b){return b==1?d:d=Math.floor(d/b)*b},_updateDrag:function(d){var b=[this._round(Event.pointerX(d),this.options.gridX),this._round(Event.pointerY(d),this.options.gridY)];var q=b[0]-this.pointer[0];var p=b[1]-this.pointer[1];if(this.doResize){var o=this.widthOrg+q;var f=this.heightOrg+p;q=this.width-this.widthOrg;p=this.height-this.heightOrg;if(this.useLeft){o=this._updateWidthConstraint(o)}else{this.currentDrag.setStyle({right:(this.rightOrg-q)+"px"})}if(this.useTop){f=this._updateHeightConstraint(f)}else{this.currentDrag.setStyle({bottom:(this.bottomOrg-p)+"px"})}this.setSize(o,f);this._notify("onResize")}else{this.pointer=b;if(this.useLeft){var e=parseFloat(this.currentDrag.getStyle("left"))+q;var n=this._updateLeftConstraint(e);this.pointer[0]+=n-e;this.currentDrag.setStyle({left:n+"px"})}else{this.currentDrag.setStyle({right:parseFloat(this.currentDrag.getStyle("right"))-q+"px"})}if(this.useTop){var l=parseFloat(this.currentDrag.getStyle("top"))+p;var g=this._updateTopConstraint(l);this.pointer[1]+=g-l;this.currentDrag.setStyle({top:g+"px"})}else{this.currentDrag.setStyle({bottom:parseFloat(this.currentDrag.getStyle("bottom"))-p+"px"})}this._notify("onMove")}if(this.iefix){this._fixIEOverlapping()}this._removeStoreLocation();Event.stop(d)},_endDrag:function(b){WindowUtilities.enableScreen("__invisible__");if(this.doResize){this._notify("onEndResize")}else{this._notify("onEndMove")}Event.stopObserving(document,"mouseup",this.eventMouseUp,false);Event.stopObserving(document,"mousemove",this.eventMouseMove,false);Event.stop(b);this._hideWiredElement();this._saveCookie();document.body.ondrag=null;document.body.onselectstart=null},_updateLeftConstraint:function(d){if(this.constraint&&this.useLeft&&this.useTop){var b=this.options.parent==document.body?WindowUtilities.getPageSize().windowWidth:this.options.parent.getDimensions().width;if(d<this.constraintPad.left){d=this.constraintPad.left}if(d+this.width+this.widthE+this.widthW>b-this.constraintPad.right){d=b-this.constraintPad.right-this.width-this.widthE-this.widthW}}return d},_updateTopConstraint:function(e){if(this.constraint&&this.useLeft&&this.useTop){var b=this.options.parent==document.body?WindowUtilities.getPageSize().windowHeight:this.options.parent.getDimensions().height;var d=this.height+this.heightN+this.heightS;if(e<this.constraintPad.top){e=this.constraintPad.top}if(e+d>b-this.constraintPad.bottom){e=b-this.constraintPad.bottom-d}}return e},_updateWidthConstraint:function(b){if(this.constraint&&this.useLeft&&this.useTop){var d=this.options.parent==document.body?WindowUtilities.getPageSize().windowWidth:this.options.parent.getDimensions().width;var e=parseFloat(this.element.getStyle("left"));if(e+b+this.widthE+this.widthW>d-this.constraintPad.right){b=d-this.constraintPad.right-e-this.widthE-this.widthW}}return b},_updateHeightConstraint:function(d){if(this.constraint&&this.useLeft&&this.useTop){var b=this.options.parent==document.body?WindowUtilities.getPageSize().windowHeight:this.options.parent.getDimensions().height;var e=parseFloat(this.element.getStyle("top"));if(e+d+this.heightN+this.heightS>b-this.constraintPad.bottom){d=b-this.constraintPad.bottom-e-this.heightN-this.heightS}}return d},_createWindow:function(b){var h=this.options.className;var f=document.createElement("div");f.setAttribute("id",b);f.className="dialog";if(this.options.windowClassName){f.className+=" "+this.options.windowClassName}var g;if(this.options.url){g='<iframe frameborder="0" name="'+b+'_content" id="'+b+'_content" src="'+this.options.url+'"> </iframe>'}else{g='<div id="'+b+'_content" class="'+h+'_content"> </div>'}var l=this.options.closable?"<div class='"+h+"_close' id='"+b+"_close' onclick='Windows.close(\""+b+"\", event)'> </div>":"";var n=this.options.minimizable?"<div class='"+h+"_minimize' id='"+b+"_minimize' onclick='Windows.minimize(\""+b+"\", event)'> </div>":"";var o=this.options.maximizable?"<div class='"+h+"_maximize' id='"+b+"_maximize' onclick='Windows.maximize(\""+b+"\", event)'> </div>":"";var e=this.options.resizable?"class='"+h+"_sizer' id='"+b+"_sizer'":"class='"+h+"_se'";var d="../themes/default/blank.gif";f.innerHTML=l+n+o+" <a href='#' id='"+b+"_focus_anchor'><!-- --></a> <table id='"+b+"_row1' class=\"top table_window\"> <tr> <td class='"+h+"_nw'></td> <td class='"+h+"_n'><div id='"+b+"_top' class='"+h+"_title title_window'>"+this.options.title+"</div></td> <td class='"+h+"_ne'></td> </tr> </table> <table id='"+b+"_row2' class=\"mid table_window\"> <tr> <td class='"+h+"_w'></td> <td id='"+b+"_table_content' class='"+h+"_content' valign='top'>"+g+"</td> <td class='"+h+"_e'></td> </tr> </table> <table id='"+b+"_row3' class=\"bot table_window\"> <tr> <td class='"+h+"_sw'></td> <td class='"+h+"_s'><div id='"+b+"_bottom' class='status_bar'><span style='float:left; width:1px; height:1px'></span></div></td> <td "+e+"></td> </tr> </table> ";Element.hide(f);this.options.parent.insertBefore(f,this.options.parent.firstChild);Event.observe($(b+"_content"),"load",this.options.onload);return f},changeClassName:function(b){var d=this.options.className;var e=this.getId();$A(["_close","_minimize","_maximize","_sizer","_content"]).each(function(f){this._toggleClassName($(e+f),d+f,b+f)}.bind(this));this._toggleClassName($(e+"_top"),d+"_title",b+"_title");$$("#"+e+" td").each(function(f){f.className=f.className.sub(d,b)});this.options.className=b},_toggleClassName:function(e,d,b){if(e){e.removeClassName(d);e.addClassName(b)}},setLocation:function(f,d){f=this._updateTopConstraint(f);d=this._updateLeftConstraint(d);var b=this.currentDrag||this.element;b.setStyle({top:f+"px"});b.setStyle({left:d+"px"});this.useLeft=true;this.useTop=true},getLocation:function(){var b={};if(this.useTop){b=Object.extend(b,{top:this.element.getStyle("top")})}else{b=Object.extend(b,{bottom:this.element.getStyle("bottom")})}if(this.useLeft){b=Object.extend(b,{left:this.element.getStyle("left")})}else{b=Object.extend(b,{right:this.element.getStyle("right")})}return b},getSize:function(){return{width:this.width,height:this.height}},setSize:function(f,d,b){f=parseFloat(f);d=parseFloat(d);if(!this.minimized&&f<this.options.minWidth){f=this.options.minWidth}if(!this.minimized&&d<this.options.minHeight){d=this.options.minHeight}if(this.options.maxHeight&&d>this.options.maxHeight){d=this.options.maxHeight}if(this.options.maxWidth&&f>this.options.maxWidth){f=this.options.maxWidth}if(this.useTop&&this.useLeft&&Window.hasEffectLib&&Effect.ResizeWindow&&b){new Effect.ResizeWindow(this,null,null,f,d,{duration:Window.resizeEffectDuration})}else{this.width=f;this.height=d;var h=this.currentDrag?this.currentDrag:this.element;h.setStyle({width:f+this.widthW+this.widthE+"px"});h.setStyle({height:d+this.heightN+this.heightS+"px"});if(!this.currentDrag||this.currentDrag==this.element){var g=$(this.element.id+"_content");g.setStyle({height:d+"px"});g.setStyle({width:f+"px"})}}},updateHeight:function(){this.setSize(this.width,this.content.scrollHeight,true)},updateWidth:function(){this.setSize(this.content.scrollWidth,this.height,true)},toFront:function(){if(this.element.style.zIndex<Windows.maxZIndex){this.setZIndex(Windows.maxZIndex+1)}if(this.iefix){this._fixIEOverlapping()}},getBounds:function(d){if(!this.width||!this.height||!this.visible){this.computeBounds()}var b=this.width;var e=this.height;if(!d){b+=this.widthW+this.widthE;e+=this.heightN+this.heightS}var f=Object.extend(this.getLocation(),{width:b+"px",height:e+"px"});return f},computeBounds:function(){if(!this.width||!this.height){var b=WindowUtilities._computeSize(this.content.innerHTML,this.content.id,this.width,this.height,0,this.options.className);if(this.height){this.width=b+5}else{this.height=b+5}}this.setSize(this.width,this.height);if(this.centered){this._center(this.centerTop,this.centerLeft)}},show:function(d){this.visible=true;if(d){if(typeof this.overlayOpacity=="undefined"){var b=this;setTimeout(function(){b.show(d)},10);return}Windows.addModalWindow(this);this.modal=true;this.setZIndex(Windows.maxZIndex+1);Windows.unsetOverflow(this)}else{if(!this.element.style.zIndex){this.setZIndex(Windows.maxZIndex+1)}}if(this.oldStyle){this.getContent().setStyle({overflow:this.oldStyle})}this.computeBounds();this._notify("onBeforeShow");if(this.options.showEffect!=Element.show&&this.options.showEffectOptions){this.options.showEffect(this.element,this.options.showEffectOptions)}else{this.options.showEffect(this.element)}this._checkIEOverlapping();WindowUtilities.focusedWindow=this;this._notify("onShow");$(this.element.id+"_focus_anchor").focus()},showCenter:function(b,e,d){this.centered=true;this.centerTop=e;this.centerLeft=d;this.show(b)},isVisible:function(){return this.visible},_center:function(e,d){var f=WindowUtilities.getWindowScroll(this.options.parent);var b=WindowUtilities.getPageSize(this.options.parent);if(typeof e=="undefined"){e=(b.windowHeight-(this.height+this.heightN+this.heightS))/2}e+=f.top;if(typeof d=="undefined"){d=(b.windowWidth-(this.width+this.widthW+this.widthE))/2}d+=f.left;this.setLocation(e,d);this.toFront()},_recenter:function(d){if(this.centered){var b=WindowUtilities.getPageSize(this.options.parent);var e=WindowUtilities.getWindowScroll(this.options.parent);if(this.pageSize&&this.pageSize.windowWidth==b.windowWidth&&this.pageSize.windowHeight==b.windowHeight&&this.windowScroll.left==e.left&&this.windowScroll.top==e.top){return}this.pageSize=b;this.windowScroll=e;if($("overlay_modal")){$("overlay_modal").setStyle({height:(b.pageHeight+"px")})}if(this.options.recenterAuto){this._center(this.centerTop,this.centerLeft)}}},hide:function(){this.visible=false;if(this.modal){Windows.removeModalWindow(this);Windows.resetOverflow()}this.oldStyle=this.getContent().getStyle("overflow")||"auto";this.getContent().setStyle({overflow:"hidden"});this.options.hideEffect(this.element,this.options.hideEffectOptions);if(this.iefix){this.iefix.hide()}if(!this.doNotNotifyHide){this._notify("onHide")}},close:function(){if(this.visible){if(this.options.closeCallback&&!this.options.closeCallback(this)){return}if(this.options.destroyOnClose){var b=this.destroy.bind(this);if(this.options.hideEffectOptions.afterFinish){var d=this.options.hideEffectOptions.afterFinish;this.options.hideEffectOptions.afterFinish=function(){d();b()}}else{this.options.hideEffectOptions.afterFinish=function(){b()}}}Windows.updateFocusedWindow();this.doNotNotifyHide=true;this.hide();this.doNotNotifyHide=false;this._notify("onClose")}},minimize:function(){if(this.resizing){return}var b=$(this.getId()+"_row2");if(!this.minimized){this.minimized=true;var f=b.getDimensions().height;this.r2Height=f;var e=this.element.getHeight()-f;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,null,null,null,this.height-f,{duration:Window.resizeEffectDuration})}else{this.height-=f;this.element.setStyle({height:e+"px"});b.hide()}if(!this.useTop){var d=parseFloat(this.element.getStyle("bottom"));this.element.setStyle({bottom:(d+f)+"px"})}}else{this.minimized=false;var f=this.r2Height;this.r2Height=null;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,null,null,null,this.height+f,{duration:Window.resizeEffectDuration})}else{var e=this.element.getHeight()+f;this.height+=f;this.element.setStyle({height:e+"px"});b.show()}if(!this.useTop){var d=parseFloat(this.element.getStyle("bottom"));this.element.setStyle({bottom:(d-f)+"px"})}this.toFront()}this._notify("onMinimize");this._saveCookie()},maximize:function(){if(this.isMinimized()||this.resizing){return}if(Prototype.Browser.IE&&this.heightN==0){this._getWindowBorderSize()}if(this.storedLocation!=null){this._restoreLocation();if(this.iefix){this.iefix.hide()}}else{this._storeLocation();Windows.unsetOverflow(this);var l=WindowUtilities.getWindowScroll(this.options.parent);var d=WindowUtilities.getPageSize(this.options.parent);var h=l.left;var g=l.top;if(this.options.parent!=document.body){l={top:0,left:0,bottom:0,right:0};var f=this.options.parent.getDimensions();d.windowWidth=f.width;d.windowHeight=f.height;g=0;h=0}if(this.constraint){d.windowWidth-=Math.max(0,this.constraintPad.left)+Math.max(0,this.constraintPad.right);d.windowHeight-=Math.max(0,this.constraintPad.top)+Math.max(0,this.constraintPad.bottom);h+=Math.max(0,this.constraintPad.left);g+=Math.max(0,this.constraintPad.top)}var e=d.windowWidth-this.widthW-this.widthE;var b=d.windowHeight-this.heightN-this.heightS;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,g,h,e,b,{duration:Window.resizeEffectDuration})}else{this.setSize(e,b);this.element.setStyle(this.useLeft?{left:h}:{right:h});this.element.setStyle(this.useTop?{top:g}:{bottom:g})}this.toFront();if(this.iefix){this._fixIEOverlapping()}}this._notify("onMaximize");this._saveCookie()},isMinimized:function(){return this.minimized},isMaximized:function(){return(this.storedLocation!=null)},setOpacity:function(b){if(Element.setOpacity){Element.setOpacity(this.element,b)}},setZIndex:function(b){this.element.setStyle({zIndex:b});Windows.updateZindex(b,this)},setTitle:function(b){if(!b||b==""){b=" "}Element.update(this.element.id+"_top",b)},getTitle:function(){return $(this.element.id+"_top").innerHTML},setStatusBar:function(d){var b=$(this.getId()+"_bottom");if(typeof(d)=="object"){if(this.bottombar.firstChild){this.bottombar.replaceChild(d,this.bottombar.firstChild)}else{this.bottombar.appendChild(d)}}else{this.bottombar.innerHTML=d}},_checkIEOverlapping:function(){if(!this.iefix&&(navigator.appVersion.indexOf("MSIE")>0)&&(navigator.userAgent.indexOf("Opera")<0)&&(this.element.getStyle("position")=="absolute")){new Insertion.After(this.element.id,'<iframe id="'+this.element.id+'_iefix" style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix=$(this.element.id+"_iefix")}if(this.iefix){setTimeout(this._fixIEOverlapping.bind(this),50)}},_fixIEOverlapping:function(){Position.clone(this.element,this.iefix);this.iefix.style.zIndex=this.element.style.zIndex-1;this.iefix.show()},_keyUp:function(b){if(27==b.keyCode&&this.options.closeOnEsc){this.close()}},_getWindowBorderSize:function(d){var e=this._createHiddenDiv(this.options.className+"_n");this.heightN=Element.getDimensions(e).height;e.parentNode.removeChild(e);var e=this._createHiddenDiv(this.options.className+"_s");this.heightS=Element.getDimensions(e).height;e.parentNode.removeChild(e);var e=this._createHiddenDiv(this.options.className+"_e");this.widthE=Element.getDimensions(e).width;e.parentNode.removeChild(e);var e=this._createHiddenDiv(this.options.className+"_w");this.widthW=Element.getDimensions(e).width;e.parentNode.removeChild(e);var e=document.createElement("div");e.className="overlay_"+this.options.className;document.body.appendChild(e);var b=this;setTimeout(function(){b.overlayOpacity=($(e).getStyle("opacity"));e.parentNode.removeChild(e)},10);if(Prototype.Browser.IE){this.heightS=$(this.getId()+"_row3").getDimensions().height;this.heightN=$(this.getId()+"_row1").getDimensions().height}if(Prototype.Browser.WebKit&&Prototype.Browser.WebKitVersion<420){this.setSize(this.width,this.height)}if(this.doMaximize){this.maximize()}if(this.doMinimize){this.minimize()}},_createHiddenDiv:function(d){var b=document.body;var e=document.createElement("div");e.setAttribute("id",this.element.id+"_tmp");e.className=d;e.style.display="none";e.innerHTML="";b.insertBefore(e,b.firstChild);return e},_storeLocation:function(){if(this.storedLocation==null){this.storedLocation={useTop:this.useTop,useLeft:this.useLeft,top:this.element.getStyle("top"),bottom:this.element.getStyle("bottom"),left:this.element.getStyle("left"),right:this.element.getStyle("right"),width:this.width,height:this.height}}},_restoreLocation:function(){if(this.storedLocation!=null){this.useLeft=this.storedLocation.useLeft;this.useTop=this.storedLocation.useTop;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,this.storedLocation.top,this.storedLocation.left,this.storedLocation.width,this.storedLocation.height,{duration:Window.resizeEffectDuration})}else{this.element.setStyle(this.useLeft?{left:this.storedLocation.left}:{right:this.storedLocation.right});this.element.setStyle(this.useTop?{top:this.storedLocation.top}:{bottom:this.storedLocation.bottom});this.setSize(this.storedLocation.width,this.storedLocation.height)}Windows.resetOverflow();this._removeStoreLocation()}},_removeStoreLocation:function(){this.storedLocation=null},_saveCookie:function(){if(this.cookie){var b="";if(this.useLeft){b+="l:"+(this.storedLocation?this.storedLocation.left:this.element.getStyle("left"))}else{b+="r:"+(this.storedLocation?this.storedLocation.right:this.element.getStyle("right"))}if(this.useTop){b+=",t:"+(this.storedLocation?this.storedLocation.top:this.element.getStyle("top"))}else{b+=",b:"+(this.storedLocation?this.storedLocation.bottom:this.element.getStyle("bottom"))}b+=","+(this.storedLocation?this.storedLocation.width:this.width);b+=","+(this.storedLocation?this.storedLocation.height:this.height);b+=","+this.isMinimized();b+=","+this.isMaximized();WindowUtilities.setCookie(b,this.cookie)}},_createWiredElement:function(){if(!this.wiredElement){if(Prototype.Browser.IE){this._getWindowBorderSize()}var d=document.createElement("div");d.className="wired_frame "+this.options.className+"_wired_frame";d.style.position="absolute";this.options.parent.insertBefore(d,this.options.parent.firstChild);this.wiredElement=$(d)}if(this.useLeft){this.wiredElement.setStyle({left:this.element.getStyle("left")})}else{this.wiredElement.setStyle({right:this.element.getStyle("right")})}if(this.useTop){this.wiredElement.setStyle({top:this.element.getStyle("top")})}else{this.wiredElement.setStyle({bottom:this.element.getStyle("bottom")})}var b=this.element.getDimensions();this.wiredElement.setStyle({width:b.width+"px",height:b.height+"px"});this.wiredElement.setStyle({zIndex:Windows.maxZIndex+30});return this.wiredElement},_hideWiredElement:function(){if(!this.wiredElement||!this.currentDrag){return}if(this.currentDrag==this.element){this.currentDrag=null}else{if(this.useLeft){this.element.setStyle({left:this.currentDrag.getStyle("left")})}else{this.element.setStyle({right:this.currentDrag.getStyle("right")})}if(this.useTop){this.element.setStyle({top:this.currentDrag.getStyle("top")})}else{this.element.setStyle({bottom:this.currentDrag.getStyle("bottom")})}this.currentDrag.hide();this.currentDrag=null;if(this.doResize){this.setSize(this.width,this.height)}}},_notify:function(b){if(this.options[b]){this.options[b](this)}else{Windows.notify(b,this)}}};var Windows={windows:[],modalWindows:[],observers:[],focusedWindow:null,maxZIndex:0,overlayShowEffectOptions:{duration:0.5},overlayHideEffectOptions:{duration:0.5},addObserver:function(b){this.removeObserver(b);this.observers.push(b)},removeObserver:function(b){this.observers=this.observers.reject(function(d){return d==b})},notify:function(b,d){this.observers.each(function(e){if(e[b]){e[b](b,d)}})},getWindow:function(b){return this.windows.detect(function(e){return e.getId()==b})},getFocusedWindow:function(){return this.focusedWindow},updateFocusedWindow:function(){this.focusedWindow=this.windows.length>=2?this.windows[this.windows.length-2]:null},register:function(b){this.windows.push(b)},addModalWindow:function(b){if(this.modalWindows.length==0){WindowUtilities.disableScreen(b.options.className,"overlay_modal",b.overlayOpacity,b.getId(),b.options.parent)}else{if(Window.keepMultiModalWindow){$("overlay_modal").style.zIndex=Windows.maxZIndex+1;Windows.maxZIndex+=1;WindowUtilities._hideSelect(this.modalWindows.last().getId())}else{this.modalWindows.last().element.hide()}WindowUtilities._showSelect(b.getId())}this.modalWindows.push(b)},removeModalWindow:function(b){this.modalWindows.pop();if(this.modalWindows.length==0){WindowUtilities.enableScreen()}else{if(Window.keepMultiModalWindow){this.modalWindows.last().toFront();WindowUtilities._showSelect(this.modalWindows.last().getId())}else{this.modalWindows.last().element.show()}}},register:function(b){this.windows.push(b)},unregister:function(b){this.windows=this.windows.reject(function(e){return e==b})},closeAll:function(){this.windows.each(function(b){Windows.close(b.getId())})},closeAllModalWindows:function(){WindowUtilities.enableScreen();this.modalWindows.each(function(b){if(b){b.close()}})},minimize:function(e,b){var d=this.getWindow(e);if(d&&d.visible){d.minimize()}Event.stop(b)},maximize:function(e,b){var d=this.getWindow(e);if(d&&d.visible){d.maximize()}Event.stop(b)},close:function(e,b){var d=this.getWindow(e);if(d){d.close()}if(b){Event.stop(b)}},blur:function(d){var b=this.getWindow(d);if(!b){return}if(b.options.blurClassName){b.changeClassName(b.options.blurClassName)}if(this.focusedWindow==b){this.focusedWindow=null}b._notify("onBlur")},focus:function(d){var b=this.getWindow(d);if(!b){return}if(this.focusedWindow){this.blur(this.focusedWindow.getId())}if(b.options.focusClassName){b.changeClassName(b.options.focusClassName)}this.focusedWindow=b;b._notify("onFocus")},unsetOverflow:function(b){this.windows.each(function(e){e.oldOverflow=e.getContent().getStyle("overflow")||"auto";e.getContent().setStyle({overflow:"hidden"})});if(b&&b.oldOverflow){b.getContent().setStyle({overflow:b.oldOverflow})}},resetOverflow:function(){this.windows.each(function(b){if(b.oldOverflow){b.getContent().setStyle({overflow:b.oldOverflow})}})},updateZindex:function(b,d){if(b>this.maxZIndex){this.maxZIndex=b;if(this.focusedWindow){this.blur(this.focusedWindow.getId())}}this.focusedWindow=d;if(this.focusedWindow){this.focus(this.focusedWindow.getId())}}};var Dialog={dialogId:null,onCompleteFunc:null,callFunc:null,parameters:null,confirm:function(f,e){if(f&&typeof f!="string"){Dialog._runAjaxRequest(f,e,Dialog.confirm);return}f=f||"";e=e||{};var h=e.okLabel?e.okLabel:"Ok";var b=e.cancelLabel?e.cancelLabel:"Cancel";e=Object.extend(e,e.windowParameters||{});e.windowParameters=e.windowParameters||{};e.className=e.className||"alert";var d="class ='"+(e.buttonClass?e.buttonClass+" ":"")+" ok_button'";var g="class ='"+(e.buttonClass?e.buttonClass+" ":"")+" cancel_button'";var f=" <div class='"+e.className+"_message'>"+f+"</div> <div class='"+e.className+"_buttons'> <button type='button' title='"+h+"' onclick='Dialog.okCallback()' "+d+"><span><span><span>"+h+"</span></span></span></button> <button type='button' title='"+b+"' onclick='Dialog.cancelCallback()' "+g+"><span><span><span>"+b+"</span></span></span></button> </div> ";return this._openDialog(f,e)},alert:function(e,d){if(e&&typeof e!="string"){Dialog._runAjaxRequest(e,d,Dialog.alert);return}e=e||"";d=d||{};var f=d.okLabel?d.okLabel:"Ok";d=Object.extend(d,d.windowParameters||{});d.windowParameters=d.windowParameters||{};d.className=d.className||"alert";var b="class ='"+(d.buttonClass?d.buttonClass+" ":"")+" ok_button'";var e=" <div class='"+d.className+"_message'>"+e+"</div> <div class='"+d.className+"_buttons'> <button type='button' title='"+f+"' onclick='Dialog.okCallback()' "+b+"><span><span><span>"+f+"</span></span></span></button> </div>";return this._openDialog(e,d)},info:function(d,b){if(d&&typeof d!="string"){Dialog._runAjaxRequest(d,b,Dialog.info);return}d=d||"";b=b||{};b=Object.extend(b,b.windowParameters||{});b.windowParameters=b.windowParameters||{};b.className=b.className||"alert";var d="<div id='modal_dialog_message' class='"+b.className+"_message'>"+d+"</div>";if(b.showProgress){d+="<div id='modal_dialog_progress' class='"+b.className+"_progress'> </div>"}b.ok=null;b.cancel=null;return this._openDialog(d,b)},setInfoMessage:function(b){$("modal_dialog_message").update(b)},closeInfo:function(){Windows.close(this.dialogId)},_openDialog:function(g,f){var e=f.className;if(!f.height&&!f.width){f.width=WindowUtilities.getPageSize(f.options.parent||document.body).pageWidth/2}if(f.id){this.dialogId=f.id}else{var d=new Date();this.dialogId="modal_dialog_"+d.getTime();f.id=this.dialogId}if(!f.height||!f.width){var b=WindowUtilities._computeSize(g,this.dialogId,f.width,f.height,5,e);if(f.height){f.width=b+5}else{f.height=b+5}}f.effectOptions=f.effectOptions;f.resizable=f.resizable||false;f.minimizable=f.minimizable||false;f.maximizable=f.maximizable||false;f.draggable=f.draggable||false;f.closable=f.closable||false;var h=new Window(f);h.getContent().innerHTML=g;h.showCenter(true,f.top,f.left);h.setDestroyOnClose();h.cancelCallback=f.onCancel||f.cancel;h.okCallback=f.onOk||f.ok;return h},_getAjaxContent:function(b){Dialog.callFunc(b.responseText,Dialog.parameters)},_runAjaxRequest:function(e,d,b){if(e.options==null){e.options={}}Dialog.onCompleteFunc=e.options.onComplete;Dialog.parameters=d;Dialog.callFunc=b;e.options.onComplete=Dialog._getAjaxContent;new Ajax.Request(e.url,e.options)},okCallback:function(){var b=Windows.focusedWindow;if(!b.okCallback||b.okCallback(b)){$$("#"+b.getId()+" input").each(function(d){d.onclick=null});b.close()}},cancelCallback:function(){var b=Windows.focusedWindow;$$("#"+b.getId()+" input").each(function(d){d.onclick=null});b.close();if(b.cancelCallback){b.cancelCallback(b)}}};if(Prototype.Browser.WebKit){var array=navigator.userAgent.match(new RegExp(/AppleWebKit\/([\d\.\+]*)/));Prototype.Browser.WebKitVersion=parseFloat(array[1])}var WindowUtilities={getWindowScroll:function(parent){var T,L,W,H;parent=parent||document.body;if(parent!=document.body){T=parent.scrollTop;L=parent.scrollLeft;W=parent.scrollWidth;H=parent.scrollHeight}else{var w=window;with(w.document){if(w.document.documentElement&&documentElement.scrollTop){T=documentElement.scrollTop;L=documentElement.scrollLeft}else{if(w.document.body){T=body.scrollTop;L=body.scrollLeft}}if(w.innerWidth){W=w.innerWidth;H=w.innerHeight}else{if(w.document.documentElement&&documentElement.clientWidth){W=documentElement.clientWidth;H=documentElement.clientHeight}else{W=body.offsetWidth;H=body.offsetHeight}}}}return{top:T,left:L,width:W,height:H}},getPageSize:function(f){f=f||document.body;var e,l;var g,d;if(f!=document.body){e=f.getWidth();l=f.getHeight();d=f.scrollWidth;g=f.scrollHeight}else{var h,b;if(window.innerHeight&&window.scrollMaxY){h=document.body.scrollWidth;b=window.innerHeight+window.scrollMaxY}else{if(document.body.scrollHeight>document.body.offsetHeight){h=document.body.scrollWidth;b=document.body.scrollHeight}else{h=document.body.offsetWidth;b=document.body.offsetHeight}}if(self.innerHeight){e=document.documentElement.clientWidth;l=self.innerHeight}else{if(document.documentElement&&document.documentElement.clientHeight){e=document.documentElement.clientWidth;l=document.documentElement.clientHeight}else{if(document.body){e=document.body.clientWidth;l=document.body.clientHeight}}}if(b<l){g=l}else{g=b}if(h<e){d=e}else{d=h}}return{pageWidth:d,pageHeight:g,windowWidth:e,windowHeight:l}},disableScreen:function(e,b,f,g,d){WindowUtilities.initLightbox(b,e,function(){this._disableScreen(e,b,f,g)}.bind(this),d||document.body)},_disableScreen:function(e,d,g,h){var f=$(d);var b=WindowUtilities.getPageSize(f.parentNode);if(h&&Prototype.Browser.IE){WindowUtilities._hideSelect();WindowUtilities._showSelect(h)}f.style.height=(b.pageHeight+"px");f.style.display="none";if(d=="overlay_modal"&&Window.hasEffectLib&&Windows.overlayShowEffectOptions){f.overlayOpacity=g;new Effect.Appear(f,Object.extend({from:0,to:g},Windows.overlayShowEffectOptions))}else{f.style.display="block"}},enableScreen:function(d){d=d||"overlay_modal";var b=$(d);if(b){if(d=="overlay_modal"&&Window.hasEffectLib&&Windows.overlayHideEffectOptions){new Effect.Fade(b,Object.extend({from:b.overlayOpacity,to:0},Windows.overlayHideEffectOptions))}else{b.style.display="none";b.parentNode.removeChild(b)}if(d!="__invisible__"){WindowUtilities._showSelect()}}},_hideSelect:function(b){if(Prototype.Browser.IE){b=b==null?"":"#"+b+" ";$$(b+"select").each(function(d){if(!WindowUtilities.isDefined(d.oldVisibility)){d.oldVisibility=d.style.visibility?d.style.visibility:"visible";d.style.visibility="hidden"}})}},_showSelect:function(b){if(Prototype.Browser.IE){b=b==null?"":"#"+b+" ";$$(b+"select").each(function(d){if(WindowUtilities.isDefined(d.oldVisibility)){try{d.style.visibility=d.oldVisibility}catch(f){d.style.visibility="visible"}d.oldVisibility=null}else{if(d.style.visibility){d.style.visibility="visible"}}})}},isDefined:function(b){return typeof(b)!="undefined"&&b!=null},initLightbox:function(g,e,b,d){if($(g)){Element.setStyle(g,{zIndex:Windows.maxZIndex+1});Windows.maxZIndex++;b()}else{var f=document.createElement("div");f.setAttribute("id",g);f.className="overlay_"+e;f.style.display="none";f.style.position="absolute";f.style.top="0";f.style.left="0";f.style.zIndex=Windows.maxZIndex+1;Windows.maxZIndex++;f.style.width="100%";d.insertBefore(f,d.firstChild);if(Prototype.Browser.WebKit&&g=="overlay_modal"){setTimeout(function(){b()},10)}else{b()}}},setCookie:function(d,b){document.cookie=b[0]+"="+escape(d)+((b[1])?"; expires="+b[1].toGMTString():"")+((b[2])?"; path="+b[2]:"")+((b[3])?"; domain="+b[3]:"")+((b[4])?"; secure":"")},getCookie:function(e){var d=document.cookie;var g=e+"=";var f=d.indexOf("; "+g);if(f==-1){f=d.indexOf(g);if(f!=0){return null}}else{f+=2}var b=document.cookie.indexOf(";",f);if(b==-1){b=d.length}return unescape(d.substring(f+g.length,b))},_computeSize:function(g,b,d,l,f,h){var o=document.body;var e=document.createElement("div");e.setAttribute("id",b);e.className=h+"_content";if(l){e.style.height=l+"px"}else{e.style.width=d+"px"}e.style.position="absolute";e.style.top="0";e.style.left="0";e.style.display="none";e.innerHTML=g;o.insertBefore(e,o.firstChild);var n;if(l){n=$(e).getDimensions().width+f}else{n=$(e).getDimensions().height+f}o.removeChild(e);return n}};var Builder={NODEMAP:{AREA:"map",CAPTION:"table",COL:"table",COLGROUP:"table",LEGEND:"fieldset",OPTGROUP:"select",OPTION:"select",PARAM:"object",TBODY:"table",TD:"table",TFOOT:"table",TH:"table",THEAD:"table",TR:"table"},node:function(b){b=b.toUpperCase();var l=this.NODEMAP[b]||"div";var d=document.createElement(l);try{d.innerHTML="<"+b+"></"+b+">"}catch(h){}var g=d.firstChild||null;if(g&&(g.tagName.toUpperCase()!=b)){g=g.getElementsByTagName(b)[0]}if(!g){g=document.createElement(b)}if(!g){return}if(arguments[1]){if(this._isStringOrNumber(arguments[1])||(arguments[1] instanceof Array)||arguments[1].tagName){this._children(g,arguments[1])}else{var f=this._attributes(arguments[1]);if(f.length){try{d.innerHTML="<"+b+" "+f+"></"+b+">"}catch(h){}g=d.firstChild||null;if(!g){g=document.createElement(b);for(attr in arguments[1]){g[attr=="class"?"className":attr]=arguments[1][attr]}}if(g.tagName.toUpperCase()!=b){g=d.getElementsByTagName(b)[0]}}}}if(arguments[2]){this._children(g,arguments[2])}return $(g)},_text:function(b){return document.createTextNode(b)},ATTR_MAP:{className:"class",htmlFor:"for"},_attributes:function(b){var d=[];for(attribute in b){d.push((attribute in this.ATTR_MAP?this.ATTR_MAP[attribute]:attribute)+'="'+b[attribute].toString().escapeHTML().gsub(/"/,""")+'"')}return d.join(" ")},_children:function(d,b){if(b.tagName){d.appendChild(b);return}if(typeof b=="object"){b.flatten().each(function(f){if(typeof f=="object"){d.appendChild(f)}else{if(Builder._isStringOrNumber(f)){d.appendChild(Builder._text(f))}}})}else{if(Builder._isStringOrNumber(b)){d.appendChild(Builder._text(b))}}},_isStringOrNumber:function(b){return(typeof b=="string"||typeof b=="number")},build:function(d){var b=this.node("div");$(b).update(d.strip());return b.down()},dump:function(d){if(typeof d!="object"&&typeof d!="function"){d=window}var b=("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);b.each(function(e){d[e]=function(){return Builder.node.apply(Builder,[e].concat($A(arguments)))}})}};String.prototype.parseColor=function(){var b="#";if(this.slice(0,4)=="rgb("){var e=this.slice(4,this.length-1).split(",");var d=0;do{b+=parseInt(e[d]).toColorPart()}while(++d<3)}else{if(this.slice(0,1)=="#"){if(this.length==4){for(var d=1;d<4;d++){b+=(this.charAt(d)+this.charAt(d)).toLowerCase()}}if(this.length==7){b=this.toLowerCase()}}}return(b.length==7?b:(arguments[0]||this))};Element.collectTextNodes=function(b){return $A($(b).childNodes).collect(function(d){return(d.nodeType==3?d.nodeValue:(d.hasChildNodes()?Element.collectTextNodes(d):""))}).flatten().join("")};Element.collectTextNodesIgnoreClass=function(b,d){return $A($(b).childNodes).collect(function(e){return(e.nodeType==3?e.nodeValue:((e.hasChildNodes()&&!Element.hasClassName(e,d))?Element.collectTextNodesIgnoreClass(e,d):""))}).flatten().join("")};Element.setContentZoom=function(b,d){b=$(b);b.setStyle({fontSize:(d/100)+"em"});if(Prototype.Browser.WebKit){window.scrollBy(0,0)}return b};Element.getInlineOpacity=function(b){return $(b).style.opacity||""};Element.forceRerendering=function(b){try{b=$(b);var f=document.createTextNode(" ");b.appendChild(f);b.removeChild(f)}catch(d){}};var Effect={_elementDoesNotExistError:{name:"ElementDoesNotExistError",message:"The specified DOM element does not exist, but is required for this effect to operate"},Transitions:{linear:Prototype.K,sinoidal:function(b){return(-Math.cos(b*Math.PI)/2)+0.5},reverse:function(b){return 1-b},flicker:function(b){var b=((-Math.cos(b*Math.PI)/4)+0.75)+Math.random()/4;return b>1?1:b},wobble:function(b){return(-Math.cos(b*Math.PI*(9*b))/2)+0.5},pulse:function(d,b){return(-Math.cos((d*((b||5)-0.5)*2)*Math.PI)/2)+0.5},spring:function(b){return 1-(Math.cos(b*4.5*Math.PI)*Math.exp(-b*6))},none:function(b){return 0},full:function(b){return 1}},DefaultOptions:{duration:1,fps:100,sync:false,from:0,to:1,delay:0,queue:"parallel"},tagifyText:function(b){var d="position:relative";if(Prototype.Browser.IE){d+=";zoom:1"}b=$(b);$A(b.childNodes).each(function(e){if(e.nodeType==3){e.nodeValue.toArray().each(function(f){b.insertBefore(new Element("span",{style:d}).update(f==" "?String.fromCharCode(160):f),e)});Element.remove(e)}})},multiple:function(d,e){var g;if(((typeof d=="object")||Object.isFunction(d))&&(d.length)){g=d}else{g=$(d).childNodes}var b=Object.extend({speed:0.1,delay:0},arguments[2]||{});var f=b.delay;$A(g).each(function(l,h){new e(l,Object.extend(b,{delay:h*b.speed+f}))})},PAIRS:{slide:["SlideDown","SlideUp"],blind:["BlindDown","BlindUp"],appear:["Appear","Fade"]},toggle:function(d,e){d=$(d);e=(e||"appear").toLowerCase();var b=Object.extend({queue:{position:"end",scope:(d.id||"global"),limit:1}},arguments[2]||{});Effect[d.visible()?Effect.PAIRS[e][1]:Effect.PAIRS[e][0]](d,b)}};Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;Effect.ScopedQueue=Class.create(Enumerable,{initialize:function(){this.effects=[];this.interval=null},_each:function(b){this.effects._each(b)},add:function(d){var e=new Date().getTime();var b=Object.isString(d.options.queue)?d.options.queue:d.options.queue.position;switch(b){case"front":this.effects.findAll(function(f){return f.state=="idle"}).each(function(f){f.startOn+=d.finishOn;f.finishOn+=d.finishOn});break;case"with-last":e=this.effects.pluck("startOn").max()||e;break;case"end":e=this.effects.pluck("finishOn").max()||e;break}d.startOn+=e;d.finishOn+=e;if(!d.options.queue.limit||(this.effects.length<d.options.queue.limit)){this.effects.push(d)}if(!this.interval){this.interval=setInterval(this.loop.bind(this),15)}},remove:function(b){this.effects=this.effects.reject(function(d){return d==b});if(this.effects.length==0){clearInterval(this.interval);this.interval=null}},loop:function(){var e=new Date().getTime();for(var d=0,b=this.effects.length;d<b;d++){this.effects[d]&&this.effects[d].loop(e)}}});Effect.Queues={instances:$H(),get:function(b){if(!Object.isString(b)){return b}return this.instances.get(b)||this.instances.set(b,new Effect.ScopedQueue())}};Effect.Queue=Effect.Queues.get("global");Effect.Base=Class.create({position:null,start:function(b){function d(f,e){return((f[e+"Internal"]?"this.options."+e+"Internal(this);":"")+(f[e]?"this.options."+e+"(this);":""))}if(b&&b.transition===false){b.transition=Effect.Transitions.linear}this.options=Object.extend(Object.extend({},Effect.DefaultOptions),b||{});this.currentFrame=0;this.state="idle";this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.fromToDelta=this.options.to-this.options.from;this.totalTime=this.finishOn-this.startOn;this.totalFrames=this.options.fps*this.options.duration;this.render=(function(){function e(g,f){if(g.options[f+"Internal"]){g.options[f+"Internal"](g)}if(g.options[f]){g.options[f](g)}}return function(f){if(this.state==="idle"){this.state="running";e(this,"beforeSetup");if(this.setup){this.setup()}e(this,"afterSetup")}if(this.state==="running"){f=(this.options.transition(f)*this.fromToDelta)+this.options.from;this.position=f;e(this,"beforeUpdate");if(this.update){this.update(f)}e(this,"afterUpdate")}}})();this.event("beforeStart");if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).add(this)}},loop:function(e){if(e>=this.startOn){if(e>=this.finishOn){this.render(1);this.cancel();this.event("beforeFinish");if(this.finish){this.finish()}this.event("afterFinish");return}var d=(e-this.startOn)/this.totalTime,b=(d*this.totalFrames).round();if(b>this.currentFrame){this.render(d);this.currentFrame=b}}},cancel:function(){if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).remove(this)}this.state="finished"},event:function(b){if(this.options[b+"Internal"]){this.options[b+"Internal"](this)}if(this.options[b]){this.options[b](this)}},inspect:function(){var b=$H();for(property in this){if(!Object.isFunction(this[property])){b.set(property,this[property])}}return"#<Effect:"+b.inspect()+",options:"+$H(this.options).inspect()+">"}});Effect.Parallel=Class.create(Effect.Base,{initialize:function(b){this.effects=b||[];this.start(arguments[1])},update:function(b){this.effects.invoke("render",b)},finish:function(b){this.effects.each(function(d){d.render(1);d.cancel();d.event("beforeFinish");if(d.finish){d.finish(b)}d.event("afterFinish")})}});Effect.Tween=Class.create(Effect.Base,{initialize:function(e,h,g){e=Object.isString(e)?$(e):e;var d=$A(arguments),f=d.last(),b=d.length==5?d[3]:null;this.method=Object.isFunction(f)?f.bind(e):Object.isFunction(e[f])?e[f].bind(e):function(l){e[f]=l};this.start(Object.extend({from:h,to:g},b||{}))},update:function(b){this.method(b)}});Effect.Event=Class.create(Effect.Base,{initialize:function(){this.start(Object.extend({duration:0},arguments[0]||{}))},update:Prototype.emptyFunction});Effect.Opacity=Class.create(Effect.Base,{initialize:function(d){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}var b=Object.extend({from:this.element.getOpacity()||0,to:1},arguments[1]||{});this.start(b)},update:function(b){this.element.setOpacity(b)}});Effect.Move=Class.create(Effect.Base,{initialize:function(d){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({x:0,y:0,mode:"relative"},arguments[1]||{});this.start(b)},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle("left")||"0");this.originalTop=parseFloat(this.element.getStyle("top")||"0");if(this.options.mode=="absolute"){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop}},update:function(b){this.element.setStyle({left:(this.options.x*b+this.originalLeft).round()+"px",top:(this.options.y*b+this.originalTop).round()+"px"})}});Effect.MoveBy=function(d,b,e){return new Effect.Move(d,Object.extend({x:e,y:b},arguments[3]||{}))};Effect.Scale=Class.create(Effect.Base,{initialize:function(d,e){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:e},arguments[2]||{});this.start(b)},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle("position");this.originalStyle={};["top","left","width","height","fontSize"].each(function(d){this.originalStyle[d]=this.element.style[d]}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var b=this.element.getStyle("font-size")||"100%";["em","px","%","pt"].each(function(d){if(b.indexOf(d)>0){this.fontSize=parseFloat(b);this.fontSizeType=d}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=="box"){this.dims=[this.element.offsetHeight,this.element.offsetWidth]}if(/^content/.test(this.options.scaleMode)){this.dims=[this.element.scrollHeight,this.element.scrollWidth]}if(!this.dims){this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]}},update:function(b){var d=(this.options.scaleFrom/100)+(this.factor*b);if(this.options.scaleContent&&this.fontSize){this.element.setStyle({fontSize:this.fontSize*d+this.fontSizeType})}this.setDimensions(this.dims[0]*d,this.dims[1]*d)},finish:function(b){if(this.restoreAfterFinish){this.element.setStyle(this.originalStyle)}},setDimensions:function(b,g){var h={};if(this.options.scaleX){h.width=g.round()+"px"}if(this.options.scaleY){h.height=b.round()+"px"}if(this.options.scaleFromCenter){var f=(b-this.dims[0])/2;var e=(g-this.dims[1])/2;if(this.elementPositioning=="absolute"){if(this.options.scaleY){h.top=this.originalTop-f+"px"}if(this.options.scaleX){h.left=this.originalLeft-e+"px"}}else{if(this.options.scaleY){h.top=-f+"px"}if(this.options.scaleX){h.left=-e+"px"}}}this.element.setStyle(h)}});Effect.Highlight=Class.create(Effect.Base,{initialize:function(d){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({startcolor:"#ffff99"},arguments[1]||{});this.start(b)},setup:function(){if(this.element.getStyle("display")=="none"){this.cancel();return}this.oldStyle={};if(!this.options.keepBackgroundImage){this.oldStyle.backgroundImage=this.element.getStyle("background-image");this.element.setStyle({backgroundImage:"none"})}if(!this.options.endcolor){this.options.endcolor=this.element.getStyle("background-color").parseColor("#ffffff")}if(!this.options.restorecolor){this.options.restorecolor=this.element.getStyle("background-color")}this._base=$R(0,2).map(function(b){return parseInt(this.options.startcolor.slice(b*2+1,b*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(b){return parseInt(this.options.endcolor.slice(b*2+1,b*2+3),16)-this._base[b]}.bind(this))},update:function(b){this.element.setStyle({backgroundColor:$R(0,2).inject("#",function(d,e,f){return d+((this._base[f]+(this._delta[f]*b)).round().toColorPart())}.bind(this))})},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}))}});Effect.ScrollTo=function(e){var d=arguments[1]||{},b=document.viewport.getScrollOffsets(),f=$(e).cumulativeOffset();if(d.offset){f[1]+=d.offset}return new Effect.Tween(null,b.top,f[1],d,function(g){scrollTo(b.left,g.round())})};Effect.Fade=function(e){e=$(e);var b=e.getInlineOpacity();var d=Object.extend({from:e.getOpacity()||1,to:0,afterFinishInternal:function(f){if(f.options.to!=0){return}f.element.hide().setStyle({opacity:b})}},arguments[1]||{});return new Effect.Opacity(e,d)};Effect.Appear=function(d){d=$(d);var b=Object.extend({from:(d.getStyle("display")=="none"?0:d.getOpacity()||0),to:1,afterFinishInternal:function(e){e.element.forceRerendering()},beforeSetup:function(e){e.element.setOpacity(e.options.from).show()}},arguments[1]||{});return new Effect.Opacity(d,b)};Effect.Puff=function(d){d=$(d);var b={opacity:d.getInlineOpacity(),position:d.getStyle("position"),top:d.style.top,left:d.style.left,width:d.style.width,height:d.style.height};return new Effect.Parallel([new Effect.Scale(d,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(d,{sync:true,to:0})],Object.extend({duration:1,beforeSetupInternal:function(e){Position.absolutize(e.effects[0].element)},afterFinishInternal:function(e){e.effects[0].element.hide().setStyle(b)}},arguments[1]||{}))};Effect.BlindUp=function(b){b=$(b);b.makeClipping();return new Effect.Scale(b,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(d){d.element.hide().undoClipping()}},arguments[1]||{}))};Effect.BlindDown=function(d){d=$(d);var b=d.getDimensions();return new Effect.Scale(d,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:b.height,originalWidth:b.width},restoreAfterFinish:true,afterSetup:function(e){e.element.makeClipping().setStyle({height:"0px"}).show()},afterFinishInternal:function(e){e.element.undoClipping()}},arguments[1]||{}))};Effect.SwitchOff=function(d){d=$(d);var b=d.getInlineOpacity();return new Effect.Appear(d,Object.extend({duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(e){new Effect.Scale(e.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(f){f.element.makePositioned().makeClipping()},afterFinishInternal:function(f){f.element.hide().undoClipping().undoPositioned().setStyle({opacity:b})}})}},arguments[1]||{}))};Effect.DropOut=function(d){d=$(d);var b={top:d.getStyle("top"),left:d.getStyle("left"),opacity:d.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(d,{x:0,y:100,sync:true}),new Effect.Opacity(d,{sync:true,to:0})],Object.extend({duration:0.5,beforeSetup:function(e){e.effects[0].element.makePositioned()},afterFinishInternal:function(e){e.effects[0].element.hide().undoPositioned().setStyle(b)}},arguments[1]||{}))};Effect.Shake=function(f){f=$(f);var d=Object.extend({distance:20,duration:0.5},arguments[1]||{});var g=parseFloat(d.distance);var e=parseFloat(d.duration)/10;var b={top:f.getStyle("top"),left:f.getStyle("left")};return new Effect.Move(f,{x:g,y:0,duration:e,afterFinishInternal:function(h){new Effect.Move(h.element,{x:-g*2,y:0,duration:e*2,afterFinishInternal:function(l){new Effect.Move(l.element,{x:g*2,y:0,duration:e*2,afterFinishInternal:function(n){new Effect.Move(n.element,{x:-g*2,y:0,duration:e*2,afterFinishInternal:function(o){new Effect.Move(o.element,{x:g*2,y:0,duration:e*2,afterFinishInternal:function(p){new Effect.Move(p.element,{x:-g,y:0,duration:e,afterFinishInternal:function(q){q.element.undoPositioned().setStyle(b)}})}})}})}})}})}})};Effect.SlideDown=function(e){e=$(e).cleanWhitespace();var b=e.down().getStyle("bottom");var d=e.getDimensions();return new Effect.Scale(e,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:d.height,originalWidth:d.width},restoreAfterFinish:true,afterSetup:function(f){f.element.makePositioned();f.element.down().makePositioned();if(window.opera){f.element.setStyle({top:""})}f.element.makeClipping().setStyle({height:"0px"}).show()},afterUpdateInternal:function(f){f.element.down().setStyle({bottom:(f.dims[0]-f.element.clientHeight)+"px"})},afterFinishInternal:function(f){f.element.undoClipping().undoPositioned();f.element.down().undoPositioned().setStyle({bottom:b})}},arguments[1]||{}))};Effect.SlideUp=function(e){e=$(e).cleanWhitespace();var b=e.down().getStyle("bottom");var d=e.getDimensions();return new Effect.Scale(e,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,scaleMode:{originalHeight:d.height,originalWidth:d.width},restoreAfterFinish:true,afterSetup:function(f){f.element.makePositioned();f.element.down().makePositioned();if(window.opera){f.element.setStyle({top:""})}f.element.makeClipping().show()},afterUpdateInternal:function(f){f.element.down().setStyle({bottom:(f.dims[0]-f.element.clientHeight)+"px"})},afterFinishInternal:function(f){f.element.hide().undoClipping().undoPositioned();f.element.down().undoPositioned().setStyle({bottom:b})}},arguments[1]||{}))};Effect.Squish=function(b){return new Effect.Scale(b,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(d){d.element.makeClipping()},afterFinishInternal:function(d){d.element.hide().undoClipping()}})};Effect.Grow=function(e){e=$(e);var d=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var b={top:e.style.top,left:e.style.left,height:e.style.height,width:e.style.width,opacity:e.getInlineOpacity()};var l=e.getDimensions();var n,h;var g,f;switch(d.direction){case"top-left":n=h=g=f=0;break;case"top-right":n=l.width;h=f=0;g=-l.width;break;case"bottom-left":n=g=0;h=l.height;f=-l.height;break;case"bottom-right":n=l.width;h=l.height;g=-l.width;f=-l.height;break;case"center":n=l.width/2;h=l.height/2;g=-l.width/2;f=-l.height/2;break}return new Effect.Move(e,{x:n,y:h,duration:0.01,beforeSetup:function(o){o.element.hide().makeClipping().makePositioned()},afterFinishInternal:function(o){new Effect.Parallel([new Effect.Opacity(o.element,{sync:true,to:1,from:0,transition:d.opacityTransition}),new Effect.Move(o.element,{x:g,y:f,sync:true,transition:d.moveTransition}),new Effect.Scale(o.element,100,{scaleMode:{originalHeight:l.height,originalWidth:l.width},sync:true,scaleFrom:window.opera?1:0,transition:d.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(p){p.effects[0].element.setStyle({height:"0px"}).show()},afterFinishInternal:function(p){p.effects[0].element.undoClipping().undoPositioned().setStyle(b)}},d))}})};Effect.Shrink=function(e){e=$(e);var d=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var b={top:e.style.top,left:e.style.left,height:e.style.height,width:e.style.width,opacity:e.getInlineOpacity()};var h=e.getDimensions();var g,f;switch(d.direction){case"top-left":g=f=0;break;case"top-right":g=h.width;f=0;break;case"bottom-left":g=0;f=h.height;break;case"bottom-right":g=h.width;f=h.height;break;case"center":g=h.width/2;f=h.height/2;break}return new Effect.Parallel([new Effect.Opacity(e,{sync:true,to:0,from:1,transition:d.opacityTransition}),new Effect.Scale(e,window.opera?1:0,{sync:true,transition:d.scaleTransition,restoreAfterFinish:true}),new Effect.Move(e,{x:g,y:f,sync:true,transition:d.moveTransition})],Object.extend({beforeStartInternal:function(l){l.effects[0].element.makePositioned().makeClipping()},afterFinishInternal:function(l){l.effects[0].element.hide().undoClipping().undoPositioned().setStyle(b)}},d))};Effect.Pulsate=function(e){e=$(e);var d=arguments[1]||{},b=e.getInlineOpacity(),g=d.transition||Effect.Transitions.linear,f=function(h){return 1-g((-Math.cos((h*(d.pulses||5)*2)*Math.PI)/2)+0.5)};return new Effect.Opacity(e,Object.extend(Object.extend({duration:2,from:0,afterFinishInternal:function(h){h.element.setStyle({opacity:b})}},d),{transition:f}))};Effect.Fold=function(d){d=$(d);var b={top:d.style.top,left:d.style.left,width:d.style.width,height:d.style.height};d.makeClipping();return new Effect.Scale(d,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(e){new Effect.Scale(d,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(f){f.element.hide().undoClipping().setStyle(b)}})}},arguments[1]||{}))};Effect.Morph=Class.create(Effect.Base,{initialize:function(e){this.element=$(e);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({style:{}},arguments[1]||{});if(!Object.isString(b.style)){this.style=$H(b.style)}else{if(b.style.include(":")){this.style=b.style.parseStyle()}else{this.element.addClassName(b.style);this.style=$H(this.element.getStyles());this.element.removeClassName(b.style);var d=this.element.getStyles();this.style=this.style.reject(function(f){return f.value==d[f.key]});b.afterFinishInternal=function(f){f.element.addClassName(f.options.style);f.transforms.each(function(g){f.element.style[g.style]=""})}}}this.start(b)},setup:function(){function b(d){if(!d||["rgba(0, 0, 0, 0)","transparent"].include(d)){d="#ffffff"}d=d.parseColor();return $R(0,2).map(function(e){return parseInt(d.slice(e*2+1,e*2+3),16)})}this.transforms=this.style.map(function(l){var h=l[0],g=l[1],f=null;if(g.parseColor("#zzzzzz")!="#zzzzzz"){g=g.parseColor();f="color"}else{if(h=="opacity"){g=parseFloat(g);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}}else{if(Element.CSS_LENGTH.test(g)){var e=g.match(/^([\+\-]?[0-9\.]+)(.*)$/);g=parseFloat(e[1]);f=(e.length==3)?e[2]:null}}}var d=this.element.getStyle(h);return{style:h.camelize(),originalValue:f=="color"?b(d):parseFloat(d||0),targetValue:f=="color"?b(g):g,unit:f}}.bind(this)).reject(function(d){return((d.originalValue==d.targetValue)||(d.unit!="color"&&(isNaN(d.originalValue)||isNaN(d.targetValue))))})},update:function(b){var f={},d,e=this.transforms.length;while(e--){f[(d=this.transforms[e]).style]=d.unit=="color"?"#"+(Math.round(d.originalValue[0]+(d.targetValue[0]-d.originalValue[0])*b)).toColorPart()+(Math.round(d.originalValue[1]+(d.targetValue[1]-d.originalValue[1])*b)).toColorPart()+(Math.round(d.originalValue[2]+(d.targetValue[2]-d.originalValue[2])*b)).toColorPart():(d.originalValue+(d.targetValue-d.originalValue)*b).toFixed(3)+(d.unit===null?"":d.unit)}this.element.setStyle(f,true)}});Effect.Transform=Class.create({initialize:function(b){this.tracks=[];this.options=arguments[1]||{};this.addTracks(b)},addTracks:function(b){b.each(function(d){d=$H(d);var e=d.values().first();this.tracks.push($H({ids:d.keys().first(),effect:Effect.Morph,options:{style:e}}))}.bind(this));return this},play:function(){return new Effect.Parallel(this.tracks.map(function(b){var f=b.get("ids"),e=b.get("effect"),d=b.get("options");var g=[$(f)||$$(f)].flatten();return g.map(function(h){return new e(h,Object.extend({sync:true},d))})}).flatten(),this.options)}});Element.CSS_PROPERTIES=$w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderSpacing borderTopColor borderTopStyle borderTopWidth bottom clip color fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop markerOffset maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex");Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement=document.createElement("div");String.prototype.parseStyle=function(){var d,b=$H();if(Prototype.Browser.WebKit){d=new Element("div",{style:this}).style}else{String.__parseStyleElement.innerHTML='<div style="'+this+'"></div>';d=String.__parseStyleElement.childNodes[0].style}Element.CSS_PROPERTIES.each(function(e){if(d[e]){b.set(e,d[e])}});if(Prototype.Browser.IE&&this.include("opacity")){b.set("opacity",this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1])}return b};if(document.defaultView&&document.defaultView.getComputedStyle){Element.getStyles=function(d){var b=document.defaultView.getComputedStyle($(d),null);return Element.CSS_PROPERTIES.inject({},function(e,f){e[f]=b[f];return e})}}else{Element.getStyles=function(d){d=$(d);var b=d.currentStyle,e;e=Element.CSS_PROPERTIES.inject({},function(f,g){f[g]=b[g];return f});if(!e.opacity){e.opacity=d.getOpacity()}return e}}Effect.Methods={morph:function(b,d){b=$(b);new Effect.Morph(b,Object.extend({style:d},arguments[2]||{}));return b},visualEffect:function(e,g,d){e=$(e);var f=g.dasherize().camelize(),b=f.charAt(0).toUpperCase()+f.substring(1);new Effect[b](e,d);return e},highlight:function(d,b){d=$(d);new Effect.Highlight(d,b);return d}};$w("fade appear grow shrink fold blindUp blindDown slideUp slideDown pulsate shake puff squish switchOff dropOut").each(function(b){Effect.Methods[b]=function(e,d){e=$(e);Effect[b.charAt(0).toUpperCase()+b.substring(1)](e,d);return e}});$w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function(b){Effect.Methods[b]=Element[b]});Element.addMethods(Effect.Methods);function validateCreditCard(e){var d="0123456789";var b="";for(i=0;i<e.length;i++){x=e.charAt(i);if(d.indexOf(x,0)!=-1){b+=x}}j=b.length/2;k=Math.floor(j);m=Math.ceil(j)-k;c=0;for(i=0;i<k;i++){a=b.charAt(i*2+m)*2;c+=a>9?Math.floor(a/10+a%10):a}for(i=0;i<k+m;i++){c+=b.charAt(i*2+1-m)*1}return(c%10==0)}var Validator=Class.create();Validator.prototype={initialize:function(e,d,f,b){if(typeof f=="function"){this.options=$H(b);this._test=f}else{this.options=$H(f);this._test=function(){return true}}this.error=d||"Validation failed.";this.className=e},test:function(b,d){return(this._test(b,d)&&this.options.all(function(e){return Validator.methods[e.key]?Validator.methods[e.key](b,d,e.value):true}))}};Validator.methods={pattern:function(b,e,d){return Validation.get("IsEmpty").test(b)||d.test(b)},minLength:function(b,e,d){return b.length>=d},maxLength:function(b,e,d){return b.length<=d},min:function(b,e,d){return b>=parseFloat(d)},max:function(b,e,d){return b<=parseFloat(d)},notOneOf:function(b,e,d){return $A(d).all(function(f){return b!=f})},oneOf:function(b,e,d){return $A(d).any(function(f){return b==f})},is:function(b,e,d){return b==d},isNot:function(b,e,d){return b!=d},equalToField:function(b,e,d){return b==$F(d)},notEqualToField:function(b,e,d){return b!=$F(d)},include:function(b,e,d){return $A(d).all(function(f){return Validation.get(f).test(b,e)})}};var Validation=Class.create();Validation.defaultOptions={onSubmit:true,stopOnFirst:false,immediate:false,focusOnError:true,useTitles:false,addClassNameToContainer:false,containerClassName:".input-box",onFormValidate:function(b,d){},onElementValidate:function(b,d){}};Validation.prototype={initialize:function(d,b){this.form=$(d);if(!this.form){return}this.options=Object.extend({onSubmit:Validation.defaultOptions.onSubmit,stopOnFirst:Validation.defaultOptions.stopOnFirst,immediate:Validation.defaultOptions.immediate,focusOnError:Validation.defaultOptions.focusOnError,useTitles:Validation.defaultOptions.useTitles,onFormValidate:Validation.defaultOptions.onFormValidate,onElementValidate:Validation.defaultOptions.onElementValidate},b||{});if(this.options.onSubmit){Event.observe(this.form,"submit",this.onSubmit.bind(this),false)}if(this.options.immediate){Form.getElements(this.form).each(function(e){if(e.tagName.toLowerCase()=="select"){Event.observe(e,"blur",this.onChange.bindAsEventListener(this))}if(e.type.toLowerCase()=="radio"||e.type.toLowerCase()=="checkbox"){Event.observe(e,"click",this.onChange.bindAsEventListener(this))}else{Event.observe(e,"change",this.onChange.bindAsEventListener(this))}},this)}},onChange:function(b){Validation.isOnChange=true;Validation.validate(Event.element(b),{useTitle:this.options.useTitles,onElementValidate:this.options.onElementValidate});Validation.isOnChange=false},onSubmit:function(b){if(!this.validate()){Event.stop(b)}},validate:function(){var b=false;var d=this.options.useTitles;var g=this.options.onElementValidate;try{if(this.options.stopOnFirst){b=Form.getElements(this.form).all(function(e){if(e.hasClassName("local-validation")&&!this.isElementInForm(e,this.form)){return true}return Validation.validate(e,{useTitle:d,onElementValidate:g})},this)}else{b=Form.getElements(this.form).collect(function(e){if(e.hasClassName("local-validation")&&!this.isElementInForm(e,this.form)){return true}if(e.hasClassName("validation-disabled")){return true}return Validation.validate(e,{useTitle:d,onElementValidate:g})},this).all()}}catch(f){}if(!b&&this.options.focusOnError){try{Form.getElements(this.form).findAll(function(e){return $(e).hasClassName("validation-failed")}).first().focus()}catch(f){}}this.options.onFormValidate(b,this.form);return b},reset:function(){Form.getElements(this.form).each(Validation.reset)},isElementInForm:function(e,d){var b=e.up("form");if(b==d){return true}return false}};Object.extend(Validation,{validate:function(e,b){b=Object.extend({useTitle:false,onElementValidate:function(f,g){}},b||{});e=$(e);var d=$w(e.className);return result=d.all(function(f){var g=Validation.test(f,e,b.useTitle);b.onElementValidate(g,e);return g})},insertAdvice:function(f,d){var b=$(f).up(".field-row");if(b){Element.insert(b,{after:d})}else{if(f.up("td.value")){f.up("td.value").insert({bottom:d})}else{if(f.advaiceContainer&&$(f.advaiceContainer)){$(f.advaiceContainer).update(d)}else{switch(f.type.toLowerCase()){case"checkbox":case"radio":var e=f.parentNode;if(e){Element.insert(e,{bottom:d})}else{Element.insert(f,{after:d})}break;default:Element.insert(f,{after:d})}}}}},showAdvice:function(e,d,b){if(!e.advices){e.advices=new Hash()}else{e.advices.each(function(f){if(!d||f.value.id!=d.id){this.hideAdvice(e,f.value)}}.bind(this))}e.advices.set(b,d);if(typeof Effect=="undefined"){d.style.display="block"}else{if(!d._adviceAbsolutize){new Effect.Appear(d,{duration:1})}else{Position.absolutize(d);d.show();d.setStyle({top:d._adviceTop,left:d._adviceLeft,width:d._adviceWidth,"z-index":1000});d.addClassName("advice-absolute")}}},hideAdvice:function(d,b){if(b!=null){new Effect.Fade(b,{duration:1,afterFinishInternal:function(){b.hide()}})}},updateCallback:function(elm,status){if(typeof elm.callbackFunction!="undefined"){eval(elm.callbackFunction+"('"+elm.id+"','"+status+"')")}},ajaxError:function(g,f){var e="validate-ajax";var d=Validation.getAdvice(e,g);if(d==null){d=this.createAdvice(e,g,false,f)}this.showAdvice(g,d,"validate-ajax");this.updateCallback(g,"failed");g.addClassName("validation-failed");g.addClassName("validate-ajax");if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var b=g.up(Validation.defaultOptions.containerClassName);if(b&&this.allowContainerClassName(g)){b.removeClassName("validation-passed");b.addClassName("validation-error")}}},allowContainerClassName:function(b){if(b.type=="radio"||b.type=="checkbox"){return b.hasClassName("change-container-classname")}return true},test:function(g,o,l){var d=Validation.get(g);var n="__advice"+g.camelize();try{if(Validation.isVisible(o)&&!d.test($F(o),o)){var f=Validation.getAdvice(g,o);if(f==null){f=this.createAdvice(g,o,l)}this.showAdvice(o,f,g);this.updateCallback(o,"failed");o[n]=1;if(!o.advaiceContainer){o.removeClassName("validation-passed");o.addClassName("validation-failed")}if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var b=o.up(Validation.defaultOptions.containerClassName);if(b&&this.allowContainerClassName(o)){b.removeClassName("validation-passed");b.addClassName("validation-error")}}return false}else{var f=Validation.getAdvice(g,o);this.hideAdvice(o,f);this.updateCallback(o,"passed");o[n]="";o.removeClassName("validation-failed");o.addClassName("validation-passed");if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var b=o.up(Validation.defaultOptions.containerClassName);if(b&&!b.down(".validation-failed")&&this.allowContainerClassName(o)){if(!Validation.get("IsEmpty").test(o.value)||!this.isVisible(o)){b.addClassName("validation-passed")}else{b.removeClassName("validation-passed")}b.removeClassName("validation-error")}}return true}}catch(h){throw (h)}},isVisible:function(b){while(b.tagName!="BODY"){if(!$(b).visible()){return false}b=b.parentNode}return true},getAdvice:function(b,d){return $("advice-"+b+"-"+Validation.getElmID(d))||$("advice-"+Validation.getElmID(d))},createAdvice:function(e,n,l,d){var b=Validation.get(e);var h=l?((n&&n.title)?n.title:b.error):b.error;if(d){h=d}if(jQuery.mage.__){h=jQuery.mage.__(h)}advice='<div class="validation-advice" id="advice-'+e+"-"+Validation.getElmID(n)+'" style="display:none">'+h+"</div>";Validation.insertAdvice(n,advice);advice=Validation.getAdvice(e,n);if($(n).hasClassName("absolute-advice")){var g=$(n).getDimensions();var f=Position.cumulativeOffset(n);advice._adviceTop=(f[1]+g.height)+"px";advice._adviceLeft=(f[0])+"px";advice._adviceWidth=(g.width)+"px";advice._adviceAbsolutize=true}return advice},getElmID:function(b){return b.id?b.id:b.name},reset:function(d){d=$(d);var b=$w(d.className);b.each(function(g){var h="__advice"+g.camelize();if(d[h]){var f=Validation.getAdvice(g,d);if(f){f.hide()}d[h]=""}d.removeClassName("validation-failed");d.removeClassName("validation-passed");if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var e=d.up(Validation.defaultOptions.containerClassName);if(e){e.removeClassName("validation-passed");e.removeClassName("validation-error")}}})},add:function(f,e,g,d){var b={};b[f]=new Validator(f,e,g,d);Object.extend(Validation.methods,b)},addAllThese:function(b){var d={};$A(b).each(function(e){d[e[0]]=new Validator(e[0],e[1],e[2],(e.length>3?e[3]:{}))});Object.extend(Validation.methods,d)},get:function(b){return Validation.methods[b]?Validation.methods[b]:Validation.methods._LikeNoIDIEverSaw_},methods:{_LikeNoIDIEverSaw_:new Validator("_LikeNoIDIEverSaw_","",{})}});Validation.add("IsEmpty","",function(b){return(b==""||(b==null)||(b.length==0)||/^\s+$/.test(b))});Validation.addAllThese([["validate-no-html-tags","HTML tags are not allowed",function(b){return !/<(\/)?\w+/.test(b)}],["validate-select","Please select an option.",function(b){return((b!="none")&&(b!=null)&&(b.length!=0))}],["required-entry","This is a required field.",function(b){return !Validation.get("IsEmpty").test(b)}],["validate-number","Please enter a valid number in this field.",function(b){return Validation.get("IsEmpty").test(b)||(!isNaN(parseNumber(b))&&/^\s*-?\d*(\.\d*)?\s*$/.test(b))}],["validate-number-range","The value is not within the specified range.",function(e,g){if(Validation.get("IsEmpty").test(e)){return true}var f=parseNumber(e);if(isNaN(f)){return false}var d=/^number-range-(-?[\d.,]+)?-(-?[\d.,]+)?$/,b=true;$w(g.className).each(function(l){var h=d.exec(l);if(h){b=b&&(h[1]==null||h[1]==""||f>=parseNumber(h[1]))&&(h[2]==null||h[2]==""||f<=parseNumber(h[2]))}});return b}],["validate-digits","Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.",function(b){return Validation.get("IsEmpty").test(b)||!/[^\d]/.test(b)}],["validate-digits-range","The value is not within the specified range.",function(e,g){if(Validation.get("IsEmpty").test(e)){return true}var f=parseNumber(e);if(isNaN(f)){return false}var d=/^digits-range-(-?\d+)?-(-?\d+)?$/,b=true;$w(g.className).each(function(l){var h=d.exec(l);if(h){b=b&&(h[1]==null||h[1]==""||f>=parseNumber(h[1]))&&(h[2]==null||h[2]==""||f<=parseNumber(h[2]))}});return b}],["validate-range","The value is not within the specified range.",function(f,l){var g,h;if(Validation.get("IsEmpty").test(f)){return true}else{if(Validation.get("validate-digits").test(f)){g=h=parseNumber(f)}else{var e=/^(-?\d+)?-(-?\d+)?$/.exec(f);if(e){g=parseNumber(e[1]);h=parseNumber(e[2]);if(g>h){return false}}else{return false}}}var d=/^range-(-?\d+)?-(-?\d+)?$/,b=true;$w(l.className).each(function(n){var q=d.exec(n);if(q){var p=parseNumber(q[1]);var o=parseNumber(q[2]);b=b&&(isNaN(p)||g>=p)&&(isNaN(o)||h<=o)}});return b}],["validate-alpha","Please use letters only (a-z or A-Z) in this field.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-zA-Z]+$/.test(b)}],["validate-code","Please use only letters (a-z), numbers (0-9) or underscore (_) in this field, and the first character should be a letter.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-z]+[a-z0-9_]+$/.test(b)}],["validate-alphanum","Please use only letters (a-z or A-Z) or numbers (0-9) in this field. No spaces or other characters are allowed.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-zA-Z0-9]+$/.test(b)}],["validate-alphanum-with-spaces","Please use only letters (a-z or A-Z), numbers (0-9) or spaces only in this field.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-zA-Z0-9 ]+$/.test(b)}],["validate-street",'Please use only letters (a-z or A-Z), numbers (0-9), spaces and "#" in this field.',function(b){return Validation.get("IsEmpty").test(b)||/^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(b)}],["validate-phoneStrict","Please enter a valid phone number (Ex: 123-456-7890).",function(b){return Validation.get("IsEmpty").test(b)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(b)}],["validate-phoneLax","Please enter a valid phone number (Ex: 123-456-7890).",function(b){return Validation.get("IsEmpty").test(b)||/^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(b)}],["validate-fax","Please enter a valid fax number (Ex: 123-456-7890).",function(b){return Validation.get("IsEmpty").test(b)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(b)}],["validate-date","Please enter a valid date.",function(b){var d=new Date(b);return Validation.get("IsEmpty").test(b)||!isNaN(d)}],["validate-date-range","Make sure the To Date is later than or the same as the From Date.",function(e,h){var d=/\bdate-range-(\w+)-(\w+)\b/.exec(h.className);if(!d||d[2]=="to"||Validation.get("IsEmpty").test(e)){return true}var f=new Date().getFullYear()+"";var b=function(l){l=l.split(/[.\/]/);if(l[2]&&l[2].length<4){l[2]=f.substr(0,l[2].length)+l[2]}return new Date(l.join("/")).getTime()};var g=Element.select(h.form,".validate-date-range.date-range-"+d[1]+"-to");return !g.length||Validation.get("IsEmpty").test(g[0].value)||b(e)<=b(g[0].value)}],["validate-email","Please enter a valid email address (Ex: johndoe@domain.com).",function(b){return Validation.get("IsEmpty").test(b)||/^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i.test(b)}],["validate-emailSender","Please use only visible characters and spaces.",function(b){return Validation.get("IsEmpty").test(b)||/^[\S ]+$/.test(b)}],["validate-password","Please enter 6 or more characters. Leading or trailing spaces will be ignored.",function(b){var d=b.strip();return !(d.length>0&&d.length<6)}],["validate-admin-password","Please enter 7 or more characters, using both numeric and alphabetic.",function(b){var d=b.strip();if(0==d.length){return true}if(!(/[a-z]/i.test(b))||!(/[0-9]/.test(b))){return false}return !(d.length<7)}],["validate-cpassword","Please make sure your passwords match.",function(b){var d=$("confirmation")?$("confirmation"):$$(".validate-cpassword")[0];var g=false;if($("password")){g=$("password")}var h=$$(".validate-password");for(var e=0;e<h.size();e++){var f=h[e];if(f.up("form").id==d.up("form").id){g=f}}if($$(".validate-admin-password").size()){g=$$(".validate-admin-password")[0]}return(g.value==d.value)}],["validate-both-passwords","Please make sure your passwords match.",function(e,d){var b=$(d.form[d.name=="password"?"confirmation":"password"]),f=d.value==b.value;if(f&&b.hasClassName("validation-failed")){Validation.test(this.className,b)}return b.value==""||f}],["validate-url","Please enter a valid URL. Protocol is required (http://, https:// or ftp://)",function(b){b=(b||"").replace(/^\s+/,"").replace(/\s+$/,"");return Validation.get("IsEmpty").test(b)||/^(http|https|ftp):\/\/(([A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))(\.[A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))*)(:(\d+))?(\/[A-Z0-9~](([A-Z0-9_~-]|\.)*[A-Z0-9~]|))*\/?(.*)?$/i.test(b)}],["validate-clean-url",'Please enter a valid URL (Ex: "http://www.example.com" or "www.example.com").',function(b){return Validation.get("IsEmpty").test(b)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(b)||/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(b)}],["validate-identifier",'Please enter a valid URL Key (Ex: "example-page", "example-page.html" or "anotherlevel/example-page").',function(b){return Validation.get("IsEmpty").test(b)||/^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/.test(b)}],["validate-xml-identifier","Please enter a valid XML-identifier (Ex: something_1, block5, id-4).",function(b){return Validation.get("IsEmpty").test(b)||/^[A-Z][A-Z0-9_\/-]*$/i.test(b)}],["validate-ssn","Please enter a valid social security number (Ex: 123-45-6789).",function(b){return Validation.get("IsEmpty").test(b)||/^\d{3}-?\d{2}-?\d{4}$/.test(b)}],["validate-zip-us","Please enter a valid zip code (Ex: 90602 or 90602-1234).",function(b){return Validation.get("IsEmpty").test(b)||/(^\d{5}$)|(^\d{5}-\d{4}$)/.test(b)}],["validate-zip-international","Please enter a valid zip code.",function(b){return true}],["validate-date-au",'Please use this date format: dd/mm/yyyy (Ex: "17/03/2006" for the 17th of March, 2006).',function(b){if(Validation.get("IsEmpty").test(b)){return true}var e=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!e.test(b)){return false}var f=new Date(b.replace(e,"$2/$1/$3"));return(parseInt(RegExp.$2,10)==(1+f.getMonth()))&&(parseInt(RegExp.$1,10)==f.getDate())&&(parseInt(RegExp.$3,10)==f.getFullYear())}],["validate-currency-dollar","Please enter a valid $ amount (Ex: $100.00).",function(b){return Validation.get("IsEmpty").test(b)||/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(b)}],["validate-one-required","Please select one of the options above.",function(b,f){var e=f.parentNode;var d=e.getElementsByTagName("INPUT");return $A(d).any(function(g){return $F(g)})}],["validate-one-required-by-name","Please select one of the options.",function(d,g){var b=$$('input[name="'+g.name.replace(/([\\"])/g,"\\$1")+'"]');var e=1;for(var f=0;f<b.length;f++){if((b[f].type=="checkbox"||b[f].type=="radio")&&b[f].checked==true){e=0}if(Validation.isOnChange&&(b[f].type=="checkbox"||b[f].type=="radio")){Validation.reset(b[f])}}if(e==0){return true}else{return false}}],["validate-not-negative-number","Please enter a number 0 or greater in this field.",function(b){if(Validation.get("IsEmpty").test(b)){return true}b=parseNumber(b);return !isNaN(b)&&b>=0}],["validate-zero-or-greater","Please enter a number 0 or greater in this field.",function(b){return Validation.get("validate-not-negative-number").test(b)}],["validate-greater-than-zero","Please enter a number greater than 0 in this field.",function(b){if(Validation.get("IsEmpty").test(b)){return true}b=parseNumber(b);return !isNaN(b)&&b>0}],["validate-state","Please select State/Province.",function(b){return(b!=0||b=="")}],["validate-new-password","Please enter 6 or more characters. Leading or trailing spaces will be ignored.",function(b){if(!Validation.get("validate-password").test(b)){return false}if(Validation.get("IsEmpty").test(b)&&b!=""){return false}return true}],["validate-cc-number","Please enter a valid credit card number.",function(b,e){var d=$(e.id.substr(0,e.id.indexOf("_cc_number"))+"_cc_type");if(d&&typeof Validation.creditCartTypes.get(d.value)!="undefined"&&Validation.creditCartTypes.get(d.value)[2]==false){if(!Validation.get("IsEmpty").test(b)&&Validation.get("validate-digits").test(b)){return true}else{return false}}return validateCreditCard(b)}],["validate-cc-type","Credit card number does not match credit card type.",function(d,g){g.value=removeDelimiters(g.value);d=removeDelimiters(d);var f=$(g.id.substr(0,g.id.indexOf("_cc_number"))+"_cc_type");if(!f){return true}var e=f.value;if(typeof Validation.creditCartTypes.get(e)=="undefined"){return false}if(Validation.creditCartTypes.get(e)[0]==false){return true}var b="";Validation.creditCartTypes.each(function(h){if(h.value[0]&&d.match(h.value[0])){b=h.key;throw $break}});if(b!=e){return false}if(f.hasClassName("validation-failed")&&Validation.isOnChange){Validation.validate(f)}return true}],["validate-cc-type-select","Card type does not match credit card number.",function(d,e){var b=$(e.id.substr(0,e.id.indexOf("_cc_type"))+"_cc_number");if(Validation.isOnChange&&Validation.get("IsEmpty").test(b.value)){return true}if(Validation.get("validate-cc-type").test(b.value,b)){Validation.validate(b)}return Validation.get("validate-cc-type").test(b.value,b)}],["validate-cc-exp","Incorrect credit card expiration date.",function(b,l){var h=b;var g=$(l.id.substr(0,l.id.indexOf("_expiration"))+"_expiration_yr").value;var f=new Date();var e=f.getMonth()+1;var d=f.getFullYear();if(h<e&&g==d){return false}return true}],["validate-cc-cvn","Please enter a valid credit card verification number.",function(b,g){var f=$(g.id.substr(0,g.id.indexOf("_cc_cid"))+"_cc_type");if(!f){return true}var d=f.value;if(typeof Validation.creditCartTypes.get(d)=="undefined"){return false}var e=Validation.creditCartTypes.get(d)[1];if(b.match(e)){return true}return false}],["validate-ajax","",function(b,d){return true}],["validate-data","Please use only letters (a-z or A-Z), numbers (0-9) or underscore (_) in this field, and the first character should be a letter.",function(b){if(b!=""&&b){return/^[A-Za-z]+[A-Za-z0-9_]+$/.test(b)}return true}],["validate-css-length","Please input a valid CSS-length (Ex: 100px, 77pt, 20em, .5ex or 50%).",function(b){if(b!=""&&b){return/^[0-9\.]+(px|pt|em|ex|%)?$/.test(b)&&(!(/\..*\./.test(b)))&&!(/\.$/.test(b))}return true}],["validate-length","Text length does not meet the specified text range.",function(d,g){var e=new RegExp(/^maximum-length-[0-9]+$/);var f=new RegExp(/^minimum-length-[0-9]+$/);var b=true;$w(g.className).each(function(l,h){if(l.match(e)&&b){var n=l.split("-")[2];b=(d.length<=n)}if(l.match(f)&&b&&!Validation.get("IsEmpty").test(d)){var n=l.split("-")[2];b=(d.length>=n)}});return b}],["validate-percents","Please enter a number lower than 100.",{max:100}],["required-file","Please select a file.",function(d,e){var b=!Validation.get("IsEmpty").test(d);if(b===false){ovId=e.id+"_value";if($(ovId)){b=!Validation.get("IsEmpty").test($(ovId).value)}}return b}],["validate-cc-ukss","Please enter issue number or start date for switch/solo card type.",function(o,g){var b;if(g.id.match(/(.)+_cc_issue$/)){b=g.id.indexOf("_cc_issue")}else{if(g.id.match(/(.)+_start_month$/)){b=g.id.indexOf("_start_month")}else{b=g.id.indexOf("_start_year")}}var f=g.id.substr(0,b);var d=$(f+"_cc_type");if(!d){return true}var n=d.value;if(["SS","SM","SO"].indexOf(n)==-1){return true}$(f+"_cc_issue").advaiceContainer=$(f+"_start_month").advaiceContainer=$(f+"_start_year").advaiceContainer=$(f+"_cc_type_ss_div").down(".adv-container");var h=$(f+"_cc_issue").value;var l=$(f+"_start_month").value;var p=$(f+"_start_year").value;var e=(l&&p)?true:false;if(!e&&!h){return false}return true}]]);function removeDelimiters(b){b=b.replace(/\s/g,"");b=b.replace(/\-/g,"");return b}function parseNumber(b){if(typeof b!="string"){return parseFloat(b)}var e=b.indexOf(".");var d=b.indexOf(",");if(e!=-1&&d!=-1){if(d>e){b=b.replace(".","").replace(",",".")}else{b=b.replace(",","")}}else{if(d!=-1){b=b.replace(",",".")}}return parseFloat(b)}Validation.creditCartTypes=$H({SO:[new RegExp("^(6334[5-9]([0-9]{11}|[0-9]{13,14}))|(6767([0-9]{12}|[0-9]{14,15}))$"),new RegExp("^([0-9]{3}|[0-9]{4})?$"),true],SM:[new RegExp("(^(5[0678])[0-9]{11,18}$)|(^(6[^05])[0-9]{11,18}$)|(^(601)[^1][0-9]{9,16}$)|(^(6011)[0-9]{9,11}$)|(^(6011)[0-9]{13,16}$)|(^(65)[0-9]{11,13}$)|(^(65)[0-9]{15,18}$)|(^(49030)[2-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49033)[5-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49110)[1-2]([0-9]{10}$|[0-9]{12,13}$))|(^(49117)[4-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49118)[0-2]([0-9]{10}$|[0-9]{12,13}$))|(^(4936)([0-9]{12}$|[0-9]{14,15}$))"),new RegExp("^([0-9]{3}|[0-9]{4})?$"),true],VI:[new RegExp("^4[0-9]{12}([0-9]{3})?$"),new RegExp("^[0-9]{3}$"),true],MC:[new RegExp("^5[1-5][0-9]{14}$"),new RegExp("^[0-9]{3}$"),true],AE:[new RegExp("^3[47][0-9]{13}$"),new RegExp("^[0-9]{4}$"),true],DI:[new RegExp("^6(011|4[4-9][0-9]|5[0-9]{2})[0-9]{12}$"),new RegExp("^[0-9]{3}$"),true],JCB:[new RegExp("^(3[0-9]{15}|(2131|1800)[0-9]{11})$"),new RegExp("^[0-9]{3,4}$"),true],OT:[false,new RegExp("^([0-9]{3}|[0-9]{4})?$"),false]});function popWin(d,e,b){var e=window.open(d,e,b);e.focus()}function setLocation(b){window.location.href=b}function setPLocation(d,b){if(b){window.opener.focus()}window.opener.location.href=d}function setLanguageCode(e,f){var b=window.location.href;var h="",g;if(g=b.match(/\#(.*)$/)){b=b.replace(/\#(.*)$/,"");h=g[0]}if(b.match(/[?]/)){var d=/([?&]store=)[a-z0-9_]*/;if(b.match(d)){b=b.replace(d,"$1"+e)}else{b+="&store="+e}var d=/([?&]from_store=)[a-z0-9_]*/;if(b.match(d)){b=b.replace(d,"")}}else{b+="?store="+e}if(typeof(f)!="undefined"){b+="&from_store="+f}b+=h;setLocation(b)}function decorateGeneric(h,e){var l=["odd","even","first","last"];var d={};var g=h.length;if(g){if(typeof(e)=="undefined"){e=l}if(!e.length){return}for(var b in l){d[l[b]]=false}for(var b in e){d[e[b]]=true}if(d.first){Element.addClassName(h[0],"first")}if(d.last){Element.addClassName(h[g-1],"last")}for(var f=0;f<g;f++){if((f+1)%2==0){if(d.even){Element.addClassName(h[f],"even")}}else{if(d.odd){Element.addClassName(h[f],"odd")}}}}}function decorateTable(h,e){var h=$(h);if(h){var b={tbody:false,"tbody tr":["odd","even","first","last"],"thead tr":["first","last"],"tfoot tr":["first","last"],"tr td":["last"]};if(typeof(e)!="undefined"){for(var d in e){b[d]=e[d]}}if(b.tbody){decorateGeneric(h.select("tbody"),b.tbody)}if(b["tbody tr"]){decorateGeneric(h.select("tbody tr"),b["tbody tr"])}if(b["thead tr"]){decorateGeneric(h.select("thead tr"),b["thead tr"])}if(b["tfoot tr"]){decorateGeneric(h.select("tfoot tr"),b["tfoot tr"])}if(b["tr td"]){var g=h.select("tr");if(g.length){for(var f=0;f<g.length;f++){decorateGeneric(g[f].getElementsByTagName("TD"),b["tr td"])}}}}}function decorateList(e,d){if($(e)){if(typeof(d)=="undefined"){var b=$(e).select("li")}else{var b=$(e).childElements()}decorateGeneric(b,["odd","even","last"])}}function decorateDataList(b){b=$(b);if(b){decorateGeneric(b.select("dt"),["odd","even","last"]);decorateGeneric(b.select("dd"),["odd","even","last"])}}function parseSidUrl(f,e){var d=f.indexOf("/?SID=");var b="";e=(e!=undefined)?e:"";if(d>-1){b="?"+f.substring(d+2);f=f.substring(0,d+1)}return f+e+b}function formatCurrency(n,q,g){var l=isNaN(q.precision=Math.abs(q.precision))?2:q.precision;var v=isNaN(q.requiredPrecision=Math.abs(q.requiredPrecision))?2:q.requiredPrecision;l=v;var t=isNaN(q.integerRequired=Math.abs(q.integerRequired))?1:q.integerRequired;var p=q.decimalSymbol==undefined?",":q.decimalSymbol;var e=q.groupSymbol==undefined?".":q.groupSymbol;var d=q.groupLength==undefined?3:q.groupLength;var u="";if(g==undefined||g==true){u=n<0?"-":(g?"+":"")}else{if(g==false){u=""}}var h=parseInt(n=Math.abs(+n||0).toFixed(l))+"";var f=(h.length<t)?(t-h.length):0;while(f){h="0"+h;f--}j=(j=h.length)>d?j%d:0;re=new RegExp("(\\d{"+d+"})(?=\\d)","g");var b=(j?h.substr(0,j)+e:"")+h.substr(j).replace(re,"$1"+e)+(l?p+Math.abs(n-h).toFixed(l).replace(/-/,0).slice(2):"");var o="";if(q.pattern.indexOf("{sign}")==-1){o=u+q.pattern}else{o=q.pattern.replace("{sign}",u)}return o.replace("%s",b).replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function expandDetails(d,b){if(Element.hasClassName(d,"show-details")){$$(b).each(function(e){e.hide()});Element.removeClassName(d,"show-details")}else{$$(b).each(function(e){e.show()});Element.addClassName(d,"show-details")}}var isIE=navigator.appVersion.match(/MSIE/)=="MSIE";if(!window.Varien){var Varien=new Object()}Varien.showLoading=function(){var b=$("loading-process");b&&b.show()};Varien.hideLoading=function(){var b=$("loading-process");b&&b.hide()};Varien.GlobalHandlers={onCreate:function(){Varien.showLoading()},onComplete:function(){if(Ajax.activeRequestCount==0){Varien.hideLoading()}}};Ajax.Responders.register(Varien.GlobalHandlers);Varien.searchForm=Class.create();Varien.searchForm.prototype={initialize:function(d,e,b){this.form=$(d);this.field=$(e);this.emptyText=b;Event.observe(this.form,"submit",this.submit.bind(this));Event.observe(this.field,"focus",this.focus.bind(this));Event.observe(this.field,"blur",this.blur.bind(this));this.blur()},submit:function(b){if(this.field.value==this.emptyText||this.field.value==""){Event.stop(b);return false}return true},focus:function(b){if(this.field.value==this.emptyText){this.field.value=""}},blur:function(b){if(this.field.value==""){this.field.value=this.emptyText}}};Varien.DateElement=Class.create();Varien.DateElement.prototype={initialize:function(b,d,f,e){if(b=="id"){this.day=$(d+"day");this.month=$(d+"month");this.year=$(d+"year");this.full=$(d+"full");this.advice=$(d+"date-advice")}else{if(b=="container"){this.day=d.day;this.month=d.month;this.year=d.year;this.full=d.full;this.advice=d.advice}else{return}}this.required=f;this.format=e;this.day.addClassName("validate-custom");this.day.validate=this.validate.bind(this);this.month.addClassName("validate-custom");this.month.validate=this.validate.bind(this);this.year.addClassName("validate-custom");this.year.validate=this.validate.bind(this);this.setDateRange(false,false);this.year.setAttribute("autocomplete","off");this.advice.hide()},validate:function(){var l=false,o=parseInt(this.day.value,10)||0,f=parseInt(this.month.value,10)||0,h=parseInt(this.year.value,10)||0;if(this.day.value.strip().empty()&&this.month.value.strip().empty()&&this.year.value.strip().empty()){if(this.required){l="Please enter a date."}else{this.full.value=""}}else{if(!o||!f||!h){l="Please enter a valid full date."}else{var d=new Date,n=0,e=null;d.setYear(h);d.setMonth(f-1);d.setDate(32);n=32-d.getDate();if(!n||n>31){n=31}if(o<1||o>n){e="day";l="Please enter a valid day (1-%1)."}else{if(f<1||f>12){e="month";l="Please enter a valid month (1-12)."}else{if(o%10==o){this.day.value="0"+o}if(f%10==f){this.month.value="0"+f}this.full.value=this.format.replace(/%[mb]/i,this.month.value).replace(/%[de]/i,this.day.value).replace(/%y/i,this.year.value);var b=this.month.value+"/"+this.day.value+"/"+this.year.value;var g=new Date(b);if(isNaN(g)){l="Please enter a valid date."}else{this.setFullDate(g)}}}var p=false;if(!l&&!this.validateData()){e=this.validateDataErrorType;p=this.validateDataErrorText;l=p}}}if(l!==false){if(jQuery.mage.__){l=jQuery.mage.__(l)}if(!p){this.advice.innerHTML=l.replace("%1",n)}else{this.advice.innerHTML=this.errorTextModifier(l)}this.advice.show();return false}this.day.removeClassName("validation-failed");this.month.removeClassName("validation-failed");this.year.removeClassName("validation-failed");this.advice.hide();return true},validateData:function(){var d=this.fullDate.getFullYear();var b=new Date;this.curyear=b.getFullYear();return(d>=1900&&d<=this.curyear)},validateDataErrorType:"year",validateDataErrorText:"Please enter a valid year (1900-%1).",errorTextModifier:function(b){return b.replace("%1",this.curyear)},setDateRange:function(b,d){this.minDate=b;this.maxDate=d},setFullDate:function(b){this.fullDate=b}};Varien.DOB=Class.create();Varien.DOB.prototype={initialize:function(b,g,f){var e=$$(b)[0];var d={};d.day=Element.select(e,".dob-day input")[0];d.month=Element.select(e,".dob-month input")[0];d.year=Element.select(e,".dob-year input")[0];d.full=Element.select(e,".dob-full input")[0];d.advice=Element.select(e,".validation-advice")[0];new Varien.DateElement("container",d,g,f)}};Varien.dateRangeDate=Class.create();Varien.dateRangeDate.prototype=Object.extend(new Varien.DateElement(),{validateData:function(){var b=true;if(this.minDate||this.maxValue){if(this.minDate){this.minDate=new Date(this.minDate);this.minDate.setHours(0);if(isNaN(this.minDate)){this.minDate=new Date("1/1/1900")}b=b&&(this.fullDate>=this.minDate)}if(this.maxDate){this.maxDate=new Date(this.maxDate);this.minDate.setHours(0);if(isNaN(this.maxDate)){this.maxDate=new Date()}b=b&&(this.fullDate<=this.maxDate)}if(this.maxDate&&this.minDate){this.validateDataErrorText="Please enter a valid date between %s and %s"}else{if(this.maxDate){this.validateDataErrorText="Please enter a valid date less than or equal to %s"}else{if(this.minDate){this.validateDataErrorText="Please enter a valid date equal to or greater than %s"}else{this.validateDataErrorText=""}}}}return b},validateDataErrorText:"Date should be between %s and %s",errorTextModifier:function(b){if(this.minDate){b=b.sub("%s",this.dateFormat(this.minDate))}if(this.maxDate){b=b.sub("%s",this.dateFormat(this.maxDate))}return b},dateFormat:function(b){return(b.getMonth()+1)+"/"+b.getDate()+"/"+b.getFullYear()}});Varien.FileElement=Class.create();Varien.FileElement.prototype={initialize:function(b){this.fileElement=$(b);this.hiddenElement=$(b+"_value");this.fileElement.observe("change",this.selectFile.bind(this))},selectFile:function(b){this.hiddenElement.value=this.fileElement.getValue()}};Validation.addAllThese([["validate-custom"," ",function(b,d){return d.validate()}]]);Element.addMethods({getInnerText:function(b){b=$(b);if(b.innerText&&!Prototype.Browser.Opera){return b.innerText}return b.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g," ").strip()}});function fireEvent(d,e){if(document.createEvent){var b=document.createEvent("HTMLEvents");b.initEvent(e,true,true);return d.dispatchEvent(b)}else{var b=document.createEventObject();return d.fireEvent("on"+e,b)}}function modulo(b,f){var e=f/10000;var d=b%f;if(Math.abs(d-f)<e||Math.abs(d)<e){d=0}return d}if((typeof Range!="undefined")&&!Range.prototype.createContextualFragment){Range.prototype.createContextualFragment=function(b){var e=document.createDocumentFragment(),d=document.createElement("div");e.appendChild(d);d.outerHTML=b;return e}}var byteConvert=function(b){if(isNaN(b)){return""}var d=["bytes","KB","MB","GB","TB","PB","EB","ZB","YB"];var f=Math.floor(Math.log(b)/Math.log(2));if(f<1){f=0}var e=Math.floor(f/10);b=b/Math.pow(2,10*e);if(b.toString().length>b.toFixed(2).toString().length){b=b.toFixed(2)}return b+" "+d[e]};var SessionError=Class.create();SessionError.prototype={initialize:function(b){this.errorText=b},toString:function(){return"Session Error:"+this.errorText}};Ajax.Request.addMethods({initialize:function($super,d,b){$super(b);this.transport=Ajax.getTransport();if(!d.match(new RegExp("[?&]isAjax=true",""))){d=d.match(new RegExp("\\?","g"))?d+"&isAjax=true":d+"?isAjax=true"}if(Object.isString(this.options.parameters)&&this.options.parameters.indexOf("form_key=")==-1){this.options.parameters+="&"+Object.toQueryString({form_key:FORM_KEY})}else{if(!this.options.parameters){this.options.parameters={form_key:FORM_KEY}}if(!this.options.parameters.form_key){this.options.parameters.form_key=FORM_KEY}}this.request(d)},respondToReadyState:function(b){var g=Ajax.Request.Events[b],d=new Ajax.Response(this);if(g=="Complete"){try{this._complete=true;if(d.responseText.isJSON()){var f=d.responseText.evalJSON();if(f.ajaxExpired&&f.ajaxRedirect){window.location.replace(f.ajaxRedirect);throw new SessionError("session expired")}}(this.options["on"+d.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(d,d.headerJSON)}catch(h){this.dispatchException(h);if(h instanceof SessionError){return}}var l=d.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&l&&l.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse()}}try{(this.options["on"+g]||Prototype.emptyFunction)(d,d.headerJSON);Ajax.Responders.dispatch("on"+g,this,d,d.headerJSON)}catch(h){this.dispatchException(h)}if(g=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction}}});Ajax.Updater.respondToReadyState=Ajax.Request.respondToReadyState;var varienLoader=new Class.create();varienLoader.prototype={initialize:function(b){this.callback=false;this.cache=$H();this.caching=b||false;this.url=false},getCache:function(b){if(this.cache.get(b)){return this.cache.get(b)}return false},load:function(b,d,f){this.url=b;this.callback=f;if(this.caching){var e=this.getCache(b);if(e){this.processResult(e);return}}if(typeof(d.updaterId)!="undefined"){new varienUpdater(d.updaterId,b,{evalScripts:true,onComplete:this.processResult.bind(this),onFailure:this._processFailure.bind(this)})}else{new Ajax.Request(b,{method:"post",parameters:d||{},onComplete:this.processResult.bind(this),onFailure:this._processFailure.bind(this)})}},_processFailure:function(b){location.href=BASE_URL},processResult:function(b){if(this.caching){this.cache.set(this.url,b)}if(this.callback){this.callback(b.responseText)}}};if(!window.varienLoaderHandler){var varienLoaderHandler=new Object()}varienLoaderHandler.handler={onCreate:function(b){if(b.options.loaderArea===false){return}jQuery("body").trigger("processStart")},onException:function(b){jQuery("body").trigger("processStop")},onComplete:function(b){jQuery("body").trigger("processStop")}};function setLoaderPosition(){var e=$("loading_mask_loader");if(e&&Prototype.Browser.IE){var d=e.getDimensions();var f=document.viewport.getDimensions();var b=document.viewport.getScrollOffsets();e.style.left=Math.floor(f.width/2+b.left-d.width/2)+"px";e.style.top=Math.floor(f.height/2+b.top-d.height/2)+"px";e.style.position="absolute"}}function toggleSelectsUnderBlock(f,b){if(Prototype.Browser.IE){var e=document.getElementsByTagName("select");for(var d=0;d<e.length;d++){if(b){if(e[d].needShowOnSuccess){e[d].needShowOnSuccess=false;e[d].style.visibility=""}}else{if(Element.visible(e[d])){e[d].style.visibility="hidden";e[d].needShowOnSuccess=true}}}}}Ajax.Responders.register(varienLoaderHandler.handler);var varienUpdater=Class.create(Ajax.Updater,{updateContent:function($super,b){if(b.isJSON()){var d=b.evalJSON();if(d.ajaxExpired&&d.ajaxRedirect){window.location.replace(d.ajaxRedirect)}}else{$super(b)}}});function setLocation(b){window.location.href=b}function confirmSetLocation(d,b){if(confirm(d)){setLocation(b)}return false}function deleteConfirm(d,b){confirmSetLocation(d,b)}function setElementDisable(d,b){if($(d)){$(d).disabled=b}}function toggleParentVis(b){b=$(b).parentNode;if(b.style.display=="none"){b.style.display=""}else{b.style.display="none"}}function toggleFieldsetVis(d){id=d;d=$(d);if(d.style.display=="none"){d.style.display=""}else{d.style.display="none"}d=d.parentNode.childElements();for(var b=0;b<d.length;b++){if(d[b].id!=undefined&&d[b].id==id&&d[(b-1)].classNames()=="entry-edit-head"){if(d[b-1].style.display=="none"){d[b-1].style.display=""}else{d[b-1].style.display="none"}}}}function toggleVis(b){b=$(b);if(b.style.display=="none"){b.style.display=""}else{b.style.display="none"}}function imagePreview(b){if($(b)){var d=window.open("","preview","width=400,height=400,resizable=1,scrollbars=1");d.document.open();d.document.write('<body style="padding:0;margin:0"><img src="'+$(b).src+'" id="image_preview"/></body>');d.document.close();Event.observe(d,"load",function(){var e=d.document.getElementById("image_preview");d.resizeTo(e.width+40,e.height+80)})}}function checkByProductPriceType(b){if(b.id=="price_type"){this.productPriceType=b.value;return false}else{if(b.id=="price"&&this.productPriceType==0){return false}return true}}Event.observe(window,"load",function(){if($("price_default")&&$("price_default").checked){$("price").disabled="disabled"}});function toggleSeveralValueElements(f,e,b,d){if(e&&f){if(Object.prototype.toString.call(e)!="[object Array]"){e=[e]}e.each(function(g){toggleValueElements(f,g,b,d)})}}function toggleValueElements(l,d,f,h){if(d&&l){var n=[l];if(typeof f!="undefined"){if(Object.prototype.toString.call(f)!="[object Array]"){f=[f]}for(var g=0;g<f.length;g++){n.push(f[g])}}var e=Element.select(d,["select","input","textarea","button","img"]).filter(function(o){return(o.readAttribute("type")!="hidden")});var b=(h!=undefined?h:l.checked);e.each(function(p){if(checkByProductPriceType(p)){var o=n.length;while(o--&&p!=n[o]){}if(o!=-1){return}p.disabled=b;if(b){p.addClassName("disabled")}else{p.removeClassName("disabled")}if(p.nodeName.toLowerCase()=="img"){b?p.hide():p.show()}}})}}function submitAndReloadArea(e,d){if($(e)){var b=$(e).select("input","select","textarea");var f=Form.serializeElements(b,true);d=d+(d.match(new RegExp("\\?"))?"&isAjax=true":"?isAjax=true");new Ajax.Request(d,{parameters:$H(f),loaderArea:e,onSuccess:function(l){try{if(l.responseText.isJSON()){var g=l.responseText.evalJSON();if(g.error){alert(g.message)}if(g.ajaxExpired&&g.ajaxRedirect){setLocation(g.ajaxRedirect)}}else{$(e).update(l.responseText)}}catch(h){$(e).update(l.responseText)}}})}}function syncOnchangeValue(d,e){var b={baseElem:d,distElem:e};Event.observe(d,"change",function(){if($(this.baseElem)&&$(this.distElem)){$(this.distElem).value=$(this.baseElem).value}}.bind(b))}function updateElementAtCursor(e,f,g){if(g==undefined){g=window.self}if(document.selection){e.focus();sel=g.document.selection.createRange();sel.text=f}else{if(e.selectionStart||e.selectionStart=="0"){var d=e.selectionStart;var b=e.selectionEnd;e.value=e.value.substring(0,d)+f+e.value.substring(b,e.value.length)}else{e.value+=f}}}function firebugEnabled(){if(window.console&&window.console.firebug){return true}return false}function disableElement(b){b.disabled=true;b.addClassName("disabled")}function enableElement(b){b.disabled=false;b.removeClassName("disabled")}function disableElements(b){$$("."+b).each(disableElement)}function enableElements(b){$$("."+b).each(enableElement)}var Cookie={all:function(){var d=document.cookie.split(";");var b={};d.each(function(f,e){var g=f.strip().split("=");b[unescape(g[0])]=unescape(g[1])});return b},read:function(d){var b=this.all();if(b[d]){return b[d]}return null},write:function(h,f,g){var b="";if(g){var e=new Date();e.setTime(e.getTime()+(g*1000));b="; expires="+e.toGMTString()}var d="/"+BASE_URL.split("/").slice(3).join("/");document.cookie=escape(h)+"="+escape(f)+b+"; path="+d},clear:function(b){this.write(b,"",-1)}};var Fieldset={cookiePrefix:"fh-",applyCollapse:function(b){if($(b+"-state")){collapsed=$(b+"-state").value==1?0:1}else{collapsed=$(b+"-head").collapsed}if(collapsed==1||collapsed===undefined){$(b+"-head").removeClassName("open");if($(b+"-head").up(".section-config")){$(b+"-head").up(".section-config").removeClassName("active")}$(b).hide()}else{$(b+"-head").addClassName("open");if($(b+"-head").up(".section-config")){$(b+"-head").up(".section-config").addClassName("active")}$(b).show()}},toggleCollapse:function(b,d){if($(b+"-state")){collapsed=$(b+"-state").value==1?0:1}else{collapsed=$(b+"-head").collapsed}if(collapsed==1||collapsed===undefined){if($(b+"-state")){$(b+"-state").value=1}$(b+"-head").collapsed=0}else{if($(b+"-state")){$(b+"-state").value=0}$(b+"-head").collapsed=1}this.applyCollapse(b);if(typeof d!="undefined"){this.saveState(d,{container:b,value:$(b+"-state").value})}},addToPrefix:function(b){this.cookiePrefix+=b+"-"},saveState:function(b,d){new Ajax.Request(b,{method:"get",parameters:Object.toQueryString(d),loaderArea:false})}};var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var b="";var p,n,h,o,l,g,f;var d=0;if(typeof window.btoa==="function"){return window.btoa(e)}e=Base64._utf8_encode(e);while(d<e.length){p=e.charCodeAt(d++);n=e.charCodeAt(d++);h=e.charCodeAt(d++);o=p>>2;l=((p&3)<<4)|(n>>4);g=((n&15)<<2)|(h>>6);f=h&63;if(isNaN(n)){g=f=64}else{if(isNaN(h)){f=64}}b=b+this._keyStr.charAt(o)+this._keyStr.charAt(l)+this._keyStr.charAt(g)+this._keyStr.charAt(f)}return b},decode:function(e){var b="";var p,n,h;var o,l,g,f;var d=0;if(typeof window.atob==="function"){return window.atob(e)}e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(d<e.length){o=this._keyStr.indexOf(e.charAt(d++));l=this._keyStr.indexOf(e.charAt(d++));g=this._keyStr.indexOf(e.charAt(d++));f=this._keyStr.indexOf(e.charAt(d++));p=(o<<2)|(l>>4);n=((l&15)<<4)|(g>>2);h=((g&3)<<6)|f;b=b+String.fromCharCode(p);if(g!=64){b=b+String.fromCharCode(n)}if(f!=64){b=b+String.fromCharCode(h)}}b=Base64._utf8_decode(b);return b},mageEncode:function(b){return this.encode(b).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,",")},mageDecode:function(b){b=b.replace(/\-/g,"+").replace(/_/g,"/").replace(/,/g,"=");return this.decode(b)},idEncode:function(b){return this.encode(b).replace(/\+/g,":").replace(/\//g,"_").replace(/=/g,"-")},idDecode:function(b){b=b.replace(/\-/g,"=").replace(/_/g,"/").replace(/\:/g,"+");return this.decode(b)},_utf8_encode:function(d){d=d.replace(/\r\n/g,"\n");var b="";for(var f=0;f<d.length;f++){var e=d.charCodeAt(f);if(e<128){b+=String.fromCharCode(e)}else{if((e>127)&&(e<2048)){b+=String.fromCharCode((e>>6)|192);b+=String.fromCharCode((e&63)|128)}else{b+=String.fromCharCode((e>>12)|224);b+=String.fromCharCode(((e>>6)&63)|128);b+=String.fromCharCode((e&63)|128)}}}return b},_utf8_decode:function(b){var d="";var e=0;var f=c1=c2=0;while(e<b.length){f=b.charCodeAt(e);if(f<128){d+=String.fromCharCode(f);e++}else{if((f>191)&&(f<224)){c2=b.charCodeAt(e+1);d+=String.fromCharCode(((f&31)<<6)|(c2&63));e+=2}else{c2=b.charCodeAt(e+1);c3=b.charCodeAt(e+2);d+=String.fromCharCode(((f&15)<<12)|((c2&63)<<6)|(c3&63));e+=3}}}return d}};function sortNumeric(d,b){return d-b}(function(){var globals=["Prototype","Abstract","Try","Class","PeriodicalExecuter","Template","$break","Enumerable","$A","$w","$H","Hash","$R","ObjectRange","Ajax","$","Form","Field","$F","Toggle","Insertion","$continue","Position","Windows","Dialog","array","WindowUtilities","Builder","Effect","validateCreditCard","Validator","Validation","removeDelimiters","parseNumber","popWin","setLocation","setPLocation","setLanguageCode","decorateGeneric","decorateTable","decorateList","decorateDataList","parseSidUrl","formatCurrency","expandDetails","isIE","Varien","fireEvent","modulo","byteConvert","SessionError","varienLoader","varienLoaderHandler","setLoaderPosition","toggleSelectsUnderBlock","varienUpdater","confirmSetLocation","deleteConfirm","setElementDisable","toggleParentVis","toggleFieldsetVis","toggleVis","imagePreview","checkByProductPriceType","toggleSeveralValueElements","toggleValueElements","submitAndReloadArea","syncOnchangeValue","updateElementAtCursor","firebugEnabled","disableElement","enableElement","disableElements","enableElements","Cookie","Fieldset","Base64","sortNumeric","Element","$$","Sizzle","Selector","Window"];globals.forEach(function(prop){window[prop]=eval(prop)})})(); \ No newline at end of file +(function(){var w=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,p=0,g=Object.prototype.toString,u=false,o=true;[0,0].sort(function(){o=false;return 0});var d=function(L,B,I,D){I=I||[];var e=B=B||document;if(B.nodeType!==1&&B.nodeType!==9){return[]}if(!L||typeof L!=="string"){return I}var J=[],K,G,P,O,H,A,z=true,E=v(B),N=L;while((w.exec(""),K=w.exec(N))!==null){N=K[3];J.push(K[1]);if(K[2]){A=K[3];break}}if(J.length>1&&q.exec(L)){if(J.length===2&&h.relative[J[0]]){G=l(J[0]+J[1],B)}else{G=h.relative[J[0]]?[B]:d(J.shift(),B);while(J.length){L=J.shift();if(h.relative[L]){L+=J.shift()}G=l(L,G)}}}else{if(!D&&J.length>1&&B.nodeType===9&&!E&&h.match.ID.test(J[0])&&!h.match.ID.test(J[J.length-1])){var Q=d.find(J.shift(),B,E);B=Q.expr?d.filter(Q.expr,Q.set)[0]:Q.set[0]}if(B){var Q=D?{expr:J.pop(),set:b(D)}:d.find(J.pop(),J.length===1&&(J[0]==="~"||J[0]==="+")&&B.parentNode?B.parentNode:B,E);G=Q.expr?d.filter(Q.expr,Q.set):Q.set;if(J.length>0){P=b(G)}else{z=false}while(J.length){var C=J.pop(),F=C;if(!h.relative[C]){C=""}else{F=J.pop()}if(F==null){F=B}h.relative[C](P,F,E)}}else{P=J=[]}}if(!P){P=G}if(!P){throw"Syntax error, unrecognized expression: "+(C||L)}if(g.call(P)==="[object Array]"){if(!z){I.push.apply(I,P)}else{if(B&&B.nodeType===1){for(var M=0;P[M]!=null;M++){if(P[M]&&(P[M]===true||P[M].nodeType===1&&n(B,P[M]))){I.push(G[M])}}}else{for(var M=0;P[M]!=null;M++){if(P[M]&&P[M].nodeType===1){I.push(G[M])}}}}}else{b(P,I)}if(A){d(A,e,I,D);d.uniqueSort(I)}return I};d.uniqueSort=function(z){if(f){u=o;z.sort(f);if(u){for(var e=1;e<z.length;e++){if(z[e]===z[e-1]){z.splice(e--,1)}}}}return z};d.matches=function(e,z){return d(e,null,null,z)};d.find=function(F,e,G){var E,C;if(!F){return[]}for(var B=0,A=h.order.length;B<A;B++){var D=h.order[B],C;if((C=h.leftMatch[D].exec(F))){var z=C[1];C.splice(1,1);if(z.substr(z.length-1)!=="\\"){C[1]=(C[1]||"").replace(/\\/g,"");E=h.find[D](C,e,G);if(E!=null){F=F.replace(h.match[D],"");break}}}}if(!E){E=e.getElementsByTagName("*")}return{set:E,expr:F}};d.filter=function(I,H,L,B){var A=I,N=[],F=H,D,e,E=H&&H[0]&&v(H[0]);while(I&&H.length){for(var G in h.filter){if((D=h.match[G].exec(I))!=null){var z=h.filter[G],M,K;e=false;if(F==N){N=[]}if(h.preFilter[G]){D=h.preFilter[G](D,F,L,N,B,E);if(!D){e=M=true}else{if(D===true){continue}}}if(D){for(var C=0;(K=F[C])!=null;C++){if(K){M=z(K,D,C,F);var J=B^!!M;if(L&&M!=null){if(J){e=true}else{F[C]=false}}else{if(J){N.push(K);e=true}}}}}if(M!==undefined){if(!L){F=N}I=I.replace(h.match[G],"");if(!e){return[]}break}}}if(I==A){if(e==null){throw"Syntax error, unrecognized expression: "+I}else{break}}A=I}return F};var h=d.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")}},relative:{"+":function(F,e,E){var C=typeof e==="string",G=C&&!/\W/.test(e),D=C&&!G;if(G&&!E){e=e.toUpperCase()}for(var B=0,A=F.length,z;B<A;B++){if((z=F[B])){while((z=z.previousSibling)&&z.nodeType!==1){}F[B]=D||z&&z.nodeName===e?z||false:z===e}}if(D){d.filter(e,F,true)}},">":function(E,z,F){var C=typeof z==="string";if(C&&!/\W/.test(z)){z=F?z:z.toUpperCase();for(var A=0,e=E.length;A<e;A++){var D=E[A];if(D){var B=D.parentNode;E[A]=B.nodeName===z?B:false}}}else{for(var A=0,e=E.length;A<e;A++){var D=E[A];if(D){E[A]=C?D.parentNode:D.parentNode===z}}if(C){d.filter(z,E,true)}}},"":function(B,z,D){var A=p++,e=y;if(!/\W/.test(z)){var C=z=D?z:z.toUpperCase();e=t}e("parentNode",z,A,B,C,D)},"~":function(B,z,D){var A=p++,e=y;if(typeof z==="string"&&!/\W/.test(z)){var C=z=D?z:z.toUpperCase();e=t}e("previousSibling",z,A,B,C,D)}},find:{ID:function(z,A,B){if(typeof A.getElementById!=="undefined"&&!B){var e=A.getElementById(z[1]);return e?[e]:[]}},NAME:function(A,D,E){if(typeof D.getElementsByName!=="undefined"){var z=[],C=D.getElementsByName(A[1]);for(var B=0,e=C.length;B<e;B++){if(C[B].getAttribute("name")===A[1]){z.push(C[B])}}return z.length===0?null:z}},TAG:function(e,z){return z.getElementsByTagName(e[1])}},preFilter:{CLASS:function(B,z,A,e,E,F){B=" "+B[1].replace(/\\/g,"")+" ";if(F){return B}for(var C=0,D;(D=z[C])!=null;C++){if(D){if(E^(D.className&&(" "+D.className+" ").indexOf(B)>=0)){if(!A){e.push(D)}}else{if(A){z[C]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(z,e){for(var A=0;e[A]===false;A++){}return e[A]&&v(e[A])?z[1]:z[1].toUpperCase()},CHILD:function(e){if(e[1]=="nth"){var z=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]=="even"&&"2n"||e[2]=="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(z[1]+(z[2]||1))-0;e[3]=z[3]-0}e[0]=p++;return e},ATTR:function(C,z,A,e,D,E){var B=C[1].replace(/\\/g,"");if(!E&&h.attrMap[B]){C[1]=h.attrMap[B]}if(C[2]==="~="){C[4]=" "+C[4]+" "}return C},PSEUDO:function(C,z,A,e,D){if(C[1]==="not"){if((w.exec(C[3])||"").length>1||/^\w/.test(C[3])){C[3]=d(C[3],null,null,z)}else{var B=d.filter(C[3],z,A,true^D);if(!A){e.push.apply(e,B)}return false}}else{if(h.match.POS.test(C[0])||h.match.CHILD.test(C[0])){return true}}return C},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(A,z,e){return !!d(e[3],A).length},header:function(e){return/h\d/i.test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toUpperCase()==="BUTTON"},input:function(e){return/input|select|textarea|button/i.test(e.nodeName)}},setFilters:{first:function(z,e){return e===0},last:function(A,z,e,B){return z===B.length-1},even:function(z,e){return e%2===0},odd:function(z,e){return e%2===1},lt:function(A,z,e){return z<e[3]-0},gt:function(A,z,e){return z>e[3]-0},nth:function(A,z,e){return e[3]-0==z},eq:function(A,z,e){return e[3]-0==z}},filter:{PSEUDO:function(E,A,B,F){var z=A[1],C=h.filters[z];if(C){return C(E,B,A,F)}else{if(z==="contains"){return(E.textContent||E.innerText||"").indexOf(A[3])>=0}else{if(z==="not"){var D=A[3];for(var B=0,e=D.length;B<e;B++){if(D[B]===E){return false}}return true}}}},CHILD:function(e,B){var E=B[1],z=e;switch(E){case"only":case"first":while((z=z.previousSibling)){if(z.nodeType===1){return false}}if(E=="first"){return true}z=e;case"last":while((z=z.nextSibling)){if(z.nodeType===1){return false}}return true;case"nth":var A=B[2],H=B[3];if(A==1&&H==0){return true}var D=B[0],G=e.parentNode;if(G&&(G.sizcache!==D||!e.nodeIndex)){var C=0;for(z=G.firstChild;z;z=z.nextSibling){if(z.nodeType===1){z.nodeIndex=++C}}G.sizcache=D}var F=e.nodeIndex-H;if(A==0){return F==0}else{return(F%A==0&&F/A>=0)}}},ID:function(z,e){return z.nodeType===1&&z.getAttribute("id")===e},TAG:function(z,e){return(e==="*"&&z.nodeType===1)||z.nodeName===e},CLASS:function(z,e){return(" "+(z.className||z.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(D,B){var A=B[1],e=h.attrHandle[A]?h.attrHandle[A](D):D[A]!=null?D[A]:D.getAttribute(A),E=e+"",C=B[2],z=B[4];return e==null?C==="!=":C==="="?E===z:C==="*="?E.indexOf(z)>=0:C==="~="?(" "+E+" ").indexOf(z)>=0:!z?E&&e!==false:C==="!="?E!=z:C==="^="?E.indexOf(z)===0:C==="$="?E.substr(E.length-z.length)===z:C==="|="?E===z||E.substr(0,z.length+1)===z+"-":false},POS:function(C,z,A,D){var e=z[2],B=h.setFilters[e];if(B){return B(C,A,z,D)}}}};var q=h.match.POS;for(var s in h.match){h.match[s]=new RegExp(h.match[s].source+/(?![^\[]*\])(?![^\(]*\))/.source);h.leftMatch[s]=new RegExp(/(^(?:.|\r|\n)*?)/.source+h.match[s].source)}var b=function(z,e){z=Array.prototype.slice.call(z,0);if(e){e.push.apply(e,z);return e}return z};try{Array.prototype.slice.call(document.documentElement.childNodes,0)}catch(r){b=function(C,B){var z=B||[];if(g.call(C)==="[object Array]"){Array.prototype.push.apply(z,C)}else{if(typeof C.length==="number"){for(var A=0,e=C.length;A<e;A++){z.push(C[A])}}else{for(var A=0;C[A];A++){z.push(C[A])}}}return z}}var f;if(document.documentElement.compareDocumentPosition){f=function(z,e){if(!z.compareDocumentPosition||!e.compareDocumentPosition){if(z==e){u=true}return 0}var A=z.compareDocumentPosition(e)&4?-1:z===e?0:1;if(A===0){u=true}return A}}else{if("sourceIndex" in document.documentElement){f=function(z,e){if(!z.sourceIndex||!e.sourceIndex){if(z==e){u=true}return 0}var A=z.sourceIndex-e.sourceIndex;if(A===0){u=true}return A}}else{if(document.createRange){f=function(B,z){if(!B.ownerDocument||!z.ownerDocument){if(B==z){u=true}return 0}var A=B.ownerDocument.createRange(),e=z.ownerDocument.createRange();A.setStart(B,0);A.setEnd(B,0);e.setStart(z,0);e.setEnd(z,0);var C=A.compareBoundaryPoints(Range.START_TO_END,e);if(C===0){u=true}return C}}}}(function(){var z=document.createElement("div"),A="script"+(new Date).getTime();z.innerHTML="<a name='"+A+"'/>";var e=document.documentElement;e.insertBefore(z,e.firstChild);if(!!document.getElementById(A)){h.find.ID=function(C,D,E){if(typeof D.getElementById!=="undefined"&&!E){var B=D.getElementById(C[1]);return B?B.id===C[1]||typeof B.getAttributeNode!=="undefined"&&B.getAttributeNode("id").nodeValue===C[1]?[B]:undefined:[]}};h.filter.ID=function(D,B){var C=typeof D.getAttributeNode!=="undefined"&&D.getAttributeNode("id");return D.nodeType===1&&C&&C.nodeValue===B}}e.removeChild(z);e=z=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){h.find.TAG=function(z,D){var C=D.getElementsByTagName(z[1]);if(z[1]==="*"){var B=[];for(var A=0;C[A];A++){if(C[A].nodeType===1){B.push(C[A])}}C=B}return C}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){h.attrHandle.href=function(z){return z.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=d,A=document.createElement("div");A.innerHTML="<p class='TEST'></p>";if(A.querySelectorAll&&A.querySelectorAll(".TEST").length===0){return}d=function(E,D,B,C){D=D||document;if(!C&&D.nodeType===9&&!v(D)){try{return b(D.querySelectorAll(E),B)}catch(F){}}return e(E,D,B,C)};for(var z in e){d[z]=e[z]}A=null})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}h.order.splice(1,0,"CLASS");h.find.CLASS=function(z,A,B){if(typeof A.getElementsByClassName!=="undefined"&&!B){return A.getElementsByClassName(z[1])}};e=null})()}function t(z,E,D,I,F,H){var G=z=="previousSibling"&&!H;for(var B=0,A=I.length;B<A;B++){var e=I[B];if(e){if(G&&e.nodeType===1){e.sizcache=D;e.sizset=B}e=e[z];var C=false;while(e){if(e.sizcache===D){C=I[e.sizset];break}if(e.nodeType===1&&!H){e.sizcache=D;e.sizset=B}if(e.nodeName===E){C=e;break}e=e[z]}I[B]=C}}}function y(z,E,D,I,F,H){var G=z=="previousSibling"&&!H;for(var B=0,A=I.length;B<A;B++){var e=I[B];if(e){if(G&&e.nodeType===1){e.sizcache=D;e.sizset=B}e=e[z];var C=false;while(e){if(e.sizcache===D){C=I[e.sizset];break}if(e.nodeType===1){if(!H){e.sizcache=D;e.sizset=B}if(typeof E!=="string"){if(e===E){C=true;break}}else{if(d.filter(E,[e]).length>0){C=e;break}}}e=e[z]}I[B]=C}}}var n=document.compareDocumentPosition?function(z,e){return z.compareDocumentPosition(e)&16}:function(z,e){return z!==e&&(z.contains?z.contains(e):true)};var v=function(e){return e.nodeType===9&&e.documentElement.nodeName!=="HTML"||!!e.ownerDocument&&e.ownerDocument.documentElement.nodeName!=="HTML"};var l=function(e,F){var B=[],C="",D,A=F.nodeType?[F]:F;while((D=h.match.PSEUDO.exec(e))){C+=D[0];e=e.replace(h.match.PSEUDO,"")}e=h.relative[e]?e+"*":e;for(var E=0,z=A.length;E<z;E++){d(e,A[E],B)}return d.filter(C,B)};window.Sizzle=d})();(function(e){var f=Prototype.Selector.extendElements;function b(g,h){return f(e(g,h||document))}function d(h,g){return e.matches(g,[h]).length==1}Prototype.Selector.engine=e;Prototype.Selector.select=b;Prototype.Selector.match=d})(Sizzle);window.Sizzle=Prototype._original_property;delete Prototype._original_property;var Form={reset:function(b){b=$(b);b.reset();return b},serializeElements:function(n,f){if(typeof f!="object"){f={hash:!!f}}else{if(Object.isUndefined(f.hash)){f.hash=true}}var g,l,b=false,h=f.submit,d,e;if(f.hash){e={};d=function(o,p,q){if(p in o){if(!Object.isArray(o[p])){o[p]=[o[p]]}o[p].push(q)}else{o[p]=q}return o}}else{e="";d=function(o,p,q){return o+(o?"&":"")+encodeURIComponent(p)+"="+encodeURIComponent(q)}}return n.inject(e,function(o,p){if(!p.disabled&&p.name){g=p.name;l=$(p).getValue();if(l!=null&&p.type!="file"&&(p.type!="submit"||(!b&&h!==false&&(!h||g==h)&&(b=true)))){o=d(o,g,l)}}return o})}};Form.Methods={serialize:function(d,b){return Form.serializeElements(Form.getElements(d),b)},getElements:function(g){var h=$(g).getElementsByTagName("*"),f,b=[],e=Form.Element.Serializers;for(var d=0;f=h[d];d++){b.push(f)}return b.inject([],function(l,n){if(e[n.tagName.toLowerCase()]){l.push(Element.extend(n))}return l})},getInputs:function(l,e,f){l=$(l);var b=l.getElementsByTagName("input");if(!e&&!f){return $A(b).map(Element.extend)}for(var g=0,n=[],h=b.length;g<h;g++){var d=b[g];if((e&&d.type!=e)||(f&&d.name!=f)){continue}n.push(Element.extend(d))}return n},disable:function(b){b=$(b);Form.getElements(b).invoke("disable");return b},enable:function(b){b=$(b);Form.getElements(b).invoke("enable");return b},findFirstElement:function(d){var e=$(d).getElements().findAll(function(f){return"hidden"!=f.type&&!f.disabled});var b=e.findAll(function(f){return f.hasAttribute("tabIndex")&&f.tabIndex>=0}).sortBy(function(f){return f.tabIndex}).first();return b?b:e.find(function(f){return/^(?:input|select|textarea)$/i.test(f.tagName)})},focusFirstElement:function(d){d=$(d);var b=d.findFirstElement();if(b){b.activate()}return d},request:function(d,b){d=$(d),b=Object.clone(b||{});var f=b.parameters,e=d.readAttribute("action")||"";if(e.blank()){e=window.location.href}b.parameters=d.serialize(true);if(f){if(Object.isString(f)){f=f.toQueryParams()}Object.extend(b.parameters,f)}if(d.hasAttribute("method")&&!b.method){b.method=d.method}return new Ajax.Request(e,b)}};Form.Element={focus:function(b){$(b).focus();return b},select:function(b){$(b).select();return b}};Form.Element.Methods={serialize:function(b){b=$(b);if(!b.disabled&&b.name){var d=b.getValue();if(d!=undefined){var e={};e[b.name]=d;return Object.toQueryString(e)}}return""},getValue:function(b){b=$(b);var d=b.tagName.toLowerCase();return Form.Element.Serializers[d](b)},setValue:function(b,d){b=$(b);var e=b.tagName.toLowerCase();Form.Element.Serializers[e](b,d);return b},clear:function(b){$(b).value="";return b},present:function(b){return $(b).value!=""},activate:function(b){b=$(b);try{b.focus();if(b.select&&(b.tagName.toLowerCase()!="input"||!(/^(?:button|reset|submit)$/i.test(b.type)))){b.select()}}catch(d){}return b},disable:function(b){b=$(b);b.disabled=true;return b},enable:function(b){b=$(b);b.disabled=false;return b}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers=(function(){function d(n,o){switch(n.type.toLowerCase()){case"checkbox":case"radio":return h(n,o);default:return g(n,o)}}function h(n,o){if(Object.isUndefined(o)){return n.checked?n.value:null}else{n.checked=!!o}}function g(n,o){if(Object.isUndefined(o)){return n.value}else{n.value=o}}function b(p,s){if(Object.isUndefined(s)){return(p.type==="select-one"?e:f)(p)}var o,q,t=!Object.isArray(s);for(var n=0,r=p.length;n<r;n++){o=p.options[n];q=this.optionValue(o);if(t){if(q==s){o.selected=true;return}}else{o.selected=s.include(q)}}}function e(o){var n=o.selectedIndex;return n>=0?l(o.options[n]):null}function f(q){var n,r=q.length;if(!r){return null}for(var p=0,n=[];p<r;p++){var o=q.options[p];if(o.selected){n.push(l(o))}}return n}function l(n){return Element.hasAttribute(n,"value")?n.value:n.text}return{input:d,inputSelector:h,textarea:g,select:b,selectOne:e,selectMany:f,optionValue:l,button:g}})();Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,b,d,e){$super(e,d);this.element=$(b);this.lastValue=this.getValue()},execute:function(){var b=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(b)?this.lastValue!=b:String(this.lastValue)!=String(b)){this.callback(this.element,b);this.lastValue=b}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element)}});Abstract.EventObserver=Class.create({initialize:function(b,d){this.element=$(b);this.callback=d;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks()}else{this.registerCallback(this.element)}},onElementEvent:function(){var b=this.getValue();if(this.lastValue!=b){this.callback(this.element,b);this.lastValue=b}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this)},registerCallback:function(b){if(b.type){switch(b.type.toLowerCase()){case"checkbox":case"radio":Event.observe(b,"click",this.onElementEvent.bind(this));break;default:Event.observe(b,"change",this.onElementEvent.bind(this));break}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element)}});(function(){var J={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{}};var h=document.documentElement;var K="onmouseenter" in h&&"onmouseleave" in h;var b=function(L){return false};if(window.attachEvent){if(window.addEventListener){b=function(L){return !(L instanceof window.Event)}}else{b=function(L){return true}}}var y;function H(M,L){return M.which?(M.which===L+1):(M.button===L)}var u={0:1,1:4,2:2};function F(M,L){return M.button===u[L]}function I(M,L){switch(L){case 0:return M.which==1&&!M.metaKey;case 1:return M.which==2||(M.which==1&&M.metaKey);case 2:return M.which==3;default:return false}}if(window.attachEvent){if(!window.addEventListener){y=F}else{y=function(M,L){return b(M)?F(M,L):H(M,L)}}}else{if(Prototype.Browser.WebKit){y=I}else{y=H}}function C(L){return y(L,0)}function A(L){return y(L,1)}function t(L){return y(L,2)}function f(N){N=J.extend(N);var M=N.target,L=N.type,O=N.currentTarget;if(O&&O.tagName){if(L==="load"||L==="error"||(L==="click"&&O.tagName.toLowerCase()==="input"&&O.type==="radio")){M=O}}if(M.nodeType==Node.TEXT_NODE){M=M.parentNode}return Element.extend(M)}function v(M,N){var L=J.element(M);if(!N){return L}while(L){if(Object.isElement(L)&&Prototype.Selector.match(L,N)){return Element.extend(L)}L=L.parentNode}}function z(L){return{x:e(L),y:d(L)}}function e(N){var M=document.documentElement,L=document.body||{scrollLeft:0};return N.pageX||(N.clientX+(M.scrollLeft||L.scrollLeft)-(M.clientLeft||0))}function d(N){var M=document.documentElement,L=document.body||{scrollTop:0};return N.pageY||(N.clientY+(M.scrollTop||L.scrollTop)-(M.clientTop||0))}function w(L){J.extend(L);L.preventDefault();L.stopPropagation();L.stopped=true}J.Methods={isLeftClick:C,isMiddleClick:A,isRightClick:t,element:f,findElement:v,pointer:z,pointerX:e,pointerY:d,stop:w};var E=Object.keys(J.Methods).inject({},function(L,M){L[M]=J.Methods[M].methodize();return L});if(window.attachEvent){function o(M){var L;switch(M.type){case"mouseover":case"mouseenter":L=M.fromElement;break;case"mouseout":case"mouseleave":L=M.toElement;break;default:return null}return Element.extend(L)}var B={stopPropagation:function(){this.cancelBubble=true},preventDefault:function(){this.returnValue=false},inspect:function(){return"[object Event]"}};J.extend=function(M,L){if(!M){return false}if(!b(M)){return M}if(M._extendedByPrototype){return M}M._extendedByPrototype=Prototype.emptyFunction;var N=J.pointer(M);Object.extend(M,{target:M.srcElement||L,relatedTarget:o(M),pageX:N.x,pageY:N.y});Object.extend(M,E);Object.extend(M,B);return M}}else{J.extend=Prototype.K}if(window.addEventListener){J.prototype=window.Event.prototype||document.createEvent("HTMLEvents").__proto__;Object.extend(J.prototype,E)}function s(P,O,Q){var N=Element.retrieve(P,"prototype_event_registry");if(Object.isUndefined(N)){g.push(P);N=Element.retrieve(P,"prototype_event_registry",$H())}var L=N.get(O);if(Object.isUndefined(L)){L=[];N.set(O,L)}if(L.pluck("handler").include(Q)){return false}var M;if(O.include(":")){M=function(R){if(Object.isUndefined(R.eventName)){return false}if(R.eventName!==O){return false}J.extend(R,P);Q.call(P,R)}}else{if(!K&&(O==="mouseenter"||O==="mouseleave")){if(O==="mouseenter"||O==="mouseleave"){M=function(S){J.extend(S,P);var R=S.relatedTarget;while(R&&R!==P){try{R=R.parentNode}catch(T){R=P}}if(R===P){return}Q.call(P,S)}}}else{M=function(R){J.extend(R,P);Q.call(P,R)}}}M.handler=Q;L.push(M);return M}function n(){for(var L=0,M=g.length;L<M;L++){J.stopObserving(g[L]);g[L]=null}}var g=[];if(Prototype.Browser.IE){window.attachEvent("onunload",n)}if(Prototype.Browser.WebKit){window.addEventListener("unload",Prototype.emptyFunction,false)}var r=Prototype.K,l={mouseenter:"mouseover",mouseleave:"mouseout"};if(!K){r=function(L){return(l[L]||L)}}function D(O,N,P){O=$(O);var M=s(O,N,P);if(!M){return O}if(N.include(":")){if(O.addEventListener){O.addEventListener("dataavailable",M,false)}else{O.attachEvent("ondataavailable",M);O.attachEvent("onlosecapture",M)}}else{var L=r(N);if(O.addEventListener){O.addEventListener(L,M,false)}else{O.attachEvent("on"+L,M)}}return O}function q(R,O,S){R=$(R);var N=Element.retrieve(R,"prototype_event_registry");if(!N){return R}if(!O){N.each(function(U){var T=U.key;q(R,T)});return R}var P=N.get(O);if(!P){return R}if(!S){P.each(function(T){q(R,O,T.handler)});return R}var Q=P.length,M;while(Q--){if(P[Q].handler===S){M=P[Q];break}}if(!M){return R}if(O.include(":")){if(R.removeEventListener){R.removeEventListener("dataavailable",M,false)}else{R.detachEvent("ondataavailable",M);R.detachEvent("onlosecapture",M)}}else{var L=r(O);if(R.removeEventListener){R.removeEventListener(L,M,false)}else{R.detachEvent("on"+L,M)}}N.set(O,P.without(M));return R}function G(O,N,M,L){O=$(O);if(Object.isUndefined(L)){L=true}if(O==document&&document.createEvent&&!O.dispatchEvent){O=document.documentElement}var P;if(document.createEvent){P=document.createEvent("HTMLEvents");P.initEvent("dataavailable",L,true)}else{P=document.createEventObject();P.eventType=L?"ondataavailable":"onlosecapture"}P.eventName=N;P.memo=M||{};if(document.createEvent){O.dispatchEvent(P)}else{O.fireEvent(P.eventType,P)}return J.extend(P)}J.Handler=Class.create({initialize:function(N,M,L,O){this.element=$(N);this.eventName=M;this.selector=L;this.callback=O;this.handler=this.handleEvent.bind(this)},start:function(){J.observe(this.element,this.eventName,this.handler);return this},stop:function(){J.stopObserving(this.element,this.eventName,this.handler);return this},handleEvent:function(M){var L=J.findElement(M,this.selector);if(L){this.callback.call(this.element,M,L)}}});function p(N,M,L,O){N=$(N);if(Object.isFunction(L)&&Object.isUndefined(O)){O=L,L=null}return new J.Handler(N,M,L,O).start()}Object.extend(J,J.Methods);Object.extend(J,{fire:G,observe:D,stopObserving:q,on:p});Element.addMethods({fire:G,observe:D,stopObserving:q,on:p});Object.extend(document,{fire:G.methodize(),observe:D.methodize(),stopObserving:q.methodize(),on:p.methodize(),loaded:false});if(window.Event){Object.extend(window.Event,J)}else{window.Event=J}})();(function(){var e;function b(){if(document.loaded){return}if(e){window.clearTimeout(e)}document.loaded=true;document.fire("dom:loaded")}function d(){if(document.readyState==="complete"){document.stopObserving("readystatechange",d);b()}}if(document.addEventListener){document.addEventListener("DOMContentLoaded",b,false)}else{document.observe("readystatechange",d);if(window==top){var e=window.setInterval(function(){try{document.documentElement.doScroll("left")}catch(f){return}window.clearInterval(e);b()},5)}}Event.observe(window,"load",b)})();Element.addMethods();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(b,d){return Element.insert(b,{before:d})},Top:function(b,d){return Element.insert(b,{top:d})},Bottom:function(b,d){return Element.insert(b,{bottom:d})},After:function(b,d){return Element.insert(b,{after:d})}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(d,b,e){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(d,b,e)}this.xcomp=b;this.ycomp=e;this.offset=Element.cumulativeOffset(d);return(e>=this.offset[1]&&e<this.offset[1]+d.offsetHeight&&b>=this.offset[0]&&b<this.offset[0]+d.offsetWidth)},withinIncludingScrolloffsets:function(d,b,f){var e=Element.cumulativeScrollOffset(d);this.xcomp=b+e[0]-this.deltaX;this.ycomp=f+e[1]-this.deltaY;this.offset=Element.cumulativeOffset(d);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+d.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+d.offsetWidth)},overlap:function(d,b){if(!d){return 0}if(d=="vertical"){return((this.offset[1]+b.offsetHeight)-this.ycomp)/b.offsetHeight}if(d=="horizontal"){return((this.offset[0]+b.offsetWidth)-this.xcomp)/b.offsetWidth}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(b){Position.prepare();return Element.absolutize(b)},relativize:function(b){Position.prepare();return Element.relativize(b)},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(d,e,b){b=b||{};return Element.clonePosition(e,d,b)}};if(!document.getElementsByClassName){document.getElementsByClassName=function(d){function b(e){return e.blank()?null:"[contains(concat(' ', @class, ' '), ' "+e+" ')]"}d.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(e,g){g=g.toString().strip();var f=/\s/.test(g)?$w(g).map(b).join(""):b(g);return f?document._getElementsByXPath(".//*"+f,e):[]}:function(g,h){h=h.toString().strip();var l=[],n=(/\s/.test(h)?$w(h):null);if(!n&&!h){return l}var e=$(g).getElementsByTagName("*");h=" "+h+" ";for(var f=0,p,o;p=e[f];f++){if(p.className&&(o=" "+p.className+" ")&&(o.include(h)||(n&&n.all(function(q){return !q.toString().blank()&&o.include(" "+q+" ")})))){l.push(Element.extend(p))}}return l};return function(f,e){return $(e||document.body).getElementsByClassName(f)}}(Element.Methods)}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(b){this.element=$(b)},_each:function(b){this.element.className.split(/\s+/).select(function(d){return d.length>0})._each(b)},set:function(b){this.element.className=b},add:function(b){if(this.include(b)){return}this.set($A(this).concat(b).join(" "))},remove:function(b){if(!this.include(b)){return}this.set($A(this).without(b).join(" "))},toString:function(){return $A(this).join(" ")}};Object.extend(Element.ClassNames.prototype,Enumerable);(function(){window.Selector=Class.create({initialize:function(b){this.expression=b.strip()},findElements:function(b){return Prototype.Selector.select(this.expression,b)},match:function(b){return Prototype.Selector.match(b,this.expression)},toString:function(){return this.expression},inspect:function(){return"#<Selector: "+this.expression+">"}});Object.extend(Selector,{matchElements:function(h,l){var b=Prototype.Selector.match,f=[];for(var e=0,g=h.length;e<g;e++){var d=h[e];if(b(d,l)){f.push(Element.extend(d))}}return f},findElement:function(h,l,d){d=d||0;var b=0,f;for(var e=0,g=h.length;e<g;e++){f=h[e];if(Prototype.Selector.match(f,l)&&d===b++){return Element.extend(f)}}},findChildElements:function(d,e){var b=e.toArray().join(", ");return Prototype.Selector.select(b,d||document)}})})();var Window=Class.create();Window.keepMultiModalWindow=false;Window.hasEffectLib=(typeof Effect!="undefined");Window.resizeEffectDuration=0.4;Window.prototype={initialize:function(){var e;var d=0;if(arguments.length>0){if(typeof arguments[0]=="string"){e=arguments[0];d=1}else{e=arguments[0]?arguments[0].id:null}}if(!e){e="window_"+new Date().getTime()}if($(e)){alert("Window "+e+" is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor")}this.options=Object.extend({className:"dialog",windowClassName:null,blurClassName:null,minWidth:100,minHeight:20,resizable:true,closable:true,minimizable:true,maximizable:true,draggable:true,userData:null,showEffect:(Window.hasEffectLib?Effect.Appear:Element.show),hideEffect:(Window.hasEffectLib?Effect.Fade:Element.hide),showEffectOptions:{},hideEffectOptions:{},effectOptions:null,parent:document.body,title:" ",url:null,onload:Prototype.emptyFunction,width:200,height:300,opacity:1,recenterAuto:true,wiredDrag:false,closeOnEsc:true,closeCallback:null,destroyOnClose:false,gridX:1,gridY:1},arguments[d]||{});if(this.options.blurClassName){this.options.focusClassName=this.options.className}if(typeof this.options.top=="undefined"&&typeof this.options.bottom=="undefined"){this.options.top=this._round(Math.random()*500,this.options.gridY)}if(typeof this.options.left=="undefined"&&typeof this.options.right=="undefined"){this.options.left=this._round(Math.random()*500,this.options.gridX)}if(this.options.effectOptions){Object.extend(this.options.hideEffectOptions,this.options.effectOptions);Object.extend(this.options.showEffectOptions,this.options.effectOptions);if(this.options.showEffect==Element.Appear){this.options.showEffectOptions.to=this.options.opacity}}if(Window.hasEffectLib){if(this.options.showEffect==Effect.Appear){this.options.showEffectOptions.to=this.options.opacity}if(this.options.hideEffect==Effect.Fade){this.options.hideEffectOptions.from=this.options.opacity}}if(this.options.hideEffect==Element.hide){this.options.hideEffect=function(){Element.hide(this.element);if(this.options.destroyOnClose){this.destroy()}}.bind(this)}if(this.options.parent!=document.body){this.options.parent=$(this.options.parent)}this.element=this._createWindow(e);this.element.win=this;this.eventMouseDown=this._initDrag.bindAsEventListener(this);this.eventMouseUp=this._endDrag.bindAsEventListener(this);this.eventMouseMove=this._updateDrag.bindAsEventListener(this);this.eventOnLoad=this._getWindowBorderSize.bindAsEventListener(this);this.eventMouseDownContent=this.toFront.bindAsEventListener(this);this.eventResize=this._recenter.bindAsEventListener(this);this.eventKeyUp=this._keyUp.bindAsEventListener(this);this.topbar=$(this.element.id+"_top");this.bottombar=$(this.element.id+"_bottom");this.content=$(this.element.id+"_content");Event.observe(this.topbar,"mousedown",this.eventMouseDown);Event.observe(this.bottombar,"mousedown",this.eventMouseDown);Event.observe(this.content,"mousedown",this.eventMouseDownContent);Event.observe(window,"load",this.eventOnLoad);Event.observe(window,"resize",this.eventResize);Event.observe(window,"scroll",this.eventResize);Event.observe(document,"keyup",this.eventKeyUp);Event.observe(this.options.parent,"scroll",this.eventResize);if(this.options.draggable){var b=this;[this.topbar,this.topbar.up().previous(),this.topbar.up().next()].each(function(f){f.observe("mousedown",b.eventMouseDown);f.addClassName("top_draggable")});[this.bottombar.up(),this.bottombar.up().previous(),this.bottombar.up().next()].each(function(f){f.observe("mousedown",b.eventMouseDown);f.addClassName("bottom_draggable")})}if(this.options.resizable){this.sizer=$(this.element.id+"_sizer");Event.observe(this.sizer,"mousedown",this.eventMouseDown)}this.useLeft=null;this.useTop=null;if(typeof this.options.left!="undefined"){this.element.setStyle({left:parseFloat(this.options.left)+"px"});this.useLeft=true}else{this.element.setStyle({right:parseFloat(this.options.right)+"px"});this.useLeft=false}if(typeof this.options.top!="undefined"){this.element.setStyle({top:parseFloat(this.options.top)+"px"});this.useTop=true}else{this.element.setStyle({bottom:parseFloat(this.options.bottom)+"px"});this.useTop=false}this.storedLocation=null;this.setOpacity(this.options.opacity);if(this.options.zIndex){this.setZIndex(this.options.zIndex)}else{this.setZIndex(this.getMaxZIndex())}if(this.options.destroyOnClose){this.setDestroyOnClose(true)}this._getWindowBorderSize();this.width=this.options.width;this.height=this.options.height;this.visible=false;this.constraint=false;this.constraintPad={top:0,left:0,bottom:0,right:0};if(this.width&&this.height){this.setSize(this.options.width,this.options.height)}this.setTitle(this.options.title);Windows.register(this)},getMaxZIndex:function(){var b=0,d;var g=document.body.childNodes;for(d=0;d<g.length;d++){var e=g[d];var f=e.nodeType==1?parseInt(e.style.zIndex,10)||0:0;if(f<10000){b=Math.max(b,f)}}return b+10},destroy:function(){this._notify("onDestroy");Event.stopObserving(this.topbar,"mousedown",this.eventMouseDown);Event.stopObserving(this.bottombar,"mousedown",this.eventMouseDown);Event.stopObserving(this.content,"mousedown",this.eventMouseDownContent);Event.stopObserving(window,"load",this.eventOnLoad);Event.stopObserving(window,"resize",this.eventResize);Event.stopObserving(window,"scroll",this.eventResize);Event.stopObserving(this.content,"load",this.options.onload);Event.stopObserving(document,"keyup",this.eventKeyUp);if(this._oldParent){var e=this.getContent();var b=null;for(var d=0;d<e.childNodes.length;d++){b=e.childNodes[d];if(b.nodeType==1){break}b=null}if(b){this._oldParent.appendChild(b)}this._oldParent=null}if(this.sizer){Event.stopObserving(this.sizer,"mousedown",this.eventMouseDown)}if(this.options.url){this.content.src=null}if(this.iefix){Element.remove(this.iefix)}Element.remove(this.element);Windows.unregister(this)},setCloseCallback:function(b){this.options.closeCallback=b},getContent:function(){return this.content},setContent:function(n,l,e){var b=$(n);if(null==b){throw"Unable to find element '"+n+"' in DOM"}this._oldParent=b.parentNode;var h=null;var g=null;if(l){h=Element.getDimensions(b)}if(e){g=Position.cumulativeOffset(b)}var f=this.getContent();this.setHTMLContent("");f=this.getContent();f.appendChild(b);b.show();if(l){this.setSize(h.width,h.height)}if(e){this.setLocation(g[1]-this.heightN,g[0]-this.widthW)}},setHTMLContent:function(b){if(this.options.url){this.content.src=null;this.options.url=null;var d='<div id="'+this.getId()+'_content" class="'+this.options.className+'_content"> </div>';$(this.getId()+"_table_content").innerHTML=d;this.content=$(this.element.id+"_content")}this.getContent().innerHTML=b},setAjaxContent:function(d,b,f,e){this.showFunction=f?"showCenter":"show";this.showModal=e||false;b=b||{};this.setHTMLContent("");this.onComplete=b.onComplete;if(!this._onCompleteHandler){this._onCompleteHandler=this._setAjaxContent.bind(this)}b.onComplete=this._onCompleteHandler;new Ajax.Request(d,b);b.onComplete=this.onComplete},_setAjaxContent:function(b){Element.update(this.getContent(),b.responseText);if(this.onComplete){this.onComplete(b)}this.onComplete=null;this[this.showFunction](this.showModal)},setURL:function(b){if(this.options.url){this.content.src=null}this.options.url=b;var d="<iframe frameborder='0' name='"+this.getId()+"_content' id='"+this.getId()+"_content' src='"+b+"' width='"+this.width+"' height='"+this.height+"'> </iframe>";$(this.getId()+"_table_content").innerHTML=d;this.content=$(this.element.id+"_content")},getURL:function(){return this.options.url?this.options.url:null},refresh:function(){if(this.options.url){$(this.element.getAttribute("id")+"_content").src=this.options.url}},setCookie:function(d,e,t,g,b){d=d||this.element.id;this.cookie=[d,e,t,g,b];var r=WindowUtilities.getCookie(d);if(r){var s=r.split(",");var p=s[0].split(":");var o=s[1].split(":");var q=parseFloat(s[2]),l=parseFloat(s[3]);var n=s[4];var f=s[5];this.setSize(q,l);if(n=="true"){this.doMinimize=true}else{if(f=="true"){this.doMaximize=true}}this.useLeft=p[0]=="l";this.useTop=o[0]=="t";this.element.setStyle(this.useLeft?{left:p[1]}:{right:p[1]});this.element.setStyle(this.useTop?{top:o[1]}:{bottom:o[1]})}},getId:function(){return this.element.id},setDestroyOnClose:function(){this.options.destroyOnClose=true},setConstraint:function(b,d){this.constraint=b;this.constraintPad=Object.extend(this.constraintPad,d||{});if(this.useTop&&this.useLeft){this.setLocation(parseFloat(this.element.style.top),parseFloat(this.element.style.left))}},_initDrag:function(d){if(Event.element(d)==this.sizer&&this.isMinimized()){return}if(Event.element(d)!=this.sizer&&this.isMaximized()){return}if(Prototype.Browser.IE&&this.heightN==0){this._getWindowBorderSize()}this.pointer=[this._round(Event.pointerX(d),this.options.gridX),this._round(Event.pointerY(d),this.options.gridY)];if(this.options.wiredDrag){this.currentDrag=this._createWiredElement()}else{this.currentDrag=this.element}if(Event.element(d)==this.sizer){this.doResize=true;this.widthOrg=this.width;this.heightOrg=this.height;this.bottomOrg=parseFloat(this.element.getStyle("bottom"));this.rightOrg=parseFloat(this.element.getStyle("right"));this._notify("onStartResize")}else{this.doResize=false;var b=$(this.getId()+"_close");if(b&&Position.within(b,this.pointer[0],this.pointer[1])){this.currentDrag=null;return}this.toFront();if(!this.options.draggable){return}this._notify("onStartMove")}Event.observe(document,"mouseup",this.eventMouseUp,false);Event.observe(document,"mousemove",this.eventMouseMove,false);WindowUtilities.disableScreen("__invisible__","__invisible__",this.overlayOpacity);document.body.ondrag=function(){return false};document.body.onselectstart=function(){return false};this.currentDrag.show();Event.stop(d)},_round:function(d,b){return b==1?d:d=Math.floor(d/b)*b},_updateDrag:function(d){var b=[this._round(Event.pointerX(d),this.options.gridX),this._round(Event.pointerY(d),this.options.gridY)];var q=b[0]-this.pointer[0];var p=b[1]-this.pointer[1];if(this.doResize){var o=this.widthOrg+q;var f=this.heightOrg+p;q=this.width-this.widthOrg;p=this.height-this.heightOrg;if(this.useLeft){o=this._updateWidthConstraint(o)}else{this.currentDrag.setStyle({right:(this.rightOrg-q)+"px"})}if(this.useTop){f=this._updateHeightConstraint(f)}else{this.currentDrag.setStyle({bottom:(this.bottomOrg-p)+"px"})}this.setSize(o,f);this._notify("onResize")}else{this.pointer=b;if(this.useLeft){var e=parseFloat(this.currentDrag.getStyle("left"))+q;var n=this._updateLeftConstraint(e);this.pointer[0]+=n-e;this.currentDrag.setStyle({left:n+"px"})}else{this.currentDrag.setStyle({right:parseFloat(this.currentDrag.getStyle("right"))-q+"px"})}if(this.useTop){var l=parseFloat(this.currentDrag.getStyle("top"))+p;var g=this._updateTopConstraint(l);this.pointer[1]+=g-l;this.currentDrag.setStyle({top:g+"px"})}else{this.currentDrag.setStyle({bottom:parseFloat(this.currentDrag.getStyle("bottom"))-p+"px"})}this._notify("onMove")}if(this.iefix){this._fixIEOverlapping()}this._removeStoreLocation();Event.stop(d)},_endDrag:function(b){WindowUtilities.enableScreen("__invisible__");if(this.doResize){this._notify("onEndResize")}else{this._notify("onEndMove")}Event.stopObserving(document,"mouseup",this.eventMouseUp,false);Event.stopObserving(document,"mousemove",this.eventMouseMove,false);Event.stop(b);this._hideWiredElement();this._saveCookie();document.body.ondrag=null;document.body.onselectstart=null},_updateLeftConstraint:function(d){if(this.constraint&&this.useLeft&&this.useTop){var b=this.options.parent==document.body?WindowUtilities.getPageSize().windowWidth:this.options.parent.getDimensions().width;if(d<this.constraintPad.left){d=this.constraintPad.left}if(d+this.width+this.widthE+this.widthW>b-this.constraintPad.right){d=b-this.constraintPad.right-this.width-this.widthE-this.widthW}}return d},_updateTopConstraint:function(e){if(this.constraint&&this.useLeft&&this.useTop){var b=this.options.parent==document.body?WindowUtilities.getPageSize().windowHeight:this.options.parent.getDimensions().height;var d=this.height+this.heightN+this.heightS;if(e<this.constraintPad.top){e=this.constraintPad.top}if(e+d>b-this.constraintPad.bottom){e=b-this.constraintPad.bottom-d}}return e},_updateWidthConstraint:function(b){if(this.constraint&&this.useLeft&&this.useTop){var d=this.options.parent==document.body?WindowUtilities.getPageSize().windowWidth:this.options.parent.getDimensions().width;var e=parseFloat(this.element.getStyle("left"));if(e+b+this.widthE+this.widthW>d-this.constraintPad.right){b=d-this.constraintPad.right-e-this.widthE-this.widthW}}return b},_updateHeightConstraint:function(d){if(this.constraint&&this.useLeft&&this.useTop){var b=this.options.parent==document.body?WindowUtilities.getPageSize().windowHeight:this.options.parent.getDimensions().height;var e=parseFloat(this.element.getStyle("top"));if(e+d+this.heightN+this.heightS>b-this.constraintPad.bottom){d=b-this.constraintPad.bottom-e-this.heightN-this.heightS}}return d},_createWindow:function(b){var h=this.options.className;var f=document.createElement("div");f.setAttribute("id",b);f.className="dialog";if(this.options.windowClassName){f.className+=" "+this.options.windowClassName}var g;if(this.options.url){g='<iframe frameborder="0" name="'+b+'_content" id="'+b+'_content" src="'+this.options.url+'"> </iframe>'}else{g='<div id="'+b+'_content" class="'+h+'_content"> </div>'}var l=this.options.closable?"<div class='"+h+"_close' id='"+b+"_close' onclick='Windows.close(\""+b+"\", event)'> </div>":"";var n=this.options.minimizable?"<div class='"+h+"_minimize' id='"+b+"_minimize' onclick='Windows.minimize(\""+b+"\", event)'> </div>":"";var o=this.options.maximizable?"<div class='"+h+"_maximize' id='"+b+"_maximize' onclick='Windows.maximize(\""+b+"\", event)'> </div>":"";var e=this.options.resizable?"class='"+h+"_sizer' id='"+b+"_sizer'":"class='"+h+"_se'";var d="../themes/default/blank.gif";f.innerHTML=l+n+o+" <a href='#' id='"+b+"_focus_anchor'><!-- --></a> <table id='"+b+"_row1' class=\"top table_window\"> <tr> <td class='"+h+"_nw'></td> <td class='"+h+"_n'><div id='"+b+"_top' class='"+h+"_title title_window'>"+this.options.title+"</div></td> <td class='"+h+"_ne'></td> </tr> </table> <table id='"+b+"_row2' class=\"mid table_window\"> <tr> <td class='"+h+"_w'></td> <td id='"+b+"_table_content' class='"+h+"_content' valign='top'>"+g+"</td> <td class='"+h+"_e'></td> </tr> </table> <table id='"+b+"_row3' class=\"bot table_window\"> <tr> <td class='"+h+"_sw'></td> <td class='"+h+"_s'><div id='"+b+"_bottom' class='status_bar'><span style='float:left; width:1px; height:1px'></span></div></td> <td "+e+"></td> </tr> </table> ";Element.hide(f);this.options.parent.insertBefore(f,this.options.parent.firstChild);Event.observe($(b+"_content"),"load",this.options.onload);return f},changeClassName:function(b){var d=this.options.className;var e=this.getId();$A(["_close","_minimize","_maximize","_sizer","_content"]).each(function(f){this._toggleClassName($(e+f),d+f,b+f)}.bind(this));this._toggleClassName($(e+"_top"),d+"_title",b+"_title");$$("#"+e+" td").each(function(f){f.className=f.className.sub(d,b)});this.options.className=b},_toggleClassName:function(e,d,b){if(e){e.removeClassName(d);e.addClassName(b)}},setLocation:function(f,d){f=this._updateTopConstraint(f);d=this._updateLeftConstraint(d);var b=this.currentDrag||this.element;b.setStyle({top:f+"px"});b.setStyle({left:d+"px"});this.useLeft=true;this.useTop=true},getLocation:function(){var b={};if(this.useTop){b=Object.extend(b,{top:this.element.getStyle("top")})}else{b=Object.extend(b,{bottom:this.element.getStyle("bottom")})}if(this.useLeft){b=Object.extend(b,{left:this.element.getStyle("left")})}else{b=Object.extend(b,{right:this.element.getStyle("right")})}return b},getSize:function(){return{width:this.width,height:this.height}},setSize:function(f,d,b){f=parseFloat(f);d=parseFloat(d);if(!this.minimized&&f<this.options.minWidth){f=this.options.minWidth}if(!this.minimized&&d<this.options.minHeight){d=this.options.minHeight}if(this.options.maxHeight&&d>this.options.maxHeight){d=this.options.maxHeight}if(this.options.maxWidth&&f>this.options.maxWidth){f=this.options.maxWidth}if(this.useTop&&this.useLeft&&Window.hasEffectLib&&Effect.ResizeWindow&&b){new Effect.ResizeWindow(this,null,null,f,d,{duration:Window.resizeEffectDuration})}else{this.width=f;this.height=d;var h=this.currentDrag?this.currentDrag:this.element;h.setStyle({width:f+this.widthW+this.widthE+"px"});h.setStyle({height:d+this.heightN+this.heightS+"px"});if(!this.currentDrag||this.currentDrag==this.element){var g=$(this.element.id+"_content");g.setStyle({height:d+"px"});g.setStyle({width:f+"px"})}}},updateHeight:function(){this.setSize(this.width,this.content.scrollHeight,true)},updateWidth:function(){this.setSize(this.content.scrollWidth,this.height,true)},toFront:function(){if(this.element.style.zIndex<Windows.maxZIndex){this.setZIndex(Windows.maxZIndex+1)}if(this.iefix){this._fixIEOverlapping()}},getBounds:function(d){if(!this.width||!this.height||!this.visible){this.computeBounds()}var b=this.width;var e=this.height;if(!d){b+=this.widthW+this.widthE;e+=this.heightN+this.heightS}var f=Object.extend(this.getLocation(),{width:b+"px",height:e+"px"});return f},computeBounds:function(){if(!this.width||!this.height){var b=WindowUtilities._computeSize(this.content.innerHTML,this.content.id,this.width,this.height,0,this.options.className);if(this.height){this.width=b+5}else{this.height=b+5}}this.setSize(this.width,this.height);if(this.centered){this._center(this.centerTop,this.centerLeft)}},show:function(d){this.visible=true;if(d){if(typeof this.overlayOpacity=="undefined"){var b=this;setTimeout(function(){b.show(d)},10);return}Windows.addModalWindow(this);this.modal=true;this.setZIndex(Windows.maxZIndex+1);Windows.unsetOverflow(this)}else{if(!this.element.style.zIndex){this.setZIndex(Windows.maxZIndex+1)}}if(this.oldStyle){this.getContent().setStyle({overflow:this.oldStyle})}this.computeBounds();this._notify("onBeforeShow");if(this.options.showEffect!=Element.show&&this.options.showEffectOptions){this.options.showEffect(this.element,this.options.showEffectOptions)}else{this.options.showEffect(this.element)}this._checkIEOverlapping();WindowUtilities.focusedWindow=this;this._notify("onShow");$(this.element.id+"_focus_anchor").focus()},showCenter:function(b,e,d){this.centered=true;this.centerTop=e;this.centerLeft=d;this.show(b)},isVisible:function(){return this.visible},_center:function(e,d){var f=WindowUtilities.getWindowScroll(this.options.parent);var b=WindowUtilities.getPageSize(this.options.parent);if(typeof e=="undefined"){e=(b.windowHeight-(this.height+this.heightN+this.heightS))/2}e+=f.top;if(typeof d=="undefined"){d=(b.windowWidth-(this.width+this.widthW+this.widthE))/2}d+=f.left;this.setLocation(e,d);this.toFront()},_recenter:function(d){if(this.centered){var b=WindowUtilities.getPageSize(this.options.parent);var e=WindowUtilities.getWindowScroll(this.options.parent);if(this.pageSize&&this.pageSize.windowWidth==b.windowWidth&&this.pageSize.windowHeight==b.windowHeight&&this.windowScroll.left==e.left&&this.windowScroll.top==e.top){return}this.pageSize=b;this.windowScroll=e;if($("overlay_modal")){$("overlay_modal").setStyle({height:(b.pageHeight+"px")})}if(this.options.recenterAuto){this._center(this.centerTop,this.centerLeft)}}},hide:function(){this.visible=false;if(this.modal){Windows.removeModalWindow(this);Windows.resetOverflow()}this.oldStyle=this.getContent().getStyle("overflow")||"auto";this.getContent().setStyle({overflow:"hidden"});this.options.hideEffect(this.element,this.options.hideEffectOptions);if(this.iefix){this.iefix.hide()}if(!this.doNotNotifyHide){this._notify("onHide")}},close:function(){if(this.visible){if(this.options.closeCallback&&!this.options.closeCallback(this)){return}if(this.options.destroyOnClose){var b=this.destroy.bind(this);if(this.options.hideEffectOptions.afterFinish){var d=this.options.hideEffectOptions.afterFinish;this.options.hideEffectOptions.afterFinish=function(){d();b()}}else{this.options.hideEffectOptions.afterFinish=function(){b()}}}Windows.updateFocusedWindow();this.doNotNotifyHide=true;this.hide();this.doNotNotifyHide=false;this._notify("onClose")}},minimize:function(){if(this.resizing){return}var b=$(this.getId()+"_row2");if(!this.minimized){this.minimized=true;var f=b.getDimensions().height;this.r2Height=f;var e=this.element.getHeight()-f;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,null,null,null,this.height-f,{duration:Window.resizeEffectDuration})}else{this.height-=f;this.element.setStyle({height:e+"px"});b.hide()}if(!this.useTop){var d=parseFloat(this.element.getStyle("bottom"));this.element.setStyle({bottom:(d+f)+"px"})}}else{this.minimized=false;var f=this.r2Height;this.r2Height=null;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,null,null,null,this.height+f,{duration:Window.resizeEffectDuration})}else{var e=this.element.getHeight()+f;this.height+=f;this.element.setStyle({height:e+"px"});b.show()}if(!this.useTop){var d=parseFloat(this.element.getStyle("bottom"));this.element.setStyle({bottom:(d-f)+"px"})}this.toFront()}this._notify("onMinimize");this._saveCookie()},maximize:function(){if(this.isMinimized()||this.resizing){return}if(Prototype.Browser.IE&&this.heightN==0){this._getWindowBorderSize()}if(this.storedLocation!=null){this._restoreLocation();if(this.iefix){this.iefix.hide()}}else{this._storeLocation();Windows.unsetOverflow(this);var l=WindowUtilities.getWindowScroll(this.options.parent);var d=WindowUtilities.getPageSize(this.options.parent);var h=l.left;var g=l.top;if(this.options.parent!=document.body){l={top:0,left:0,bottom:0,right:0};var f=this.options.parent.getDimensions();d.windowWidth=f.width;d.windowHeight=f.height;g=0;h=0}if(this.constraint){d.windowWidth-=Math.max(0,this.constraintPad.left)+Math.max(0,this.constraintPad.right);d.windowHeight-=Math.max(0,this.constraintPad.top)+Math.max(0,this.constraintPad.bottom);h+=Math.max(0,this.constraintPad.left);g+=Math.max(0,this.constraintPad.top)}var e=d.windowWidth-this.widthW-this.widthE;var b=d.windowHeight-this.heightN-this.heightS;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,g,h,e,b,{duration:Window.resizeEffectDuration})}else{this.setSize(e,b);this.element.setStyle(this.useLeft?{left:h}:{right:h});this.element.setStyle(this.useTop?{top:g}:{bottom:g})}this.toFront();if(this.iefix){this._fixIEOverlapping()}}this._notify("onMaximize");this._saveCookie()},isMinimized:function(){return this.minimized},isMaximized:function(){return(this.storedLocation!=null)},setOpacity:function(b){if(Element.setOpacity){Element.setOpacity(this.element,b)}},setZIndex:function(b){this.element.setStyle({zIndex:b});Windows.updateZindex(b,this)},setTitle:function(b){if(!b||b==""){b=" "}Element.update(this.element.id+"_top",b)},getTitle:function(){return $(this.element.id+"_top").innerHTML},setStatusBar:function(d){var b=$(this.getId()+"_bottom");if(typeof(d)=="object"){if(this.bottombar.firstChild){this.bottombar.replaceChild(d,this.bottombar.firstChild)}else{this.bottombar.appendChild(d)}}else{this.bottombar.innerHTML=d}},_checkIEOverlapping:function(){if(!this.iefix&&(navigator.appVersion.indexOf("MSIE")>0)&&(navigator.userAgent.indexOf("Opera")<0)&&(this.element.getStyle("position")=="absolute")){new Insertion.After(this.element.id,'<iframe id="'+this.element.id+'_iefix" style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix=$(this.element.id+"_iefix")}if(this.iefix){setTimeout(this._fixIEOverlapping.bind(this),50)}},_fixIEOverlapping:function(){Position.clone(this.element,this.iefix);this.iefix.style.zIndex=this.element.style.zIndex-1;this.iefix.show()},_keyUp:function(b){if(27==b.keyCode&&this.options.closeOnEsc){this.close()}},_getWindowBorderSize:function(d){var e=this._createHiddenDiv(this.options.className+"_n");this.heightN=Element.getDimensions(e).height;e.parentNode.removeChild(e);var e=this._createHiddenDiv(this.options.className+"_s");this.heightS=Element.getDimensions(e).height;e.parentNode.removeChild(e);var e=this._createHiddenDiv(this.options.className+"_e");this.widthE=Element.getDimensions(e).width;e.parentNode.removeChild(e);var e=this._createHiddenDiv(this.options.className+"_w");this.widthW=Element.getDimensions(e).width;e.parentNode.removeChild(e);var e=document.createElement("div");e.className="overlay_"+this.options.className;document.body.appendChild(e);var b=this;setTimeout(function(){b.overlayOpacity=($(e).getStyle("opacity"));e.parentNode.removeChild(e)},10);if(Prototype.Browser.IE){this.heightS=$(this.getId()+"_row3").getDimensions().height;this.heightN=$(this.getId()+"_row1").getDimensions().height}if(Prototype.Browser.WebKit&&Prototype.Browser.WebKitVersion<420){this.setSize(this.width,this.height)}if(this.doMaximize){this.maximize()}if(this.doMinimize){this.minimize()}},_createHiddenDiv:function(d){var b=document.body;var e=document.createElement("div");e.setAttribute("id",this.element.id+"_tmp");e.className=d;e.style.display="none";e.innerHTML="";b.insertBefore(e,b.firstChild);return e},_storeLocation:function(){if(this.storedLocation==null){this.storedLocation={useTop:this.useTop,useLeft:this.useLeft,top:this.element.getStyle("top"),bottom:this.element.getStyle("bottom"),left:this.element.getStyle("left"),right:this.element.getStyle("right"),width:this.width,height:this.height}}},_restoreLocation:function(){if(this.storedLocation!=null){this.useLeft=this.storedLocation.useLeft;this.useTop=this.storedLocation.useTop;if(this.useLeft&&this.useTop&&Window.hasEffectLib&&Effect.ResizeWindow){new Effect.ResizeWindow(this,this.storedLocation.top,this.storedLocation.left,this.storedLocation.width,this.storedLocation.height,{duration:Window.resizeEffectDuration})}else{this.element.setStyle(this.useLeft?{left:this.storedLocation.left}:{right:this.storedLocation.right});this.element.setStyle(this.useTop?{top:this.storedLocation.top}:{bottom:this.storedLocation.bottom});this.setSize(this.storedLocation.width,this.storedLocation.height)}Windows.resetOverflow();this._removeStoreLocation()}},_removeStoreLocation:function(){this.storedLocation=null},_saveCookie:function(){if(this.cookie){var b="";if(this.useLeft){b+="l:"+(this.storedLocation?this.storedLocation.left:this.element.getStyle("left"))}else{b+="r:"+(this.storedLocation?this.storedLocation.right:this.element.getStyle("right"))}if(this.useTop){b+=",t:"+(this.storedLocation?this.storedLocation.top:this.element.getStyle("top"))}else{b+=",b:"+(this.storedLocation?this.storedLocation.bottom:this.element.getStyle("bottom"))}b+=","+(this.storedLocation?this.storedLocation.width:this.width);b+=","+(this.storedLocation?this.storedLocation.height:this.height);b+=","+this.isMinimized();b+=","+this.isMaximized();WindowUtilities.setCookie(b,this.cookie)}},_createWiredElement:function(){if(!this.wiredElement){if(Prototype.Browser.IE){this._getWindowBorderSize()}var d=document.createElement("div");d.className="wired_frame "+this.options.className+"_wired_frame";d.style.position="absolute";this.options.parent.insertBefore(d,this.options.parent.firstChild);this.wiredElement=$(d)}if(this.useLeft){this.wiredElement.setStyle({left:this.element.getStyle("left")})}else{this.wiredElement.setStyle({right:this.element.getStyle("right")})}if(this.useTop){this.wiredElement.setStyle({top:this.element.getStyle("top")})}else{this.wiredElement.setStyle({bottom:this.element.getStyle("bottom")})}var b=this.element.getDimensions();this.wiredElement.setStyle({width:b.width+"px",height:b.height+"px"});this.wiredElement.setStyle({zIndex:Windows.maxZIndex+30});return this.wiredElement},_hideWiredElement:function(){if(!this.wiredElement||!this.currentDrag){return}if(this.currentDrag==this.element){this.currentDrag=null}else{if(this.useLeft){this.element.setStyle({left:this.currentDrag.getStyle("left")})}else{this.element.setStyle({right:this.currentDrag.getStyle("right")})}if(this.useTop){this.element.setStyle({top:this.currentDrag.getStyle("top")})}else{this.element.setStyle({bottom:this.currentDrag.getStyle("bottom")})}this.currentDrag.hide();this.currentDrag=null;if(this.doResize){this.setSize(this.width,this.height)}}},_notify:function(b){if(this.options[b]){this.options[b](this)}else{Windows.notify(b,this)}}};var Windows={windows:[],modalWindows:[],observers:[],focusedWindow:null,maxZIndex:0,overlayShowEffectOptions:{duration:0.5},overlayHideEffectOptions:{duration:0.5},addObserver:function(b){this.removeObserver(b);this.observers.push(b)},removeObserver:function(b){this.observers=this.observers.reject(function(d){return d==b})},notify:function(b,d){this.observers.each(function(e){if(e[b]){e[b](b,d)}})},getWindow:function(b){return this.windows.detect(function(e){return e.getId()==b})},getFocusedWindow:function(){return this.focusedWindow},updateFocusedWindow:function(){this.focusedWindow=this.windows.length>=2?this.windows[this.windows.length-2]:null},register:function(b){this.windows.push(b)},addModalWindow:function(b){if(this.modalWindows.length==0){WindowUtilities.disableScreen(b.options.className,"overlay_modal",b.overlayOpacity,b.getId(),b.options.parent)}else{if(Window.keepMultiModalWindow){$("overlay_modal").style.zIndex=Windows.maxZIndex+1;Windows.maxZIndex+=1;WindowUtilities._hideSelect(this.modalWindows.last().getId())}else{this.modalWindows.last().element.hide()}WindowUtilities._showSelect(b.getId())}this.modalWindows.push(b)},removeModalWindow:function(b){this.modalWindows.pop();if(this.modalWindows.length==0){WindowUtilities.enableScreen()}else{if(Window.keepMultiModalWindow){this.modalWindows.last().toFront();WindowUtilities._showSelect(this.modalWindows.last().getId())}else{this.modalWindows.last().element.show()}}},register:function(b){this.windows.push(b)},unregister:function(b){this.windows=this.windows.reject(function(e){return e==b})},closeAll:function(){this.windows.each(function(b){Windows.close(b.getId())})},closeAllModalWindows:function(){WindowUtilities.enableScreen();this.modalWindows.each(function(b){if(b){b.close()}})},minimize:function(e,b){var d=this.getWindow(e);if(d&&d.visible){d.minimize()}Event.stop(b)},maximize:function(e,b){var d=this.getWindow(e);if(d&&d.visible){d.maximize()}Event.stop(b)},close:function(e,b){var d=this.getWindow(e);if(d){d.close()}if(b){Event.stop(b)}},blur:function(d){var b=this.getWindow(d);if(!b){return}if(b.options.blurClassName){b.changeClassName(b.options.blurClassName)}if(this.focusedWindow==b){this.focusedWindow=null}b._notify("onBlur")},focus:function(d){var b=this.getWindow(d);if(!b){return}if(this.focusedWindow){this.blur(this.focusedWindow.getId())}if(b.options.focusClassName){b.changeClassName(b.options.focusClassName)}this.focusedWindow=b;b._notify("onFocus")},unsetOverflow:function(b){this.windows.each(function(e){e.oldOverflow=e.getContent().getStyle("overflow")||"auto";e.getContent().setStyle({overflow:"hidden"})});if(b&&b.oldOverflow){b.getContent().setStyle({overflow:b.oldOverflow})}},resetOverflow:function(){this.windows.each(function(b){if(b.oldOverflow){b.getContent().setStyle({overflow:b.oldOverflow})}})},updateZindex:function(b,d){if(b>this.maxZIndex){this.maxZIndex=b;if(this.focusedWindow){this.blur(this.focusedWindow.getId())}}this.focusedWindow=d;if(this.focusedWindow){this.focus(this.focusedWindow.getId())}}};var Dialog={dialogId:null,onCompleteFunc:null,callFunc:null,parameters:null,confirm:function(f,e){if(f&&typeof f!="string"){Dialog._runAjaxRequest(f,e,Dialog.confirm);return}f=f||"";e=e||{};var h=e.okLabel?e.okLabel:"Ok";var b=e.cancelLabel?e.cancelLabel:"Cancel";e=Object.extend(e,e.windowParameters||{});e.windowParameters=e.windowParameters||{};e.className=e.className||"alert";var d="class ='"+(e.buttonClass?e.buttonClass+" ":"")+" ok_button'";var g="class ='"+(e.buttonClass?e.buttonClass+" ":"")+" cancel_button'";var f=" <div class='"+e.className+"_message'>"+f+"</div> <div class='"+e.className+"_buttons'> <button type='button' title='"+h+"' onclick='Dialog.okCallback()' "+d+"><span><span><span>"+h+"</span></span></span></button> <button type='button' title='"+b+"' onclick='Dialog.cancelCallback()' "+g+"><span><span><span>"+b+"</span></span></span></button> </div> ";return this._openDialog(f,e)},alert:function(e,d){if(e&&typeof e!="string"){Dialog._runAjaxRequest(e,d,Dialog.alert);return}e=e||"";d=d||{};var f=d.okLabel?d.okLabel:"Ok";d=Object.extend(d,d.windowParameters||{});d.windowParameters=d.windowParameters||{};d.className=d.className||"alert";var b="class ='"+(d.buttonClass?d.buttonClass+" ":"")+" ok_button'";var e=" <div class='"+d.className+"_message'>"+e+"</div> <div class='"+d.className+"_buttons'> <button type='button' title='"+f+"' onclick='Dialog.okCallback()' "+b+"><span><span><span>"+f+"</span></span></span></button> </div>";return this._openDialog(e,d)},info:function(d,b){if(d&&typeof d!="string"){Dialog._runAjaxRequest(d,b,Dialog.info);return}d=d||"";b=b||{};b=Object.extend(b,b.windowParameters||{});b.windowParameters=b.windowParameters||{};b.className=b.className||"alert";var d="<div id='modal_dialog_message' class='"+b.className+"_message'>"+d+"</div>";if(b.showProgress){d+="<div id='modal_dialog_progress' class='"+b.className+"_progress'> </div>"}b.ok=null;b.cancel=null;return this._openDialog(d,b)},setInfoMessage:function(b){$("modal_dialog_message").update(b)},closeInfo:function(){Windows.close(this.dialogId)},_openDialog:function(g,f){var e=f.className;if(!f.height&&!f.width){f.width=WindowUtilities.getPageSize(f.options.parent||document.body).pageWidth/2}if(f.id){this.dialogId=f.id}else{var d=new Date();this.dialogId="modal_dialog_"+d.getTime();f.id=this.dialogId}if(!f.height||!f.width){var b=WindowUtilities._computeSize(g,this.dialogId,f.width,f.height,5,e);if(f.height){f.width=b+5}else{f.height=b+5}}f.effectOptions=f.effectOptions;f.resizable=f.resizable||false;f.minimizable=f.minimizable||false;f.maximizable=f.maximizable||false;f.draggable=f.draggable||false;f.closable=f.closable||false;var h=new Window(f);h.getContent().innerHTML=g;h.showCenter(true,f.top,f.left);h.setDestroyOnClose();h.cancelCallback=f.onCancel||f.cancel;h.okCallback=f.onOk||f.ok;return h},_getAjaxContent:function(b){Dialog.callFunc(b.responseText,Dialog.parameters)},_runAjaxRequest:function(e,d,b){if(e.options==null){e.options={}}Dialog.onCompleteFunc=e.options.onComplete;Dialog.parameters=d;Dialog.callFunc=b;e.options.onComplete=Dialog._getAjaxContent;new Ajax.Request(e.url,e.options)},okCallback:function(){var b=Windows.focusedWindow;if(!b.okCallback||b.okCallback(b)){$$("#"+b.getId()+" input").each(function(d){d.onclick=null});b.close()}},cancelCallback:function(){var b=Windows.focusedWindow;$$("#"+b.getId()+" input").each(function(d){d.onclick=null});b.close();if(b.cancelCallback){b.cancelCallback(b)}}};if(Prototype.Browser.WebKit){var array=navigator.userAgent.match(new RegExp(/AppleWebKit\/([\d\.\+]*)/));Prototype.Browser.WebKitVersion=parseFloat(array[1])}var WindowUtilities={getWindowScroll:function(parent){var T,L,W,H;parent=parent||document.body;if(parent!=document.body){T=parent.scrollTop;L=parent.scrollLeft;W=parent.scrollWidth;H=parent.scrollHeight}else{var w=window;with(w.document){if(w.document.documentElement&&documentElement.scrollTop){T=documentElement.scrollTop;L=documentElement.scrollLeft}else{if(w.document.body){T=body.scrollTop;L=body.scrollLeft}}if(w.innerWidth){W=w.innerWidth;H=w.innerHeight}else{if(w.document.documentElement&&documentElement.clientWidth){W=documentElement.clientWidth;H=documentElement.clientHeight}else{W=body.offsetWidth;H=body.offsetHeight}}}}return{top:T,left:L,width:W,height:H}},getPageSize:function(f){f=f||document.body;var e,l;var g,d;if(f!=document.body){e=f.getWidth();l=f.getHeight();d=f.scrollWidth;g=f.scrollHeight}else{var h,b;if(window.innerHeight&&window.scrollMaxY){h=document.body.scrollWidth;b=window.innerHeight+window.scrollMaxY}else{if(document.body.scrollHeight>document.body.offsetHeight){h=document.body.scrollWidth;b=document.body.scrollHeight}else{h=document.body.offsetWidth;b=document.body.offsetHeight}}if(self.innerHeight){e=document.documentElement.clientWidth;l=self.innerHeight}else{if(document.documentElement&&document.documentElement.clientHeight){e=document.documentElement.clientWidth;l=document.documentElement.clientHeight}else{if(document.body){e=document.body.clientWidth;l=document.body.clientHeight}}}if(b<l){g=l}else{g=b}if(h<e){d=e}else{d=h}}return{pageWidth:d,pageHeight:g,windowWidth:e,windowHeight:l}},disableScreen:function(e,b,f,g,d){WindowUtilities.initLightbox(b,e,function(){this._disableScreen(e,b,f,g)}.bind(this),d||document.body)},_disableScreen:function(e,d,g,h){var f=$(d);var b=WindowUtilities.getPageSize(f.parentNode);if(h&&Prototype.Browser.IE){WindowUtilities._hideSelect();WindowUtilities._showSelect(h)}f.style.height=(b.pageHeight+"px");f.style.display="none";if(d=="overlay_modal"&&Window.hasEffectLib&&Windows.overlayShowEffectOptions){f.overlayOpacity=g;new Effect.Appear(f,Object.extend({from:0,to:g},Windows.overlayShowEffectOptions))}else{f.style.display="block"}},enableScreen:function(d){d=d||"overlay_modal";var b=$(d);if(b){if(d=="overlay_modal"&&Window.hasEffectLib&&Windows.overlayHideEffectOptions){new Effect.Fade(b,Object.extend({from:b.overlayOpacity,to:0},Windows.overlayHideEffectOptions))}else{b.style.display="none";b.parentNode.removeChild(b)}if(d!="__invisible__"){WindowUtilities._showSelect()}}},_hideSelect:function(b){if(Prototype.Browser.IE){b=b==null?"":"#"+b+" ";$$(b+"select").each(function(d){if(!WindowUtilities.isDefined(d.oldVisibility)){d.oldVisibility=d.style.visibility?d.style.visibility:"visible";d.style.visibility="hidden"}})}},_showSelect:function(b){if(Prototype.Browser.IE){b=b==null?"":"#"+b+" ";$$(b+"select").each(function(d){if(WindowUtilities.isDefined(d.oldVisibility)){try{d.style.visibility=d.oldVisibility}catch(f){d.style.visibility="visible"}d.oldVisibility=null}else{if(d.style.visibility){d.style.visibility="visible"}}})}},isDefined:function(b){return typeof(b)!="undefined"&&b!=null},initLightbox:function(g,e,b,d){if($(g)){Element.setStyle(g,{zIndex:Windows.maxZIndex+1});Windows.maxZIndex++;b()}else{var f=document.createElement("div");f.setAttribute("id",g);f.className="overlay_"+e;f.style.display="none";f.style.position="absolute";f.style.top="0";f.style.left="0";f.style.zIndex=Windows.maxZIndex+1;Windows.maxZIndex++;f.style.width="100%";d.insertBefore(f,d.firstChild);if(Prototype.Browser.WebKit&&g=="overlay_modal"){setTimeout(function(){b()},10)}else{b()}}},setCookie:function(d,b){document.cookie=b[0]+"="+escape(d)+((b[1])?"; expires="+b[1].toGMTString():"")+((b[2])?"; path="+b[2]:"")+((b[3])?"; domain="+b[3]:"")+((b[4])?"; secure":"")},getCookie:function(e){var d=document.cookie;var g=e+"=";var f=d.indexOf("; "+g);if(f==-1){f=d.indexOf(g);if(f!=0){return null}}else{f+=2}var b=document.cookie.indexOf(";",f);if(b==-1){b=d.length}return unescape(d.substring(f+g.length,b))},_computeSize:function(g,b,d,l,f,h){var o=document.body;var e=document.createElement("div");e.setAttribute("id",b);e.className=h+"_content";if(l){e.style.height=l+"px"}else{e.style.width=d+"px"}e.style.position="absolute";e.style.top="0";e.style.left="0";e.style.display="none";e.innerHTML=g;o.insertBefore(e,o.firstChild);var n;if(l){n=$(e).getDimensions().width+f}else{n=$(e).getDimensions().height+f}o.removeChild(e);return n}};var Builder={NODEMAP:{AREA:"map",CAPTION:"table",COL:"table",COLGROUP:"table",LEGEND:"fieldset",OPTGROUP:"select",OPTION:"select",PARAM:"object",TBODY:"table",TD:"table",TFOOT:"table",TH:"table",THEAD:"table",TR:"table"},node:function(b){b=b.toUpperCase();var l=this.NODEMAP[b]||"div";var d=document.createElement(l);try{d.innerHTML="<"+b+"></"+b+">"}catch(h){}var g=d.firstChild||null;if(g&&(g.tagName.toUpperCase()!=b)){g=g.getElementsByTagName(b)[0]}if(!g){g=document.createElement(b)}if(!g){return}if(arguments[1]){if(this._isStringOrNumber(arguments[1])||(arguments[1] instanceof Array)||arguments[1].tagName){this._children(g,arguments[1])}else{var f=this._attributes(arguments[1]);if(f.length){try{d.innerHTML="<"+b+" "+f+"></"+b+">"}catch(h){}g=d.firstChild||null;if(!g){g=document.createElement(b);for(attr in arguments[1]){g[attr=="class"?"className":attr]=arguments[1][attr]}}if(g.tagName.toUpperCase()!=b){g=d.getElementsByTagName(b)[0]}}}}if(arguments[2]){this._children(g,arguments[2])}return $(g)},_text:function(b){return document.createTextNode(b)},ATTR_MAP:{className:"class",htmlFor:"for"},_attributes:function(b){var d=[];for(attribute in b){d.push((attribute in this.ATTR_MAP?this.ATTR_MAP[attribute]:attribute)+'="'+b[attribute].toString().escapeHTML().gsub(/"/,""")+'"')}return d.join(" ")},_children:function(d,b){if(b.tagName){d.appendChild(b);return}if(typeof b=="object"){b.flatten().each(function(f){if(typeof f=="object"){d.appendChild(f)}else{if(Builder._isStringOrNumber(f)){d.appendChild(Builder._text(f))}}})}else{if(Builder._isStringOrNumber(b)){d.appendChild(Builder._text(b))}}},_isStringOrNumber:function(b){return(typeof b=="string"||typeof b=="number")},build:function(d){var b=this.node("div");$(b).update(d.strip());return b.down()},dump:function(d){if(typeof d!="object"&&typeof d!="function"){d=window}var b=("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);b.each(function(e){d[e]=function(){return Builder.node.apply(Builder,[e].concat($A(arguments)))}})}};String.prototype.parseColor=function(){var b="#";if(this.slice(0,4)=="rgb("){var e=this.slice(4,this.length-1).split(",");var d=0;do{b+=parseInt(e[d]).toColorPart()}while(++d<3)}else{if(this.slice(0,1)=="#"){if(this.length==4){for(var d=1;d<4;d++){b+=(this.charAt(d)+this.charAt(d)).toLowerCase()}}if(this.length==7){b=this.toLowerCase()}}}return(b.length==7?b:(arguments[0]||this))};Element.collectTextNodes=function(b){return $A($(b).childNodes).collect(function(d){return(d.nodeType==3?d.nodeValue:(d.hasChildNodes()?Element.collectTextNodes(d):""))}).flatten().join("")};Element.collectTextNodesIgnoreClass=function(b,d){return $A($(b).childNodes).collect(function(e){return(e.nodeType==3?e.nodeValue:((e.hasChildNodes()&&!Element.hasClassName(e,d))?Element.collectTextNodesIgnoreClass(e,d):""))}).flatten().join("")};Element.setContentZoom=function(b,d){b=$(b);b.setStyle({fontSize:(d/100)+"em"});if(Prototype.Browser.WebKit){window.scrollBy(0,0)}return b};Element.getInlineOpacity=function(b){return $(b).style.opacity||""};Element.forceRerendering=function(b){try{b=$(b);var f=document.createTextNode(" ");b.appendChild(f);b.removeChild(f)}catch(d){}};var Effect={_elementDoesNotExistError:{name:"ElementDoesNotExistError",message:"The specified DOM element does not exist, but is required for this effect to operate"},Transitions:{linear:Prototype.K,sinoidal:function(b){return(-Math.cos(b*Math.PI)/2)+0.5},reverse:function(b){return 1-b},flicker:function(b){var b=((-Math.cos(b*Math.PI)/4)+0.75)+Math.random()/4;return b>1?1:b},wobble:function(b){return(-Math.cos(b*Math.PI*(9*b))/2)+0.5},pulse:function(d,b){return(-Math.cos((d*((b||5)-0.5)*2)*Math.PI)/2)+0.5},spring:function(b){return 1-(Math.cos(b*4.5*Math.PI)*Math.exp(-b*6))},none:function(b){return 0},full:function(b){return 1}},DefaultOptions:{duration:1,fps:100,sync:false,from:0,to:1,delay:0,queue:"parallel"},tagifyText:function(b){var d="position:relative";if(Prototype.Browser.IE){d+=";zoom:1"}b=$(b);$A(b.childNodes).each(function(e){if(e.nodeType==3){e.nodeValue.toArray().each(function(f){b.insertBefore(new Element("span",{style:d}).update(f==" "?String.fromCharCode(160):f),e)});Element.remove(e)}})},multiple:function(d,e){var g;if(((typeof d=="object")||Object.isFunction(d))&&(d.length)){g=d}else{g=$(d).childNodes}var b=Object.extend({speed:0.1,delay:0},arguments[2]||{});var f=b.delay;$A(g).each(function(l,h){new e(l,Object.extend(b,{delay:h*b.speed+f}))})},PAIRS:{slide:["SlideDown","SlideUp"],blind:["BlindDown","BlindUp"],appear:["Appear","Fade"]},toggle:function(d,e){d=$(d);e=(e||"appear").toLowerCase();var b=Object.extend({queue:{position:"end",scope:(d.id||"global"),limit:1}},arguments[2]||{});Effect[d.visible()?Effect.PAIRS[e][1]:Effect.PAIRS[e][0]](d,b)}};Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;Effect.ScopedQueue=Class.create(Enumerable,{initialize:function(){this.effects=[];this.interval=null},_each:function(b){this.effects._each(b)},add:function(d){var e=new Date().getTime();var b=Object.isString(d.options.queue)?d.options.queue:d.options.queue.position;switch(b){case"front":this.effects.findAll(function(f){return f.state=="idle"}).each(function(f){f.startOn+=d.finishOn;f.finishOn+=d.finishOn});break;case"with-last":e=this.effects.pluck("startOn").max()||e;break;case"end":e=this.effects.pluck("finishOn").max()||e;break}d.startOn+=e;d.finishOn+=e;if(!d.options.queue.limit||(this.effects.length<d.options.queue.limit)){this.effects.push(d)}if(!this.interval){this.interval=setInterval(this.loop.bind(this),15)}},remove:function(b){this.effects=this.effects.reject(function(d){return d==b});if(this.effects.length==0){clearInterval(this.interval);this.interval=null}},loop:function(){var e=new Date().getTime();for(var d=0,b=this.effects.length;d<b;d++){this.effects[d]&&this.effects[d].loop(e)}}});Effect.Queues={instances:$H(),get:function(b){if(!Object.isString(b)){return b}return this.instances.get(b)||this.instances.set(b,new Effect.ScopedQueue())}};Effect.Queue=Effect.Queues.get("global");Effect.Base=Class.create({position:null,start:function(b){function d(f,e){return((f[e+"Internal"]?"this.options."+e+"Internal(this);":"")+(f[e]?"this.options."+e+"(this);":""))}if(b&&b.transition===false){b.transition=Effect.Transitions.linear}this.options=Object.extend(Object.extend({},Effect.DefaultOptions),b||{});this.currentFrame=0;this.state="idle";this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.fromToDelta=this.options.to-this.options.from;this.totalTime=this.finishOn-this.startOn;this.totalFrames=this.options.fps*this.options.duration;this.render=(function(){function e(g,f){if(g.options[f+"Internal"]){g.options[f+"Internal"](g)}if(g.options[f]){g.options[f](g)}}return function(f){if(this.state==="idle"){this.state="running";e(this,"beforeSetup");if(this.setup){this.setup()}e(this,"afterSetup")}if(this.state==="running"){f=(this.options.transition(f)*this.fromToDelta)+this.options.from;this.position=f;e(this,"beforeUpdate");if(this.update){this.update(f)}e(this,"afterUpdate")}}})();this.event("beforeStart");if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).add(this)}},loop:function(e){if(e>=this.startOn){if(e>=this.finishOn){this.render(1);this.cancel();this.event("beforeFinish");if(this.finish){this.finish()}this.event("afterFinish");return}var d=(e-this.startOn)/this.totalTime,b=(d*this.totalFrames).round();if(b>this.currentFrame){this.render(d);this.currentFrame=b}}},cancel:function(){if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).remove(this)}this.state="finished"},event:function(b){if(this.options[b+"Internal"]){this.options[b+"Internal"](this)}if(this.options[b]){this.options[b](this)}},inspect:function(){var b=$H();for(property in this){if(!Object.isFunction(this[property])){b.set(property,this[property])}}return"#<Effect:"+b.inspect()+",options:"+$H(this.options).inspect()+">"}});Effect.Parallel=Class.create(Effect.Base,{initialize:function(b){this.effects=b||[];this.start(arguments[1])},update:function(b){this.effects.invoke("render",b)},finish:function(b){this.effects.each(function(d){d.render(1);d.cancel();d.event("beforeFinish");if(d.finish){d.finish(b)}d.event("afterFinish")})}});Effect.Tween=Class.create(Effect.Base,{initialize:function(e,h,g){e=Object.isString(e)?$(e):e;var d=$A(arguments),f=d.last(),b=d.length==5?d[3]:null;this.method=Object.isFunction(f)?f.bind(e):Object.isFunction(e[f])?e[f].bind(e):function(l){e[f]=l};this.start(Object.extend({from:h,to:g},b||{}))},update:function(b){this.method(b)}});Effect.Event=Class.create(Effect.Base,{initialize:function(){this.start(Object.extend({duration:0},arguments[0]||{}))},update:Prototype.emptyFunction});Effect.Opacity=Class.create(Effect.Base,{initialize:function(d){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}var b=Object.extend({from:this.element.getOpacity()||0,to:1},arguments[1]||{});this.start(b)},update:function(b){this.element.setOpacity(b)}});Effect.Move=Class.create(Effect.Base,{initialize:function(d){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({x:0,y:0,mode:"relative"},arguments[1]||{});this.start(b)},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle("left")||"0");this.originalTop=parseFloat(this.element.getStyle("top")||"0");if(this.options.mode=="absolute"){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop}},update:function(b){this.element.setStyle({left:(this.options.x*b+this.originalLeft).round()+"px",top:(this.options.y*b+this.originalTop).round()+"px"})}});Effect.MoveBy=function(d,b,e){return new Effect.Move(d,Object.extend({x:e,y:b},arguments[3]||{}))};Effect.Scale=Class.create(Effect.Base,{initialize:function(d,e){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:e},arguments[2]||{});this.start(b)},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle("position");this.originalStyle={};["top","left","width","height","fontSize"].each(function(d){this.originalStyle[d]=this.element.style[d]}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var b=this.element.getStyle("font-size")||"100%";["em","px","%","pt"].each(function(d){if(b.indexOf(d)>0){this.fontSize=parseFloat(b);this.fontSizeType=d}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=="box"){this.dims=[this.element.offsetHeight,this.element.offsetWidth]}if(/^content/.test(this.options.scaleMode)){this.dims=[this.element.scrollHeight,this.element.scrollWidth]}if(!this.dims){this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]}},update:function(b){var d=(this.options.scaleFrom/100)+(this.factor*b);if(this.options.scaleContent&&this.fontSize){this.element.setStyle({fontSize:this.fontSize*d+this.fontSizeType})}this.setDimensions(this.dims[0]*d,this.dims[1]*d)},finish:function(b){if(this.restoreAfterFinish){this.element.setStyle(this.originalStyle)}},setDimensions:function(b,g){var h={};if(this.options.scaleX){h.width=g.round()+"px"}if(this.options.scaleY){h.height=b.round()+"px"}if(this.options.scaleFromCenter){var f=(b-this.dims[0])/2;var e=(g-this.dims[1])/2;if(this.elementPositioning=="absolute"){if(this.options.scaleY){h.top=this.originalTop-f+"px"}if(this.options.scaleX){h.left=this.originalLeft-e+"px"}}else{if(this.options.scaleY){h.top=-f+"px"}if(this.options.scaleX){h.left=-e+"px"}}}this.element.setStyle(h)}});Effect.Highlight=Class.create(Effect.Base,{initialize:function(d){this.element=$(d);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({startcolor:"#ffff99"},arguments[1]||{});this.start(b)},setup:function(){if(this.element.getStyle("display")=="none"){this.cancel();return}this.oldStyle={};if(!this.options.keepBackgroundImage){this.oldStyle.backgroundImage=this.element.getStyle("background-image");this.element.setStyle({backgroundImage:"none"})}if(!this.options.endcolor){this.options.endcolor=this.element.getStyle("background-color").parseColor("#ffffff")}if(!this.options.restorecolor){this.options.restorecolor=this.element.getStyle("background-color")}this._base=$R(0,2).map(function(b){return parseInt(this.options.startcolor.slice(b*2+1,b*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(b){return parseInt(this.options.endcolor.slice(b*2+1,b*2+3),16)-this._base[b]}.bind(this))},update:function(b){this.element.setStyle({backgroundColor:$R(0,2).inject("#",function(d,e,f){return d+((this._base[f]+(this._delta[f]*b)).round().toColorPart())}.bind(this))})},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}))}});Effect.ScrollTo=function(e){var d=arguments[1]||{},b=document.viewport.getScrollOffsets(),f=$(e).cumulativeOffset();if(d.offset){f[1]+=d.offset}return new Effect.Tween(null,b.top,f[1],d,function(g){scrollTo(b.left,g.round())})};Effect.Fade=function(e){e=$(e);var b=e.getInlineOpacity();var d=Object.extend({from:e.getOpacity()||1,to:0,afterFinishInternal:function(f){if(f.options.to!=0){return}f.element.hide().setStyle({opacity:b})}},arguments[1]||{});return new Effect.Opacity(e,d)};Effect.Appear=function(d){d=$(d);var b=Object.extend({from:(d.getStyle("display")=="none"?0:d.getOpacity()||0),to:1,afterFinishInternal:function(e){e.element.forceRerendering()},beforeSetup:function(e){e.element.setOpacity(e.options.from).show()}},arguments[1]||{});return new Effect.Opacity(d,b)};Effect.Puff=function(d){d=$(d);var b={opacity:d.getInlineOpacity(),position:d.getStyle("position"),top:d.style.top,left:d.style.left,width:d.style.width,height:d.style.height};return new Effect.Parallel([new Effect.Scale(d,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(d,{sync:true,to:0})],Object.extend({duration:1,beforeSetupInternal:function(e){Position.absolutize(e.effects[0].element)},afterFinishInternal:function(e){e.effects[0].element.hide().setStyle(b)}},arguments[1]||{}))};Effect.BlindUp=function(b){b=$(b);b.makeClipping();return new Effect.Scale(b,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(d){d.element.hide().undoClipping()}},arguments[1]||{}))};Effect.BlindDown=function(d){d=$(d);var b=d.getDimensions();return new Effect.Scale(d,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:b.height,originalWidth:b.width},restoreAfterFinish:true,afterSetup:function(e){e.element.makeClipping().setStyle({height:"0px"}).show()},afterFinishInternal:function(e){e.element.undoClipping()}},arguments[1]||{}))};Effect.SwitchOff=function(d){d=$(d);var b=d.getInlineOpacity();return new Effect.Appear(d,Object.extend({duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(e){new Effect.Scale(e.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(f){f.element.makePositioned().makeClipping()},afterFinishInternal:function(f){f.element.hide().undoClipping().undoPositioned().setStyle({opacity:b})}})}},arguments[1]||{}))};Effect.DropOut=function(d){d=$(d);var b={top:d.getStyle("top"),left:d.getStyle("left"),opacity:d.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(d,{x:0,y:100,sync:true}),new Effect.Opacity(d,{sync:true,to:0})],Object.extend({duration:0.5,beforeSetup:function(e){e.effects[0].element.makePositioned()},afterFinishInternal:function(e){e.effects[0].element.hide().undoPositioned().setStyle(b)}},arguments[1]||{}))};Effect.Shake=function(f){f=$(f);var d=Object.extend({distance:20,duration:0.5},arguments[1]||{});var g=parseFloat(d.distance);var e=parseFloat(d.duration)/10;var b={top:f.getStyle("top"),left:f.getStyle("left")};return new Effect.Move(f,{x:g,y:0,duration:e,afterFinishInternal:function(h){new Effect.Move(h.element,{x:-g*2,y:0,duration:e*2,afterFinishInternal:function(l){new Effect.Move(l.element,{x:g*2,y:0,duration:e*2,afterFinishInternal:function(n){new Effect.Move(n.element,{x:-g*2,y:0,duration:e*2,afterFinishInternal:function(o){new Effect.Move(o.element,{x:g*2,y:0,duration:e*2,afterFinishInternal:function(p){new Effect.Move(p.element,{x:-g,y:0,duration:e,afterFinishInternal:function(q){q.element.undoPositioned().setStyle(b)}})}})}})}})}})}})};Effect.SlideDown=function(e){e=$(e).cleanWhitespace();var b=e.down().getStyle("bottom");var d=e.getDimensions();return new Effect.Scale(e,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:d.height,originalWidth:d.width},restoreAfterFinish:true,afterSetup:function(f){f.element.makePositioned();f.element.down().makePositioned();if(window.opera){f.element.setStyle({top:""})}f.element.makeClipping().setStyle({height:"0px"}).show()},afterUpdateInternal:function(f){f.element.down().setStyle({bottom:(f.dims[0]-f.element.clientHeight)+"px"})},afterFinishInternal:function(f){f.element.undoClipping().undoPositioned();f.element.down().undoPositioned().setStyle({bottom:b})}},arguments[1]||{}))};Effect.SlideUp=function(e){e=$(e).cleanWhitespace();var b=e.down().getStyle("bottom");var d=e.getDimensions();return new Effect.Scale(e,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,scaleMode:{originalHeight:d.height,originalWidth:d.width},restoreAfterFinish:true,afterSetup:function(f){f.element.makePositioned();f.element.down().makePositioned();if(window.opera){f.element.setStyle({top:""})}f.element.makeClipping().show()},afterUpdateInternal:function(f){f.element.down().setStyle({bottom:(f.dims[0]-f.element.clientHeight)+"px"})},afterFinishInternal:function(f){f.element.hide().undoClipping().undoPositioned();f.element.down().undoPositioned().setStyle({bottom:b})}},arguments[1]||{}))};Effect.Squish=function(b){return new Effect.Scale(b,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(d){d.element.makeClipping()},afterFinishInternal:function(d){d.element.hide().undoClipping()}})};Effect.Grow=function(e){e=$(e);var d=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var b={top:e.style.top,left:e.style.left,height:e.style.height,width:e.style.width,opacity:e.getInlineOpacity()};var l=e.getDimensions();var n,h;var g,f;switch(d.direction){case"top-left":n=h=g=f=0;break;case"top-right":n=l.width;h=f=0;g=-l.width;break;case"bottom-left":n=g=0;h=l.height;f=-l.height;break;case"bottom-right":n=l.width;h=l.height;g=-l.width;f=-l.height;break;case"center":n=l.width/2;h=l.height/2;g=-l.width/2;f=-l.height/2;break}return new Effect.Move(e,{x:n,y:h,duration:0.01,beforeSetup:function(o){o.element.hide().makeClipping().makePositioned()},afterFinishInternal:function(o){new Effect.Parallel([new Effect.Opacity(o.element,{sync:true,to:1,from:0,transition:d.opacityTransition}),new Effect.Move(o.element,{x:g,y:f,sync:true,transition:d.moveTransition}),new Effect.Scale(o.element,100,{scaleMode:{originalHeight:l.height,originalWidth:l.width},sync:true,scaleFrom:window.opera?1:0,transition:d.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(p){p.effects[0].element.setStyle({height:"0px"}).show()},afterFinishInternal:function(p){p.effects[0].element.undoClipping().undoPositioned().setStyle(b)}},d))}})};Effect.Shrink=function(e){e=$(e);var d=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var b={top:e.style.top,left:e.style.left,height:e.style.height,width:e.style.width,opacity:e.getInlineOpacity()};var h=e.getDimensions();var g,f;switch(d.direction){case"top-left":g=f=0;break;case"top-right":g=h.width;f=0;break;case"bottom-left":g=0;f=h.height;break;case"bottom-right":g=h.width;f=h.height;break;case"center":g=h.width/2;f=h.height/2;break}return new Effect.Parallel([new Effect.Opacity(e,{sync:true,to:0,from:1,transition:d.opacityTransition}),new Effect.Scale(e,window.opera?1:0,{sync:true,transition:d.scaleTransition,restoreAfterFinish:true}),new Effect.Move(e,{x:g,y:f,sync:true,transition:d.moveTransition})],Object.extend({beforeStartInternal:function(l){l.effects[0].element.makePositioned().makeClipping()},afterFinishInternal:function(l){l.effects[0].element.hide().undoClipping().undoPositioned().setStyle(b)}},d))};Effect.Pulsate=function(e){e=$(e);var d=arguments[1]||{},b=e.getInlineOpacity(),g=d.transition||Effect.Transitions.linear,f=function(h){return 1-g((-Math.cos((h*(d.pulses||5)*2)*Math.PI)/2)+0.5)};return new Effect.Opacity(e,Object.extend(Object.extend({duration:2,from:0,afterFinishInternal:function(h){h.element.setStyle({opacity:b})}},d),{transition:f}))};Effect.Fold=function(d){d=$(d);var b={top:d.style.top,left:d.style.left,width:d.style.width,height:d.style.height};d.makeClipping();return new Effect.Scale(d,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(e){new Effect.Scale(d,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(f){f.element.hide().undoClipping().setStyle(b)}})}},arguments[1]||{}))};Effect.Morph=Class.create(Effect.Base,{initialize:function(e){this.element=$(e);if(!this.element){throw (Effect._elementDoesNotExistError)}var b=Object.extend({style:{}},arguments[1]||{});if(!Object.isString(b.style)){this.style=$H(b.style)}else{if(b.style.include(":")){this.style=b.style.parseStyle()}else{this.element.addClassName(b.style);this.style=$H(this.element.getStyles());this.element.removeClassName(b.style);var d=this.element.getStyles();this.style=this.style.reject(function(f){return f.value==d[f.key]});b.afterFinishInternal=function(f){f.element.addClassName(f.options.style);f.transforms.each(function(g){f.element.style[g.style]=""})}}}this.start(b)},setup:function(){function b(d){if(!d||["rgba(0, 0, 0, 0)","transparent"].include(d)){d="#ffffff"}d=d.parseColor();return $R(0,2).map(function(e){return parseInt(d.slice(e*2+1,e*2+3),16)})}this.transforms=this.style.map(function(l){var h=l[0],g=l[1],f=null;if(g.parseColor("#zzzzzz")!="#zzzzzz"){g=g.parseColor();f="color"}else{if(h=="opacity"){g=parseFloat(g);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}}else{if(Element.CSS_LENGTH.test(g)){var e=g.match(/^([\+\-]?[0-9\.]+)(.*)$/);g=parseFloat(e[1]);f=(e.length==3)?e[2]:null}}}var d=this.element.getStyle(h);return{style:h.camelize(),originalValue:f=="color"?b(d):parseFloat(d||0),targetValue:f=="color"?b(g):g,unit:f}}.bind(this)).reject(function(d){return((d.originalValue==d.targetValue)||(d.unit!="color"&&(isNaN(d.originalValue)||isNaN(d.targetValue))))})},update:function(b){var f={},d,e=this.transforms.length;while(e--){f[(d=this.transforms[e]).style]=d.unit=="color"?"#"+(Math.round(d.originalValue[0]+(d.targetValue[0]-d.originalValue[0])*b)).toColorPart()+(Math.round(d.originalValue[1]+(d.targetValue[1]-d.originalValue[1])*b)).toColorPart()+(Math.round(d.originalValue[2]+(d.targetValue[2]-d.originalValue[2])*b)).toColorPart():(d.originalValue+(d.targetValue-d.originalValue)*b).toFixed(3)+(d.unit===null?"":d.unit)}this.element.setStyle(f,true)}});Effect.Transform=Class.create({initialize:function(b){this.tracks=[];this.options=arguments[1]||{};this.addTracks(b)},addTracks:function(b){b.each(function(d){d=$H(d);var e=d.values().first();this.tracks.push($H({ids:d.keys().first(),effect:Effect.Morph,options:{style:e}}))}.bind(this));return this},play:function(){return new Effect.Parallel(this.tracks.map(function(b){var f=b.get("ids"),e=b.get("effect"),d=b.get("options");var g=[$(f)||$$(f)].flatten();return g.map(function(h){return new e(h,Object.extend({sync:true},d))})}).flatten(),this.options)}});Element.CSS_PROPERTIES=$w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderSpacing borderTopColor borderTopStyle borderTopWidth bottom clip color fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop markerOffset maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex");Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement=document.createElement("div");String.prototype.parseStyle=function(){var d,b=$H();if(Prototype.Browser.WebKit){d=new Element("div",{style:this}).style}else{String.__parseStyleElement.innerHTML='<div style="'+this+'"></div>';d=String.__parseStyleElement.childNodes[0].style}Element.CSS_PROPERTIES.each(function(e){if(d[e]){b.set(e,d[e])}});if(Prototype.Browser.IE&&this.include("opacity")){b.set("opacity",this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1])}return b};if(document.defaultView&&document.defaultView.getComputedStyle){Element.getStyles=function(d){var b=document.defaultView.getComputedStyle($(d),null);return Element.CSS_PROPERTIES.inject({},function(e,f){e[f]=b[f];return e})}}else{Element.getStyles=function(d){d=$(d);var b=d.currentStyle,e;e=Element.CSS_PROPERTIES.inject({},function(f,g){f[g]=b[g];return f});if(!e.opacity){e.opacity=d.getOpacity()}return e}}Effect.Methods={morph:function(b,d){b=$(b);new Effect.Morph(b,Object.extend({style:d},arguments[2]||{}));return b},visualEffect:function(e,g,d){e=$(e);var f=g.dasherize().camelize(),b=f.charAt(0).toUpperCase()+f.substring(1);new Effect[b](e,d);return e},highlight:function(d,b){d=$(d);new Effect.Highlight(d,b);return d}};$w("fade appear grow shrink fold blindUp blindDown slideUp slideDown pulsate shake puff squish switchOff dropOut").each(function(b){Effect.Methods[b]=function(e,d){e=$(e);Effect[b.charAt(0).toUpperCase()+b.substring(1)](e,d);return e}});$w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function(b){Effect.Methods[b]=Element[b]});Element.addMethods(Effect.Methods);function validateCreditCard(e){var d="0123456789";var b="";for(i=0;i<e.length;i++){x=e.charAt(i);if(d.indexOf(x,0)!=-1){b+=x}}j=b.length/2;k=Math.floor(j);m=Math.ceil(j)-k;c=0;for(i=0;i<k;i++){a=b.charAt(i*2+m)*2;c+=a>9?Math.floor(a/10+a%10):a}for(i=0;i<k+m;i++){c+=b.charAt(i*2+1-m)*1}return(c%10==0)}var Validator=Class.create();Validator.prototype={initialize:function(e,d,f,b){if(typeof f=="function"){this.options=$H(b);this._test=f}else{this.options=$H(f);this._test=function(){return true}}this.error=d||"Validation failed.";this.className=e},test:function(b,d){return(this._test(b,d)&&this.options.all(function(e){return Validator.methods[e.key]?Validator.methods[e.key](b,d,e.value):true}))}};Validator.methods={pattern:function(b,e,d){return Validation.get("IsEmpty").test(b)||d.test(b)},minLength:function(b,e,d){return b.length>=d},maxLength:function(b,e,d){return b.length<=d},min:function(b,e,d){return b>=parseFloat(d)},max:function(b,e,d){return b<=parseFloat(d)},notOneOf:function(b,e,d){return $A(d).all(function(f){return b!=f})},oneOf:function(b,e,d){return $A(d).any(function(f){return b==f})},is:function(b,e,d){return b==d},isNot:function(b,e,d){return b!=d},equalToField:function(b,e,d){return b==$F(d)},notEqualToField:function(b,e,d){return b!=$F(d)},include:function(b,e,d){return $A(d).all(function(f){return Validation.get(f).test(b,e)})}};var Validation=Class.create();Validation.defaultOptions={onSubmit:true,stopOnFirst:false,immediate:false,focusOnError:true,useTitles:false,addClassNameToContainer:false,containerClassName:".input-box",onFormValidate:function(b,d){},onElementValidate:function(b,d){}};Validation.prototype={initialize:function(d,b){this.form=$(d);if(!this.form){return}this.options=Object.extend({onSubmit:Validation.defaultOptions.onSubmit,stopOnFirst:Validation.defaultOptions.stopOnFirst,immediate:Validation.defaultOptions.immediate,focusOnError:Validation.defaultOptions.focusOnError,useTitles:Validation.defaultOptions.useTitles,onFormValidate:Validation.defaultOptions.onFormValidate,onElementValidate:Validation.defaultOptions.onElementValidate},b||{});if(this.options.onSubmit){Event.observe(this.form,"submit",this.onSubmit.bind(this),false)}if(this.options.immediate){Form.getElements(this.form).each(function(e){if(e.tagName.toLowerCase()=="select"){Event.observe(e,"blur",this.onChange.bindAsEventListener(this))}if(e.type.toLowerCase()=="radio"||e.type.toLowerCase()=="checkbox"){Event.observe(e,"click",this.onChange.bindAsEventListener(this))}else{Event.observe(e,"change",this.onChange.bindAsEventListener(this))}},this)}},onChange:function(b){Validation.isOnChange=true;Validation.validate(Event.element(b),{useTitle:this.options.useTitles,onElementValidate:this.options.onElementValidate});Validation.isOnChange=false},onSubmit:function(b){if(!this.validate()){Event.stop(b)}},validate:function(){var b=false;var d=this.options.useTitles;var g=this.options.onElementValidate;try{if(this.options.stopOnFirst){b=Form.getElements(this.form).all(function(e){if(e.hasClassName("local-validation")&&!this.isElementInForm(e,this.form)){return true}return Validation.validate(e,{useTitle:d,onElementValidate:g})},this)}else{b=Form.getElements(this.form).collect(function(e){if(e.hasClassName("local-validation")&&!this.isElementInForm(e,this.form)){return true}if(e.hasClassName("validation-disabled")){return true}return Validation.validate(e,{useTitle:d,onElementValidate:g})},this).all()}}catch(f){}if(!b&&this.options.focusOnError){try{Form.getElements(this.form).findAll(function(e){return $(e).hasClassName("validation-failed")}).first().focus()}catch(f){}}this.options.onFormValidate(b,this.form);return b},reset:function(){Form.getElements(this.form).each(Validation.reset)},isElementInForm:function(e,d){var b=e.up("form");if(b==d){return true}return false}};Object.extend(Validation,{validate:function(e,b){b=Object.extend({useTitle:false,onElementValidate:function(f,g){}},b||{});e=$(e);var d=$w(e.className);return result=d.all(function(f){var g=Validation.test(f,e,b.useTitle);b.onElementValidate(g,e);return g})},insertAdvice:function(f,d){var b=$(f).up(".field-row");if(b){Element.insert(b,{after:d})}else{if(f.up("td.value")){f.up("td.value").insert({bottom:d})}else{if(f.advaiceContainer&&$(f.advaiceContainer)){$(f.advaiceContainer).update(d)}else{switch(f.type.toLowerCase()){case"checkbox":case"radio":var e=f.parentNode;if(e){Element.insert(e,{bottom:d})}else{Element.insert(f,{after:d})}break;default:Element.insert(f,{after:d})}}}}},showAdvice:function(e,d,b){if(!e.advices){e.advices=new Hash()}else{e.advices.each(function(f){if(!d||f.value.id!=d.id){this.hideAdvice(e,f.value)}}.bind(this))}e.advices.set(b,d);if(typeof Effect=="undefined"){d.style.display="block"}else{if(!d._adviceAbsolutize){new Effect.Appear(d,{duration:1})}else{Position.absolutize(d);d.show();d.setStyle({top:d._adviceTop,left:d._adviceLeft,width:d._adviceWidth,"z-index":1000});d.addClassName("advice-absolute")}}},hideAdvice:function(d,b){if(b!=null){new Effect.Fade(b,{duration:1,afterFinishInternal:function(){b.hide()}})}},updateCallback:function(elm,status){if(typeof elm.callbackFunction!="undefined"){eval(elm.callbackFunction+"('"+elm.id+"','"+status+"')")}},ajaxError:function(g,f){var e="validate-ajax";var d=Validation.getAdvice(e,g);if(d==null){d=this.createAdvice(e,g,false,f)}this.showAdvice(g,d,"validate-ajax");this.updateCallback(g,"failed");g.addClassName("validation-failed");g.addClassName("validate-ajax");if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var b=g.up(Validation.defaultOptions.containerClassName);if(b&&this.allowContainerClassName(g)){b.removeClassName("validation-passed");b.addClassName("validation-error")}}},allowContainerClassName:function(b){if(b.type=="radio"||b.type=="checkbox"){return b.hasClassName("change-container-classname")}return true},test:function(g,o,l){var d=Validation.get(g);var n="__advice"+g.camelize();try{if(Validation.isVisible(o)&&!d.test($F(o),o)){var f=Validation.getAdvice(g,o);if(f==null){f=this.createAdvice(g,o,l)}this.showAdvice(o,f,g);this.updateCallback(o,"failed");o[n]=1;if(!o.advaiceContainer){o.removeClassName("validation-passed");o.addClassName("validation-failed")}if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var b=o.up(Validation.defaultOptions.containerClassName);if(b&&this.allowContainerClassName(o)){b.removeClassName("validation-passed");b.addClassName("validation-error")}}return false}else{var f=Validation.getAdvice(g,o);this.hideAdvice(o,f);this.updateCallback(o,"passed");o[n]="";o.removeClassName("validation-failed");o.addClassName("validation-passed");if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var b=o.up(Validation.defaultOptions.containerClassName);if(b&&!b.down(".validation-failed")&&this.allowContainerClassName(o)){if(!Validation.get("IsEmpty").test(o.value)||!this.isVisible(o)){b.addClassName("validation-passed")}else{b.removeClassName("validation-passed")}b.removeClassName("validation-error")}}return true}}catch(h){throw (h)}},isVisible:function(b){while(b.tagName!="BODY"){if(!$(b).visible()){return false}b=b.parentNode}return true},getAdvice:function(b,d){return $("advice-"+b+"-"+Validation.getElmID(d))||$("advice-"+Validation.getElmID(d))},createAdvice:function(e,n,l,d){var b=Validation.get(e);var h=l?((n&&n.title)?n.title:b.error):b.error;if(d){h=d}if(jQuery.mage.__){h=jQuery.mage.__(h)}advice='<div class="validation-advice" id="advice-'+e+"-"+Validation.getElmID(n)+'" style="display:none">'+h+"</div>";Validation.insertAdvice(n,advice);advice=Validation.getAdvice(e,n);if($(n).hasClassName("absolute-advice")){var g=$(n).getDimensions();var f=Position.cumulativeOffset(n);advice._adviceTop=(f[1]+g.height)+"px";advice._adviceLeft=(f[0])+"px";advice._adviceWidth=(g.width)+"px";advice._adviceAbsolutize=true}return advice},getElmID:function(b){return b.id?b.id:b.name},reset:function(d){d=$(d);var b=$w(d.className);b.each(function(g){var h="__advice"+g.camelize();if(d[h]){var f=Validation.getAdvice(g,d);if(f){f.hide()}d[h]=""}d.removeClassName("validation-failed");d.removeClassName("validation-passed");if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=""){var e=d.up(Validation.defaultOptions.containerClassName);if(e){e.removeClassName("validation-passed");e.removeClassName("validation-error")}}})},add:function(f,e,g,d){var b={};b[f]=new Validator(f,e,g,d);Object.extend(Validation.methods,b)},addAllThese:function(b){var d={};$A(b).each(function(e){d[e[0]]=new Validator(e[0],e[1],e[2],(e.length>3?e[3]:{}))});Object.extend(Validation.methods,d)},get:function(b){return Validation.methods[b]?Validation.methods[b]:Validation.methods._LikeNoIDIEverSaw_},methods:{_LikeNoIDIEverSaw_:new Validator("_LikeNoIDIEverSaw_","",{})}});Validation.add("IsEmpty","",function(b){return(b==""||(b==null)||(b.length==0)||/^\s+$/.test(b))});Validation.addAllThese([["validate-no-html-tags","HTML tags are not allowed",function(b){return !/<(\/)?\w+/.test(b)}],["validate-select","Please select an option.",function(b){return((b!="none")&&(b!=null)&&(b.length!=0))}],["required-entry","This is a required field.",function(b){return !Validation.get("IsEmpty").test(b)}],["validate-number","Please enter a valid number in this field.",function(b){return Validation.get("IsEmpty").test(b)||(!isNaN(parseNumber(b))&&/^\s*-?\d*(\.\d*)?\s*$/.test(b))}],["validate-number-range","The value is not within the specified range.",function(e,g){if(Validation.get("IsEmpty").test(e)){return true}var f=parseNumber(e);if(isNaN(f)){return false}var d=/^number-range-(-?[\d.,]+)?-(-?[\d.,]+)?$/,b=true;$w(g.className).each(function(l){var h=d.exec(l);if(h){b=b&&(h[1]==null||h[1]==""||f>=parseNumber(h[1]))&&(h[2]==null||h[2]==""||f<=parseNumber(h[2]))}});return b}],["validate-digits","Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.",function(b){return Validation.get("IsEmpty").test(b)||!/[^\d]/.test(b)}],["validate-digits-range","The value is not within the specified range.",function(e,g){if(Validation.get("IsEmpty").test(e)){return true}var f=parseNumber(e);if(isNaN(f)){return false}var d=/^digits-range-(-?\d+)?-(-?\d+)?$/,b=true;$w(g.className).each(function(l){var h=d.exec(l);if(h){b=b&&(h[1]==null||h[1]==""||f>=parseNumber(h[1]))&&(h[2]==null||h[2]==""||f<=parseNumber(h[2]))}});return b}],["validate-range","The value is not within the specified range.",function(f,l){var g,h;if(Validation.get("IsEmpty").test(f)){return true}else{if(Validation.get("validate-digits").test(f)){g=h=parseNumber(f)}else{var e=/^(-?\d+)?-(-?\d+)?$/.exec(f);if(e){g=parseNumber(e[1]);h=parseNumber(e[2]);if(g>h){return false}}else{return false}}}var d=/^range-(-?\d+)?-(-?\d+)?$/,b=true;$w(l.className).each(function(n){var q=d.exec(n);if(q){var p=parseNumber(q[1]);var o=parseNumber(q[2]);b=b&&(isNaN(p)||g>=p)&&(isNaN(o)||h<=o)}});return b}],["validate-alpha","Please use letters only (a-z or A-Z) in this field.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-zA-Z]+$/.test(b)}],["validate-code","Please use only letters (a-z), numbers (0-9) or underscore (_) in this field, and the first character should be a letter.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-z]+[a-z0-9_]+$/.test(b)}],["validate-alphanum","Please use only letters (a-z or A-Z) or numbers (0-9) in this field. No spaces or other characters are allowed.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-zA-Z0-9]+$/.test(b)}],["validate-alphanum-with-spaces","Please use only letters (a-z or A-Z), numbers (0-9) or spaces only in this field.",function(b){return Validation.get("IsEmpty").test(b)||/^[a-zA-Z0-9 ]+$/.test(b)}],["validate-street",'Please use only letters (a-z or A-Z), numbers (0-9), spaces and "#" in this field.',function(b){return Validation.get("IsEmpty").test(b)||/^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(b)}],["validate-phoneStrict","Please enter a valid phone number (Ex: 123-456-7890).",function(b){return Validation.get("IsEmpty").test(b)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(b)}],["validate-phoneLax","Please enter a valid phone number (Ex: 123-456-7890).",function(b){return Validation.get("IsEmpty").test(b)||/^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(b)}],["validate-fax","Please enter a valid fax number (Ex: 123-456-7890).",function(b){return Validation.get("IsEmpty").test(b)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(b)}],["validate-date","Please enter a valid date.",function(b){var d=new Date(b);return Validation.get("IsEmpty").test(b)||!isNaN(d)}],["validate-date-range","Make sure the To Date is later than or the same as the From Date.",function(e,h){var d=/\bdate-range-(\w+)-(\w+)\b/.exec(h.className);if(!d||d[2]=="to"||Validation.get("IsEmpty").test(e)){return true}var f=new Date().getFullYear()+"";var b=function(l){l=l.split(/[.\/]/);if(l[2]&&l[2].length<4){l[2]=f.substr(0,l[2].length)+l[2]}return new Date(l.join("/")).getTime()};var g=Element.select(h.form,".validate-date-range.date-range-"+d[1]+"-to");return !g.length||Validation.get("IsEmpty").test(g[0].value)||b(e)<=b(g[0].value)}],["validate-email","Please enter a valid email address (Ex: johndoe@domain.com).",function(b){return Validation.get("IsEmpty").test(b)||/^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i.test(b)}],["validate-emailSender","Please use only visible characters and spaces.",function(b){return Validation.get("IsEmpty").test(b)||/^[\S ]+$/.test(b)}],["validate-password","Please enter 6 or more characters. Leading or trailing spaces will be ignored.",function(b){var d=b.strip();return !(d.length>0&&d.length<6)}],["validate-admin-password","Please enter 7 or more characters, using both numeric and alphabetic.",function(b){var d=b.strip();if(0==d.length){return true}if(!(/[a-z]/i.test(b))||!(/[0-9]/.test(b))){return false}return !(d.length<7)}],["validate-cpassword","Please make sure your passwords match.",function(b){var d=$("confirmation")?$("confirmation"):$$(".validate-cpassword")[0];var g=false;if($("password")){g=$("password")}var h=$$(".validate-password");for(var e=0;e<h.size();e++){var f=h[e];if(f.up("form").id==d.up("form").id){g=f}}if($$(".validate-admin-password").size()){g=$$(".validate-admin-password")[0]}return(g.value==d.value)}],["validate-both-passwords","Please make sure your passwords match.",function(e,d){var b=$(d.form[d.name=="password"?"confirmation":"password"]),f=d.value==b.value;if(f&&b.hasClassName("validation-failed")){Validation.test(this.className,b)}return b.value==""||f}],["validate-url","Please enter a valid URL. Protocol is required (http://, https:// or ftp://)",function(b){b=(b||"").replace(/^\s+/,"").replace(/\s+$/,"");return Validation.get("IsEmpty").test(b)||/^(http|https|ftp):\/\/(([A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))(\.[A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))*)(:(\d+))?(\/[A-Z0-9~](([A-Z0-9_~-]|\.)*[A-Z0-9~]|))*\/?(.*)?$/i.test(b)}],["validate-clean-url",'Please enter a valid URL (Ex: "http://www.example.com" or "www.example.com").',function(b){return Validation.get("IsEmpty").test(b)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(b)||/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(b)}],["validate-identifier",'Please enter a valid URL Key (Ex: "example-page", "example-page.html" or "anotherlevel/example-page").',function(b){return Validation.get("IsEmpty").test(b)||/^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/.test(b)}],["validate-xml-identifier","Please enter a valid XML-identifier (Ex: something_1, block5, id-4).",function(b){return Validation.get("IsEmpty").test(b)||/^[A-Z][A-Z0-9_\/-]*$/i.test(b)}],["validate-ssn","Please enter a valid social security number (Ex: 123-45-6789).",function(b){return Validation.get("IsEmpty").test(b)||/^\d{3}-?\d{2}-?\d{4}$/.test(b)}],["validate-zip-us","Please enter a valid zip code (Ex: 90602 or 90602-1234).",function(b){return Validation.get("IsEmpty").test(b)||/(^\d{5}$)|(^\d{5}-\d{4}$)/.test(b)}],["validate-zip-international","Please enter a valid zip code.",function(b){return true}],["validate-date-au",'Please use this date format: dd/mm/yyyy (Ex: "17/03/2006" for the 17th of March, 2006).',function(b){if(Validation.get("IsEmpty").test(b)){return true}var e=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!e.test(b)){return false}var f=new Date(b.replace(e,"$2/$1/$3"));return(parseInt(RegExp.$2,10)==(1+f.getMonth()))&&(parseInt(RegExp.$1,10)==f.getDate())&&(parseInt(RegExp.$3,10)==f.getFullYear())}],["validate-currency-dollar","Please enter a valid $ amount (Ex: $100.00).",function(b){return Validation.get("IsEmpty").test(b)||/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(b)}],["validate-one-required","Please select one of the options above.",function(b,f){var e=f.parentNode;var d=e.getElementsByTagName("INPUT");return $A(d).any(function(g){return $F(g)})}],["validate-one-required-by-name","Please select one of the options.",function(d,g){var b=$$('input[name="'+g.name.replace(/([\\"])/g,"\\$1")+'"]');var e=1;for(var f=0;f<b.length;f++){if((b[f].type=="checkbox"||b[f].type=="radio")&&b[f].checked==true){e=0}if(Validation.isOnChange&&(b[f].type=="checkbox"||b[f].type=="radio")){Validation.reset(b[f])}}if(e==0){return true}else{return false}}],["validate-not-negative-number","Please enter a number 0 or greater in this field.",function(b){if(Validation.get("IsEmpty").test(b)){return true}b=parseNumber(b);return !isNaN(b)&&b>=0}],["validate-zero-or-greater","Please enter a number 0 or greater in this field.",function(b){return Validation.get("validate-not-negative-number").test(b)}],["validate-greater-than-zero","Please enter a number greater than 0 in this field.",function(b){if(Validation.get("IsEmpty").test(b)){return true}b=parseNumber(b);return !isNaN(b)&&b>0}],["validate-state","Please select State/Province.",function(b){return(b!=0||b=="")}],["validate-new-password","Please enter 6 or more characters. Leading or trailing spaces will be ignored.",function(b){if(!Validation.get("validate-password").test(b)){return false}if(Validation.get("IsEmpty").test(b)&&b!=""){return false}return true}],["validate-cc-number","Please enter a valid credit card number.",function(b,e){var d=$(e.id.substr(0,e.id.indexOf("_cc_number"))+"_cc_type");if(d&&typeof Validation.creditCartTypes.get(d.value)!="undefined"&&Validation.creditCartTypes.get(d.value)[2]==false){if(!Validation.get("IsEmpty").test(b)&&Validation.get("validate-digits").test(b)){return true}else{return false}}return validateCreditCard(b)}],["validate-cc-type","Credit card number does not match credit card type.",function(d,g){g.value=removeDelimiters(g.value);d=removeDelimiters(d);var f=$(g.id.substr(0,g.id.indexOf("_cc_number"))+"_cc_type");if(!f){return true}var e=f.value;if(typeof Validation.creditCartTypes.get(e)=="undefined"){return false}if(Validation.creditCartTypes.get(e)[0]==false){return true}var b="";Validation.creditCartTypes.each(function(h){if(h.value[0]&&d.match(h.value[0])){b=h.key;throw $break}});if(b!=e){return false}if(f.hasClassName("validation-failed")&&Validation.isOnChange){Validation.validate(f)}return true}],["validate-cc-type-select","Card type does not match credit card number.",function(d,e){var b=$(e.id.substr(0,e.id.indexOf("_cc_type"))+"_cc_number");if(Validation.isOnChange&&Validation.get("IsEmpty").test(b.value)){return true}if(Validation.get("validate-cc-type").test(b.value,b)){Validation.validate(b)}return Validation.get("validate-cc-type").test(b.value,b)}],["validate-cc-exp","Incorrect credit card expiration date.",function(b,l){var h=b;var g=$(l.id.substr(0,l.id.indexOf("_expiration"))+"_expiration_yr").value;var f=new Date();var e=f.getMonth()+1;var d=f.getFullYear();if(h<e&&g==d){return false}return true}],["validate-cc-cvn","Please enter a valid credit card verification number.",function(b,g){var f=$(g.id.substr(0,g.id.indexOf("_cc_cid"))+"_cc_type");if(!f){return true}var d=f.value;if(typeof Validation.creditCartTypes.get(d)=="undefined"){return false}var e=Validation.creditCartTypes.get(d)[1];if(b.match(e)){return true}return false}],["validate-ajax","",function(b,d){return true}],["validate-data","Please use only letters (a-z or A-Z), numbers (0-9) or underscore (_) in this field, and the first character should be a letter.",function(b){if(b!=""&&b){return/^[A-Za-z]+[A-Za-z0-9_]+$/.test(b)}return true}],["validate-css-length","Please input a valid CSS-length (Ex: 100px, 77pt, 20em, .5ex or 50%).",function(b){if(b!=""&&b){return/^[0-9\.]+(px|pt|em|ex|%)?$/.test(b)&&(!(/\..*\./.test(b)))&&!(/\.$/.test(b))}return true}],["validate-length","Text length does not meet the specified text range.",function(d,g){var e=new RegExp(/^maximum-length-[0-9]+$/);var f=new RegExp(/^minimum-length-[0-9]+$/);var b=true;$w(g.className).each(function(l,h){if(l.match(e)&&b){var n=l.split("-")[2];b=(d.length<=n)}if(l.match(f)&&b&&!Validation.get("IsEmpty").test(d)){var n=l.split("-")[2];b=(d.length>=n)}});return b}],["validate-percents","Please enter a number lower than 100.",{max:100}],["required-file","Please select a file.",function(d,e){var b=!Validation.get("IsEmpty").test(d);if(b===false){ovId=e.id+"_value";if($(ovId)){b=!Validation.get("IsEmpty").test($(ovId).value)}}return b}],["validate-cc-ukss","Please enter issue number or start date for switch/solo card type.",function(o,g){var b;if(g.id.match(/(.)+_cc_issue$/)){b=g.id.indexOf("_cc_issue")}else{if(g.id.match(/(.)+_start_month$/)){b=g.id.indexOf("_start_month")}else{b=g.id.indexOf("_start_year")}}var f=g.id.substr(0,b);var d=$(f+"_cc_type");if(!d){return true}var n=d.value;if(["SS","SM","SO"].indexOf(n)==-1){return true}$(f+"_cc_issue").advaiceContainer=$(f+"_start_month").advaiceContainer=$(f+"_start_year").advaiceContainer=$(f+"_cc_type_ss_div").down(".adv-container");var h=$(f+"_cc_issue").value;var l=$(f+"_start_month").value;var p=$(f+"_start_year").value;var e=(l&&p)?true:false;if(!e&&!h){return false}return true}]]);function removeDelimiters(b){b=b.replace(/\s/g,"");b=b.replace(/\-/g,"");return b}function parseNumber(b){if(typeof b!="string"){return parseFloat(b)}var e=b.indexOf(".");var d=b.indexOf(",");if(e!=-1&&d!=-1){if(d>e){b=b.replace(".","").replace(",",".")}else{b=b.replace(",","")}}else{if(d!=-1){b=b.replace(",",".")}}return parseFloat(b)}Validation.creditCartTypes=$H({SO:[new RegExp("^(6334[5-9]([0-9]{11}|[0-9]{13,14}))|(6767([0-9]{12}|[0-9]{14,15}))$"),new RegExp("^([0-9]{3}|[0-9]{4})?$"),true],SM:[new RegExp("(^(5[0678])[0-9]{11,18}$)|(^(6[^05])[0-9]{11,18}$)|(^(601)[^1][0-9]{9,16}$)|(^(6011)[0-9]{9,11}$)|(^(6011)[0-9]{13,16}$)|(^(65)[0-9]{11,13}$)|(^(65)[0-9]{15,18}$)|(^(49030)[2-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49033)[5-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49110)[1-2]([0-9]{10}$|[0-9]{12,13}$))|(^(49117)[4-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49118)[0-2]([0-9]{10}$|[0-9]{12,13}$))|(^(4936)([0-9]{12}$|[0-9]{14,15}$))"),new RegExp("^([0-9]{3}|[0-9]{4})?$"),true],VI:[new RegExp("^4[0-9]{12}([0-9]{3})?$"),new RegExp("^[0-9]{3}$"),true],MC:[new RegExp("^5[1-5][0-9]{14}$"),new RegExp("^[0-9]{3}$"),true],AE:[new RegExp("^3[47][0-9]{13}$"),new RegExp("^[0-9]{4}$"),true],DI:[new RegExp("^6(011|4[4-9][0-9]|5[0-9]{2})[0-9]{12}$"),new RegExp("^[0-9]{3}$"),true],JCB:[new RegExp("^(3[0-9]{15}|(2131|1800)[0-9]{11})$"),new RegExp("^[0-9]{3,4}$"),true],OT:[false,new RegExp("^([0-9]{3}|[0-9]{4})?$"),false]});function popWin(d,e,b){var e=window.open(d,e,b);e.focus()}function setLocation(b){window.location.href=b}function setPLocation(d,b){if(b){window.opener.focus()}window.opener.location.href=d}function setLanguageCode(e,f){var b=window.location.href;var h="",g;if(g=b.match(/\#(.*)$/)){b=b.replace(/\#(.*)$/,"");h=g[0]}if(b.match(/[?]/)){var d=/([?&]store=)[a-z0-9_]*/;if(b.match(d)){b=b.replace(d,"$1"+e)}else{b+="&store="+e}var d=/([?&]from_store=)[a-z0-9_]*/;if(b.match(d)){b=b.replace(d,"")}}else{b+="?store="+e}if(typeof(f)!="undefined"){b+="&from_store="+f}b+=h;setLocation(b)}function decorateGeneric(h,e){var l=["odd","even","first","last"];var d={};var g=h.length;if(g){if(typeof(e)=="undefined"){e=l}if(!e.length){return}for(var b in l){d[l[b]]=false}for(var b in e){d[e[b]]=true}if(d.first){Element.addClassName(h[0],"first")}if(d.last){Element.addClassName(h[g-1],"last")}for(var f=0;f<g;f++){if((f+1)%2==0){if(d.even){Element.addClassName(h[f],"even")}}else{if(d.odd){Element.addClassName(h[f],"odd")}}}}}function decorateTable(h,e){var h=$(h);if(h){var b={tbody:false,"tbody tr":["odd","even","first","last"],"thead tr":["first","last"],"tfoot tr":["first","last"],"tr td":["last"]};if(typeof(e)!="undefined"){for(var d in e){b[d]=e[d]}}if(b.tbody){decorateGeneric(h.select("tbody"),b.tbody)}if(b["tbody tr"]){decorateGeneric(h.select("tbody tr"),b["tbody tr"])}if(b["thead tr"]){decorateGeneric(h.select("thead tr"),b["thead tr"])}if(b["tfoot tr"]){decorateGeneric(h.select("tfoot tr"),b["tfoot tr"])}if(b["tr td"]){var g=h.select("tr");if(g.length){for(var f=0;f<g.length;f++){decorateGeneric(g[f].getElementsByTagName("TD"),b["tr td"])}}}}}function decorateList(e,d){if($(e)){if(typeof(d)=="undefined"){var b=$(e).select("li")}else{var b=$(e).childElements()}decorateGeneric(b,["odd","even","last"])}}function decorateDataList(b){b=$(b);if(b){decorateGeneric(b.select("dt"),["odd","even","last"]);decorateGeneric(b.select("dd"),["odd","even","last"])}}function parseSidUrl(f,e){var d=f.indexOf("/?SID=");var b="";e=(e!=undefined)?e:"";if(d>-1){b="?"+f.substring(d+2);f=f.substring(0,d+1)}return f+e+b}function formatCurrency(n,q,g){var l=isNaN(q.precision=Math.abs(q.precision))?2:q.precision;var v=isNaN(q.requiredPrecision=Math.abs(q.requiredPrecision))?2:q.requiredPrecision;l=v;var t=isNaN(q.integerRequired=Math.abs(q.integerRequired))?1:q.integerRequired;var p=q.decimalSymbol==undefined?",":q.decimalSymbol;var e=q.groupSymbol==undefined?".":q.groupSymbol;var d=q.groupLength==undefined?3:q.groupLength;var u="";if(g==undefined||g==true){u=n<0?"-":(g?"+":"")}else{if(g==false){u=""}}var h=parseInt(n=Math.abs(+n||0).toFixed(l))+"";var f=(h.length<t)?(t-h.length):0;while(f){h="0"+h;f--}j=(j=h.length)>d?j%d:0;re=new RegExp("(\\d{"+d+"})(?=\\d)","g");var b=(j?h.substr(0,j)+e:"")+h.substr(j).replace(re,"$1"+e)+(l?p+Math.abs(n-h).toFixed(l).replace(/-/,0).slice(2):"");var o="";if(q.pattern.indexOf("{sign}")==-1){o=u+q.pattern}else{o=q.pattern.replace("{sign}",u)}return o.replace("%s",b).replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function expandDetails(d,b){if(Element.hasClassName(d,"show-details")){$$(b).each(function(e){e.hide()});Element.removeClassName(d,"show-details")}else{$$(b).each(function(e){e.show()});Element.addClassName(d,"show-details")}}var isIE=navigator.appVersion.match(/MSIE/)=="MSIE";if(!window.Varien){var Varien=new Object()}Varien.showLoading=function(){var b=$("loading-process");b&&b.show()};Varien.hideLoading=function(){var b=$("loading-process");b&&b.hide()};Varien.GlobalHandlers={onCreate:function(){Varien.showLoading()},onComplete:function(){if(Ajax.activeRequestCount==0){Varien.hideLoading()}}};Ajax.Responders.register(Varien.GlobalHandlers);Varien.searchForm=Class.create();Varien.searchForm.prototype={initialize:function(d,e,b){this.form=$(d);this.field=$(e);this.emptyText=b;Event.observe(this.form,"submit",this.submit.bind(this));Event.observe(this.field,"focus",this.focus.bind(this));Event.observe(this.field,"blur",this.blur.bind(this));this.blur()},submit:function(b){if(this.field.value==this.emptyText||this.field.value==""){Event.stop(b);return false}return true},focus:function(b){if(this.field.value==this.emptyText){this.field.value=""}},blur:function(b){if(this.field.value==""){this.field.value=this.emptyText}}};Varien.DateElement=Class.create();Varien.DateElement.prototype={initialize:function(b,d,f,e){if(b=="id"){this.day=$(d+"day");this.month=$(d+"month");this.year=$(d+"year");this.full=$(d+"full");this.advice=$(d+"date-advice")}else{if(b=="container"){this.day=d.day;this.month=d.month;this.year=d.year;this.full=d.full;this.advice=d.advice}else{return}}this.required=f;this.format=e;this.day.addClassName("validate-custom");this.day.validate=this.validate.bind(this);this.month.addClassName("validate-custom");this.month.validate=this.validate.bind(this);this.year.addClassName("validate-custom");this.year.validate=this.validate.bind(this);this.setDateRange(false,false);this.year.setAttribute("autocomplete","off");this.advice.hide()},validate:function(){var l=false,o=parseInt(this.day.value,10)||0,f=parseInt(this.month.value,10)||0,h=parseInt(this.year.value,10)||0;if(this.day.value.strip().empty()&&this.month.value.strip().empty()&&this.year.value.strip().empty()){if(this.required){l="Please enter a date."}else{this.full.value=""}}else{if(!o||!f||!h){l="Please enter a valid full date."}else{var d=new Date,n=0,e=null;d.setYear(h);d.setMonth(f-1);d.setDate(32);n=32-d.getDate();if(!n||n>31){n=31}if(o<1||o>n){e="day";l="Please enter a valid day (1-%1)."}else{if(f<1||f>12){e="month";l="Please enter a valid month (1-12)."}else{if(o%10==o){this.day.value="0"+o}if(f%10==f){this.month.value="0"+f}this.full.value=this.format.replace(/%[mb]/i,this.month.value).replace(/%[de]/i,this.day.value).replace(/%y/i,this.year.value);var b=this.month.value+"/"+this.day.value+"/"+this.year.value;var g=new Date(b);if(isNaN(g)){l="Please enter a valid date."}else{this.setFullDate(g)}}}var p=false;if(!l&&!this.validateData()){e=this.validateDataErrorType;p=this.validateDataErrorText;l=p}}}if(l!==false){if(jQuery.mage.__){l=jQuery.mage.__(l)}if(!p){this.advice.innerHTML=l.replace("%1",n)}else{this.advice.innerHTML=this.errorTextModifier(l)}this.advice.show();return false}this.day.removeClassName("validation-failed");this.month.removeClassName("validation-failed");this.year.removeClassName("validation-failed");this.advice.hide();return true},validateData:function(){var d=this.fullDate.getFullYear();var b=new Date;this.curyear=b.getFullYear();return(d>=1900&&d<=this.curyear)},validateDataErrorType:"year",validateDataErrorText:"Please enter a valid year (1900-%1).",errorTextModifier:function(b){return b.replace("%1",this.curyear)},setDateRange:function(b,d){this.minDate=b;this.maxDate=d},setFullDate:function(b){this.fullDate=b}};Varien.DOB=Class.create();Varien.DOB.prototype={initialize:function(b,g,f){var e=$$(b)[0];var d={};d.day=Element.select(e,".dob-day input")[0];d.month=Element.select(e,".dob-month input")[0];d.year=Element.select(e,".dob-year input")[0];d.full=Element.select(e,".dob-full input")[0];d.advice=Element.select(e,".validation-advice")[0];new Varien.DateElement("container",d,g,f)}};Varien.dateRangeDate=Class.create();Varien.dateRangeDate.prototype=Object.extend(new Varien.DateElement(),{validateData:function(){var b=true;if(this.minDate||this.maxValue){if(this.minDate){this.minDate=new Date(this.minDate);this.minDate.setHours(0);if(isNaN(this.minDate)){this.minDate=new Date("1/1/1900")}b=b&&(this.fullDate>=this.minDate)}if(this.maxDate){this.maxDate=new Date(this.maxDate);this.minDate.setHours(0);if(isNaN(this.maxDate)){this.maxDate=new Date()}b=b&&(this.fullDate<=this.maxDate)}if(this.maxDate&&this.minDate){this.validateDataErrorText="Please enter a valid date between %s and %s"}else{if(this.maxDate){this.validateDataErrorText="Please enter a valid date less than or equal to %s"}else{if(this.minDate){this.validateDataErrorText="Please enter a valid date equal to or greater than %s"}else{this.validateDataErrorText=""}}}}return b},validateDataErrorText:"Date should be between %s and %s",errorTextModifier:function(b){if(this.minDate){b=b.sub("%s",this.dateFormat(this.minDate))}if(this.maxDate){b=b.sub("%s",this.dateFormat(this.maxDate))}return b},dateFormat:function(b){return(b.getMonth()+1)+"/"+b.getDate()+"/"+b.getFullYear()}});Varien.FileElement=Class.create();Varien.FileElement.prototype={initialize:function(b){this.fileElement=$(b);this.hiddenElement=$(b+"_value");this.fileElement.observe("change",this.selectFile.bind(this))},selectFile:function(b){this.hiddenElement.value=this.fileElement.getValue()}};Validation.addAllThese([["validate-custom"," ",function(b,d){return d.validate()}]]);Element.addMethods({getInnerText:function(b){b=$(b);if(b.innerText&&!Prototype.Browser.Opera){return b.innerText}return b.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g," ").strip()}});function fireEvent(d,e){if(document.createEvent){var b=document.createEvent("HTMLEvents");b.initEvent(e,true,true);return d.dispatchEvent(b)}else{var b=document.createEventObject();return d.fireEvent("on"+e,b)}}function modulo(b,f){var e=f/10000;var d=b%f;if(Math.abs(d-f)<e||Math.abs(d)<e){d=0}return d}if((typeof Range!="undefined")&&!Range.prototype.createContextualFragment){Range.prototype.createContextualFragment=function(b){var e=document.createDocumentFragment(),d=document.createElement("div");e.appendChild(d);d.outerHTML=b;return e}}var byteConvert=function(b){if(isNaN(b)){return""}var d=["bytes","KB","MB","GB","TB","PB","EB","ZB","YB"];var f=Math.floor(Math.log(b)/Math.log(2));if(f<1){f=0}var e=Math.floor(f/10);b=b/Math.pow(2,10*e);if(b.toString().length>b.toFixed(2).toString().length){b=b.toFixed(2)}return b+" "+d[e]};var SessionError=Class.create();SessionError.prototype={initialize:function(b){this.errorText=b},toString:function(){return"Session Error:"+this.errorText}};Ajax.Request.addMethods({initialize:function($super,d,b){$super(b);this.transport=Ajax.getTransport();if(!d.match(new RegExp("[?&]isAjax=true",""))){d=d.match(new RegExp("\\?","g"))?d+"&isAjax=true":d+"?isAjax=true"}if(Object.isString(this.options.parameters)&&this.options.parameters.indexOf("form_key=")==-1){this.options.parameters+="&"+Object.toQueryString({form_key:FORM_KEY})}else{if(!this.options.parameters){this.options.parameters={form_key:FORM_KEY}}if(!this.options.parameters.form_key){this.options.parameters.form_key=FORM_KEY}}this.request(d)},respondToReadyState:function(b){var g=Ajax.Request.Events[b],d=new Ajax.Response(this);if(g=="Complete"){try{this._complete=true;if(d.responseText.isJSON()){var f=d.responseText.evalJSON();if(f.ajaxExpired&&f.ajaxRedirect){window.location.replace(f.ajaxRedirect);throw new SessionError("session expired")}}(this.options["on"+d.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(d,d.headerJSON)}catch(h){this.dispatchException(h);if(h instanceof SessionError){return}}var l=d.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&l&&l.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse()}}try{(this.options["on"+g]||Prototype.emptyFunction)(d,d.headerJSON);Ajax.Responders.dispatch("on"+g,this,d,d.headerJSON)}catch(h){this.dispatchException(h)}if(g=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction}}});Ajax.Updater.respondToReadyState=Ajax.Request.respondToReadyState;var varienLoader=new Class.create();varienLoader.prototype={initialize:function(b){this.callback=false;this.cache=$H();this.caching=b||false;this.url=false},getCache:function(b){if(this.cache.get(b)){return this.cache.get(b)}return false},load:function(b,d,f){this.url=b;this.callback=f;if(this.caching){var e=this.getCache(b);if(e){this.processResult(e);return}}if(typeof(d.updaterId)!="undefined"){new varienUpdater(d.updaterId,b,{evalScripts:true,onComplete:this.processResult.bind(this),onFailure:this._processFailure.bind(this)})}else{new Ajax.Request(b,{method:"post",parameters:d||{},onComplete:this.processResult.bind(this),onFailure:this._processFailure.bind(this)})}},_processFailure:function(b){location.href=BASE_URL},processResult:function(b){if(this.caching){this.cache.set(this.url,b)}if(this.callback){this.callback(b.responseText)}}};if(!window.varienLoaderHandler){var varienLoaderHandler=new Object()}varienLoaderHandler.handler={onCreate:function(b){if(b.options.loaderArea===false){return}jQuery("body").trigger("processStart")},onException:function(b){jQuery("body").trigger("processStop")},onComplete:function(b){jQuery("body").trigger("processStop")}};function setLoaderPosition(){var e=$("loading_mask_loader");if(e&&Prototype.Browser.IE){var d=e.getDimensions();var f=document.viewport.getDimensions();var b=document.viewport.getScrollOffsets();e.style.left=Math.floor(f.width/2+b.left-d.width/2)+"px";e.style.top=Math.floor(f.height/2+b.top-d.height/2)+"px";e.style.position="absolute"}}function toggleSelectsUnderBlock(f,b){if(Prototype.Browser.IE){var e=document.getElementsByTagName("select");for(var d=0;d<e.length;d++){if(b){if(e[d].needShowOnSuccess){e[d].needShowOnSuccess=false;e[d].style.visibility=""}}else{if(Element.visible(e[d])){e[d].style.visibility="hidden";e[d].needShowOnSuccess=true}}}}}Ajax.Responders.register(varienLoaderHandler.handler);var varienUpdater=Class.create(Ajax.Updater,{updateContent:function($super,b){if(b.isJSON()){var d=b.evalJSON();if(d.ajaxExpired&&d.ajaxRedirect){window.location.replace(d.ajaxRedirect)}}else{$super(b)}}});function setLocation(b){window.location.href=b}function setElementDisable(d,b){if($(d)){$(d).disabled=b}}function toggleParentVis(b){b=$(b).parentNode;if(b.style.display=="none"){b.style.display=""}else{b.style.display="none"}}function toggleFieldsetVis(d){id=d;d=$(d);if(d.style.display=="none"){d.style.display=""}else{d.style.display="none"}d=d.parentNode.childElements();for(var b=0;b<d.length;b++){if(d[b].id!=undefined&&d[b].id==id&&d[(b-1)].classNames()=="entry-edit-head"){if(d[b-1].style.display=="none"){d[b-1].style.display=""}else{d[b-1].style.display="none"}}}}function toggleVis(b){b=$(b);if(b.style.display=="none"){b.style.display=""}else{b.style.display="none"}}function imagePreview(b){if($(b)){var d=window.open("","preview","width=400,height=400,resizable=1,scrollbars=1");d.document.open();d.document.write('<body style="padding:0;margin:0"><img src="'+$(b).src+'" id="image_preview"/></body>');d.document.close();Event.observe(d,"load",function(){var e=d.document.getElementById("image_preview");d.resizeTo(e.width+40,e.height+80)})}}function checkByProductPriceType(b){if(b.id=="price_type"){this.productPriceType=b.value;return false}else{if(b.id=="price"&&this.productPriceType==0){return false}return true}}Event.observe(window,"load",function(){if($("price_default")&&$("price_default").checked){$("price").disabled="disabled"}});function toggleSeveralValueElements(f,e,b,d){if(e&&f){if(Object.prototype.toString.call(e)!="[object Array]"){e=[e]}e.each(function(g){toggleValueElements(f,g,b,d)})}}function toggleValueElements(l,d,f,h){if(d&&l){var n=[l];if(typeof f!="undefined"){if(Object.prototype.toString.call(f)!="[object Array]"){f=[f]}for(var g=0;g<f.length;g++){n.push(f[g])}}var e=Element.select(d,["select","input","textarea","button","img"]).filter(function(o){return(o.readAttribute("type")!="hidden")});var b=(h!=undefined?h:l.checked);e.each(function(p){if(checkByProductPriceType(p)){var o=n.length;while(o--&&p!=n[o]){}if(o!=-1){return}p.disabled=b;if(b){p.addClassName("disabled")}else{p.removeClassName("disabled")}if(p.nodeName.toLowerCase()=="img"){b?p.hide():p.show()}}})}}function submitAndReloadArea(e,d){if($(e)){var b=$(e).select("input","select","textarea");var f=Form.serializeElements(b,true);d=d+(d.match(new RegExp("\\?"))?"&isAjax=true":"?isAjax=true");new Ajax.Request(d,{parameters:$H(f),loaderArea:e,onSuccess:function(l){try{if(l.responseText.isJSON()){var g=l.responseText.evalJSON();if(g.error){alert(g.message)}if(g.ajaxExpired&&g.ajaxRedirect){setLocation(g.ajaxRedirect)}}else{$(e).update(l.responseText)}}catch(h){$(e).update(l.responseText)}}})}}function syncOnchangeValue(d,e){var b={baseElem:d,distElem:e};Event.observe(d,"change",function(){if($(this.baseElem)&&$(this.distElem)){$(this.distElem).value=$(this.baseElem).value}}.bind(b))}function updateElementAtCursor(e,f,g){if(g==undefined){g=window.self}if(document.selection){e.focus();sel=g.document.selection.createRange();sel.text=f}else{if(e.selectionStart||e.selectionStart=="0"){var d=e.selectionStart;var b=e.selectionEnd;e.value=e.value.substring(0,d)+f+e.value.substring(b,e.value.length)}else{e.value+=f}}}function firebugEnabled(){if(window.console&&window.console.firebug){return true}return false}function disableElement(b){b.disabled=true;b.addClassName("disabled")}function enableElement(b){b.disabled=false;b.removeClassName("disabled")}function disableElements(b){$$("."+b).each(disableElement)}function enableElements(b){$$("."+b).each(enableElement)}var Cookie={all:function(){var d=document.cookie.split(";");var b={};d.each(function(f,e){var g=f.strip().split("=");b[unescape(g[0])]=unescape(g[1])});return b},read:function(d){var b=this.all();if(b[d]){return b[d]}return null},write:function(h,f,g){var b="";if(g){var e=new Date();e.setTime(e.getTime()+(g*1000));b="; expires="+e.toGMTString()}var d="/"+BASE_URL.split("/").slice(3).join("/");document.cookie=escape(h)+"="+escape(f)+b+"; path="+d},clear:function(b){this.write(b,"",-1)}};var Fieldset={cookiePrefix:"fh-",applyCollapse:function(b){if($(b+"-state")){collapsed=$(b+"-state").value==1?0:1}else{collapsed=$(b+"-head").collapsed}if(collapsed==1||collapsed===undefined){$(b+"-head").removeClassName("open");if($(b+"-head").up(".section-config")){$(b+"-head").up(".section-config").removeClassName("active")}$(b).hide()}else{$(b+"-head").addClassName("open");if($(b+"-head").up(".section-config")){$(b+"-head").up(".section-config").addClassName("active")}$(b).show()}},toggleCollapse:function(b,d){if($(b+"-state")){collapsed=$(b+"-state").value==1?0:1}else{collapsed=$(b+"-head").collapsed}if(collapsed==1||collapsed===undefined){if($(b+"-state")){$(b+"-state").value=1}$(b+"-head").collapsed=0}else{if($(b+"-state")){$(b+"-state").value=0}$(b+"-head").collapsed=1}this.applyCollapse(b);if(typeof d!="undefined"){this.saveState(d,{container:b,value:$(b+"-state").value})}},addToPrefix:function(b){this.cookiePrefix+=b+"-"},saveState:function(b,d){new Ajax.Request(b,{method:"get",parameters:Object.toQueryString(d),loaderArea:false})}};var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var b="";var p,n,h,o,l,g,f;var d=0;if(typeof window.btoa==="function"){return window.btoa(e)}e=Base64._utf8_encode(e);while(d<e.length){p=e.charCodeAt(d++);n=e.charCodeAt(d++);h=e.charCodeAt(d++);o=p>>2;l=((p&3)<<4)|(n>>4);g=((n&15)<<2)|(h>>6);f=h&63;if(isNaN(n)){g=f=64}else{if(isNaN(h)){f=64}}b=b+this._keyStr.charAt(o)+this._keyStr.charAt(l)+this._keyStr.charAt(g)+this._keyStr.charAt(f)}return b},decode:function(e){var b="";var p,n,h;var o,l,g,f;var d=0;if(typeof window.atob==="function"){return window.atob(e)}e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(d<e.length){o=this._keyStr.indexOf(e.charAt(d++));l=this._keyStr.indexOf(e.charAt(d++));g=this._keyStr.indexOf(e.charAt(d++));f=this._keyStr.indexOf(e.charAt(d++));p=(o<<2)|(l>>4);n=((l&15)<<4)|(g>>2);h=((g&3)<<6)|f;b=b+String.fromCharCode(p);if(g!=64){b=b+String.fromCharCode(n)}if(f!=64){b=b+String.fromCharCode(h)}}b=Base64._utf8_decode(b);return b},mageEncode:function(b){return this.encode(b).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,",")},mageDecode:function(b){b=b.replace(/\-/g,"+").replace(/_/g,"/").replace(/,/g,"=");return this.decode(b)},idEncode:function(b){return this.encode(b).replace(/\+/g,":").replace(/\//g,"_").replace(/=/g,"-")},idDecode:function(b){b=b.replace(/\-/g,"=").replace(/_/g,"/").replace(/\:/g,"+");return this.decode(b)},_utf8_encode:function(d){d=d.replace(/\r\n/g,"\n");var b="";for(var f=0;f<d.length;f++){var e=d.charCodeAt(f);if(e<128){b+=String.fromCharCode(e)}else{if((e>127)&&(e<2048)){b+=String.fromCharCode((e>>6)|192);b+=String.fromCharCode((e&63)|128)}else{b+=String.fromCharCode((e>>12)|224);b+=String.fromCharCode(((e>>6)&63)|128);b+=String.fromCharCode((e&63)|128)}}}return b},_utf8_decode:function(b){var d="";var e=0;var f=c1=c2=0;while(e<b.length){f=b.charCodeAt(e);if(f<128){d+=String.fromCharCode(f);e++}else{if((f>191)&&(f<224)){c2=b.charCodeAt(e+1);d+=String.fromCharCode(((f&31)<<6)|(c2&63));e+=2}else{c2=b.charCodeAt(e+1);c3=b.charCodeAt(e+2);d+=String.fromCharCode(((f&15)<<12)|((c2&63)<<6)|(c3&63));e+=3}}}return d}};function sortNumeric(d,b){return d-b}(function(){var globals=["Prototype","Abstract","Try","Class","PeriodicalExecuter","Template","$break","Enumerable","$A","$w","$H","Hash","$R","ObjectRange","Ajax","$","Form","Field","$F","Toggle","Insertion","$continue","Position","Windows","Dialog","array","WindowUtilities","Builder","Effect","validateCreditCard","Validator","Validation","removeDelimiters","parseNumber","popWin","setLocation","setPLocation","setLanguageCode","decorateGeneric","decorateTable","decorateList","decorateDataList","parseSidUrl","formatCurrency","expandDetails","isIE","Varien","fireEvent","modulo","byteConvert","SessionError","varienLoader","varienLoaderHandler","setLoaderPosition","toggleSelectsUnderBlock","varienUpdater","setElementDisable","toggleParentVis","toggleFieldsetVis","toggleVis","imagePreview","checkByProductPriceType","toggleSeveralValueElements","toggleValueElements","submitAndReloadArea","syncOnchangeValue","updateElementAtCursor","firebugEnabled","disableElement","enableElement","disableElements","enableElements","Cookie","Fieldset","Base64","sortNumeric","Element","$$","Sizzle","Selector","Window"];globals.forEach(function(prop){window[prop]=eval(prop)})})(); \ No newline at end of file diff --git a/lib/web/mage/adminhtml/tools.js b/lib/web/mage/adminhtml/tools.js index d936857d8daeec06dd2223537645ebee03d87418..336fc2d4d0c9e0365c855ef793c98cba2d9dcedf 100644 --- a/lib/web/mage/adminhtml/tools.js +++ b/lib/web/mage/adminhtml/tools.js @@ -6,17 +6,6 @@ function setLocation(url){ window.location.href = url; } -function confirmSetLocation(message, url){ - if( confirm(message) ) { - setLocation(url); - } - return false; -} - -function deleteConfirm(message, url) { - confirmSetLocation(message, url); -} - function setElementDisable(element, disable){ if($(element)){ $(element).disabled = disable; diff --git a/lib/web/mage/gallery/gallery.js b/lib/web/mage/gallery/gallery.js index 245f08f824bd9cb0ab063778b0b328e1d96a59a2..75594a9dfd0c5f0a7980b3fcd3830946e4afd24e 100644 --- a/lib/web/mage/gallery/gallery.js +++ b/lib/web/mage/gallery/gallery.js @@ -90,13 +90,15 @@ define([ this.initApi(); this.setupBreakpoints(); this.initFullscreenSettings(); - this.settings.$element.on('click', '.fotorama__stage__frame', function () { - $('[data-gallery-role="gallery"]').data('fotorama').requestFullScreen(); - $('[data-gallery-role="fotorama__fullscreen-icon"]').css({ - opacity: 1, - visibility: 'visible', - display: 'block' - }); + this.settings.$element.on('mouseup', '.fotorama__stage__frame', function () { + if (!$(this).parents('.fotorama__shadows--left').length) { + $('[data-gallery-role="gallery"]').data('fotorama').requestFullScreen(); + $('[data-gallery-role="fotorama__fullscreen-icon"]').css({ + opacity: 1, + visibility: 'visible', + display: 'block' + }); + } }); }, diff --git a/lib/web/mage/utils/compare.js b/lib/web/mage/utils/compare.js index 2cae7362a2109dc86c5f403b3ea661a8913ef38f..c079b087a9d6083cda62277ffe8fac99aaaac5a0 100644 --- a/lib/web/mage/utils/compare.js +++ b/lib/web/mage/utils/compare.js @@ -66,7 +66,8 @@ define([ } /** - * + * @param {String} prefix + * @param {String} part */ function getPath(prefix, part) { return prefix ? prefix + '.' + part : part; @@ -84,7 +85,7 @@ define([ } /** - * + * @param {Array} changes */ function getContainers(changes) { var containers = {}, @@ -108,7 +109,11 @@ define([ } /** - * + * @param {String} path + * @param {String} name + * @param {String} type + * @param {String} newValue + * @param {String} oldValue */ function addChange(path, name, type, newValue, oldValue) { var data; @@ -130,7 +135,11 @@ define([ } /** - * + * @param {String} ns + * @param {String} name + * @param {String} type + * @param {String} iterator + * @param {String} placeholder */ function setAll(ns, name, type, iterator, placeholder) { var key; @@ -156,7 +165,10 @@ define([ /*eslint-disable max-depth*/ /** - * + * @param {Object} old + * @param {Object} current + * @param {String} ns + * @param {String} name */ function compare(old, current, ns, name) { var key, diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js index 36a8db34b3f43d5c9885a1a9bf0f883cea1a61dc..231fb3afa24cce918152379d42f455fcc951b096 100644 --- a/lib/web/mage/validation.js +++ b/lib/web/mage/validation.js @@ -1239,6 +1239,17 @@ }, 'Please enter a valid number.' ], + 'required-swatch-entry': [ + function (value, element) { + var empty = $(element).closest('table') + .find('input.required-option') + .filter(function(i, el){ + return $.mage.isEmpty(el.value); + }) + .length; + return empty === 0; + }, 'Admin is a required field in the each row.' + ], 'validate-item-quantity': [ function (value, element, params) { // obtain values for validation diff --git a/package.json b/package.json index 8869196abeffc1653e34681226e7293a9c71c179..2caa552da3e04113e5edd6a2b733c29a358e5042 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,9 @@ "grunt-contrib-jasmine": "^0.8.1", "grunt-contrib-less": "^0.12.0", "grunt-contrib-watch": "^0.6.1", - "grunt-eslint": "^17.0.0", + "grunt-eslint": "17.3.1", "grunt-exec": "^0.4.6", - "grunt-jscs": "^2.1.0", + "grunt-jscs": "2.2.0", "grunt-replace": "^0.9.2", "grunt-styledocco": "^0.1.4", "grunt-template-jasmine-requirejs": "^0.2.3", diff --git a/pub/.htaccess b/pub/.htaccess index 6e6f63c43581f2cb307f894376f92f02a0574fcc..120d7eb5a08d9adb1d6cb9bb3ecce485b4763892 100644 --- a/pub/.htaccess +++ b/pub/.htaccess @@ -57,6 +57,32 @@ </IfModule> +<IfModule mod_php7.c> + +############################################ +## adjust memory limit + + php_value memory_limit 256M + php_value max_execution_time 18000 + +############################################ +## disable automatic session start +## before autoload was initialized + + php_flag session.auto_start off + +############################################ +## enable resulting html compression + + #php_flag zlib.output_compression on + +########################################### +# disable user agent verification to not break multiple image upload + + php_flag suhosin.session.cryptua off + +</IfModule> + <IfModule mod_security.c> ########################################### # disable POST processing to not break multiple image upload diff --git a/pub/media/.htaccess b/pub/media/.htaccess index f2751570906a53719d522d910be118f77ffcedaf..865ebd31b528b8183593ee5e55894dedc53a46fd 100644 --- a/pub/media/.htaccess +++ b/pub/media/.htaccess @@ -1,8 +1,13 @@ Options All -Indexes + <IfModule mod_php5.c> php_flag engine 0 </IfModule> +<IfModule mod_php7.c> +php_flag engine 0 +</IfModule> + AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi Options -ExecCGI diff --git a/pub/static/.htaccess b/pub/static/.htaccess index c96881a49c63ff713f87d9148f6f8c5816ecfeb8..56ceaf0570999e24dbab3f0c380c79505e6c69c5 100644 --- a/pub/static/.htaccess +++ b/pub/static/.htaccess @@ -2,6 +2,10 @@ php_flag engine 0 </IfModule> +<IfModule mod_php7.c> +php_flag engine 0 +</IfModule> + # To avoid situation when web server automatically adds extension to path Options -MultiViews diff --git a/setup/config/di.config.php b/setup/config/di.config.php index e7f0ac693af6cfc74d8ec18a9b98ac2585e952b3..ada024a3dcb0de53f563780f2d62c8384b4b1b05 100644 --- a/setup/config/di.config.php +++ b/setup/config/di.config.php @@ -19,6 +19,7 @@ return [ 'Magento\Setup\Controller\ReadinessCheckInstaller', 'Magento\Setup\Controller\ReadinessCheckUpdater', 'Magento\Setup\Controller\Environment', + 'Magento\Setup\Controller\DependencyCheck', 'Magento\Setup\Controller\DatabaseCheck', 'Magento\Setup\Controller\AddDatabase', 'Magento\Setup\Controller\WebConfiguration', diff --git a/setup/performance-toolkit/benchmark.jmx b/setup/performance-toolkit/benchmark.jmx index 45bd1d57a1e6bb44efcbea4d81a98f7ea9422134..c5060028b3454fdf63b76b3faf7467e57b5cdf35 100644 --- a/setup/performance-toolkit/benchmark.jmx +++ b/setup/performance-toolkit/benchmark.jmx @@ -7,50 +7,246 @@ --> <jmeterTestPlan version="1.2" properties="2.8" jmeter="2.13 r1665067"> <hashTree> - <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Toolkit" enabled="true"> + <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Performance Toolkit" enabled="true"> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> + <stringProp name="TestPlan.user_define_classpath"></stringProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> - <elementProp name="host" elementType="Argument"> - <stringProp name="Argument.name">host</stringProp> - <stringProp name="Argument.value">${__P(host,localhost)}</stringProp> + <elementProp name="abandonedCartByGuest" elementType="Argument"> + <stringProp name="Argument.name">abandonedCartByGuest</stringProp> + <stringProp name="Argument.value">${__P(abandonedCartByGuest,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="abandonedCartByCustomer" elementType="Argument"> + <stringProp name="Argument.name">abandonedCartByCustomer</stringProp> + <stringProp name="Argument.value">${__P(abandonedCartByCustomer,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="admin_delay" elementType="Argument"> + <stringProp name="Argument.name">admin_delay</stringProp> + <stringProp name="Argument.value">${__P(admin_delay,150)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="admin_enabled" elementType="Argument"> + <stringProp name="Argument.name">admin_enabled</stringProp> + <stringProp name="Argument.value">${__P(admin_enabled,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="admin_password" elementType="Argument"> + <stringProp name="Argument.name">admin_password</stringProp> + <stringProp name="Argument.value">${__P(admin_password,123123q)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="admin_path" elementType="Argument"> + <stringProp name="Argument.name">admin_path</stringProp> + <stringProp name="Argument.value">${__P(admin_path,admin)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="admin_user" elementType="Argument"> + <stringProp name="Argument.name">admin_user</stringProp> + <stringProp name="Argument.value">${__P(admin_user,admin)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseCustomersGridScenario1_ViewOddGridPages" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseCustomersGridScenario1_ViewOddGridPages</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseCustomersGridScenario1_ViewOddGridPages,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseCustomersGridScenario2_ViewEvenGridPages" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseCustomersGridScenario2_ViewEvenGridPages</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseCustomersGridScenario2_ViewEvenGridPages,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseCustomersGridScenario3_Filtering" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseCustomersGridScenario3_Filtering</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseCustomersGridScenario3_Filtering,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseCustomersGridScenario4_Sorting" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseCustomersGridScenario4_Sorting</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseCustomersGridScenario4_Sorting,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseCustomersGridScenario5_FilteringAndSorting" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseCustomersGridScenario5_FilteringAndSorting</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseCustomersGridScenario5_FilteringAndSorting,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseOrdersGridScenario1_ViewOddGridPages" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseOrdersGridScenario1_ViewOddGridPages</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseOrdersGridScenario1_ViewOddGridPages,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseOrdersGridScenario2_ViewEvenGridPages" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseOrdersGridScenario2_ViewEvenGridPages</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseOrdersGridScenario2_ViewEvenGridPages,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseOrdersGridScenario3_Filtering" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseOrdersGridScenario3_Filtering</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseOrdersGridScenario3_Filtering,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseOrdersGridScenario4_Sorting" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseOrdersGridScenario4_Sorting</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseOrdersGridScenario4_Sorting,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseOrdersGridScenario5_FilteringAndSorting" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseOrdersGridScenario5_FilteringAndSorting</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseOrdersGridScenario5_FilteringAndSorting,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseProductsGridScenario1_ViewOddGridPages" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseProductsGridScenario1_ViewOddGridPages</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseProductsGridScenario1_ViewOddGridPages,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseProductsGridScenario2_ViewEvenGridPages" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseProductsGridScenario2_ViewEvenGridPages</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseProductsGridScenario2_ViewEvenGridPages,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseProductsGridScenario3_Filtering" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseProductsGridScenario3_Filtering</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseProductsGridScenario3_Filtering,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseProductsGridScenario4_Sorting" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseProductsGridScenario4_Sorting</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseProductsGridScenario4_Sorting,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminBrowseProductsGridScenario5_FilteringAndSorting" elementType="Argument"> + <stringProp name="Argument.name">adminBrowseProductsGridScenario5_FilteringAndSorting</stringProp> + <stringProp name="Argument.value">${__P(adminBrowseProductsGridScenario5_FilteringAndSorting,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminCreateOrder" elementType="Argument"> + <stringProp name="Argument.name">adminCreateOrder</stringProp> + <stringProp name="Argument.value">${__P(adminCreateOrder,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminCreateProduct" elementType="Argument"> + <stringProp name="Argument.name">adminCreateProduct</stringProp> + <stringProp name="Argument.value">${__P(adminCreateProduct,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminEditOrder" elementType="Argument"> + <stringProp name="Argument.name">adminEditOrder</stringProp> + <stringProp name="Argument.value">${__P(adminEditOrder,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminEditProduct" elementType="Argument"> + <stringProp name="Argument.name">adminEditProduct</stringProp> + <stringProp name="Argument.value">${__P(adminEditProduct,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminExportCustomers" elementType="Argument"> + <stringProp name="Argument.name">adminExportCustomers</stringProp> + <stringProp name="Argument.value">${__P(adminExportCustomers,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminExportProducts" elementType="Argument"> + <stringProp name="Argument.name">adminExportProducts</stringProp> + <stringProp name="Argument.value">${__P(adminExportProducts,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminImportCustomerBehavior" elementType="Argument"> + <stringProp name="Argument.name">adminImportCustomerBehavior</stringProp> + <stringProp name="Argument.value">${__P(adminImportCustomerBehavior,)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminImportCustomerFilePath" elementType="Argument"> + <stringProp name="Argument.name">adminImportCustomerFilePath</stringProp> + <stringProp name="Argument.value">${__P(adminImportCustomerFilePath,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminImportCustomers" elementType="Argument"> + <stringProp name="Argument.name">adminImportCustomers</stringProp> + <stringProp name="Argument.value">${__P(adminImportCustomers,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminImportProductBehavior" elementType="Argument"> + <stringProp name="Argument.name">adminImportProductBehavior</stringProp> + <stringProp name="Argument.value">${__P(adminImportProductBehavior,)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminImportProductFilePath" elementType="Argument"> + <stringProp name="Argument.name">adminImportProductFilePath</stringProp> + <stringProp name="Argument.value">${__P(adminImportProductFilePath,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminImportProductFilePath-2" elementType="Argument"> + <stringProp name="Argument.name">adminImportProductFilePath-2</stringProp> + <stringProp name="Argument.value">${__P(adminImportProductFilePath-2,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="adminImportProducts" elementType="Argument"> + <stringProp name="Argument.name">adminImportProducts</stringProp> + <stringProp name="Argument.value">${__P(adminImportProducts,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="bamboo_build_number" elementType="Argument"> + <stringProp name="Argument.name">bamboo_build_number</stringProp> + <stringProp name="Argument.value">${__P(bamboo_build_number,)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="base_path" elementType="Argument"> <stringProp name="Argument.name">base_path</stringProp> - <stringProp name="Argument.value">${__P(base_path,/)}</stringProp> + <stringProp name="Argument.value">${__P(base_path,)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="report_save_path" elementType="Argument"> - <stringProp name="Argument.name">report_save_path</stringProp> - <stringProp name="Argument.value">${__P(report_save_path,./)}</stringProp> + <elementProp name="cache_indicator" elementType="Argument"> + <stringProp name="Argument.name">cache_indicator</stringProp> + <stringProp name="Argument.value">${__P(cache_indicator,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="ramp_period" elementType="Argument"> - <stringProp name="Argument.name">ramp_period</stringProp> - <stringProp name="Argument.value">${__P(ramp_period,300)}</stringProp> + <elementProp name="catalogBrowsingByGuest" elementType="Argument"> + <stringProp name="Argument.name">catalogBrowsingByGuest</stringProp> + <stringProp name="Argument.value">${__P(catalogBrowsingByGuest,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="orders" elementType="Argument"> - <stringProp name="Argument.name">orders</stringProp> - <stringProp name="Argument.value">${__P(orders,0)}</stringProp> + <elementProp name="catalogBrowsingByCustomer" elementType="Argument"> + <stringProp name="Argument.name">catalogBrowsingByCustomer</stringProp> + <stringProp name="Argument.value">${__P(catalogBrowsingByCustomer,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="users" elementType="Argument"> - <stringProp name="Argument.name">users</stringProp> - <stringProp name="Argument.value">${__P(users,100)}</stringProp> + <elementProp name="checkoutByGuest" elementType="Argument"> + <stringProp name="Argument.name">checkoutByGuest</stringProp> + <stringProp name="Argument.value">${__P(checkoutByGuest,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="view_product_add_to_cart_percent" elementType="Argument"> - <stringProp name="Argument.name">view_product_add_to_cart_percent</stringProp> - <stringProp name="Argument.value">${__P(view_product_add_to_cart_percent,62)}</stringProp> + <elementProp name="checkoutByCustomer" elementType="Argument"> + <stringProp name="Argument.name">checkoutByCustomer</stringProp> + <stringProp name="Argument.value">${__P(checkoutByCustomer,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="view_catalog_percent" elementType="Argument"> - <stringProp name="Argument.name">view_catalog_percent</stringProp> - <stringProp name="Argument.value">${__P(view_catalog_percent,30)}</stringProp> + <elementProp name="customer_checkout_percent" elementType="Argument"> + <stringProp name="Argument.name">customer_checkout_percent</stringProp> + <stringProp name="Argument.value">${__P(customer_checkout_percent,4)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="customer_limit" elementType="Argument"> + <stringProp name="Argument.name">customer_limit</stringProp> + <stringProp name="Argument.value">${__P(customer_limit,20)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="customer_password" elementType="Argument"> + <stringProp name="Argument.name">customer_password</stringProp> + <stringProp name="Argument.value">123123q</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="customers_page_size" elementType="Argument"> + <stringProp name="Argument.name">customers_page_size</stringProp> + <stringProp name="Argument.value">${__P(customers_page_size,20)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="dashboard_enabled" elementType="Argument"> + <stringProp name="Argument.name">dashboard_enabled</stringProp> + <stringProp name="Argument.value">${__P(dashboard_enabled,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="guest_checkout_percent" elementType="Argument"> @@ -58,9 +254,9 @@ <stringProp name="Argument.value">${__P(guest_checkout_percent,4)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="customer_checkout_percent" elementType="Argument"> - <stringProp name="Argument.name">customer_checkout_percent</stringProp> - <stringProp name="Argument.value">${__P(customer_checkout_percent,4)}</stringProp> + <elementProp name="host" elementType="Argument"> + <stringProp name="Argument.name">host</stringProp> + <stringProp name="Argument.value">${__P(host,)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="loops" elementType="Argument"> @@ -68,695 +264,643 @@ <stringProp name="Argument.value">${__P(loops,1)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="customer_password" elementType="Argument"> - <stringProp name="Argument.name">customer_password</stringProp> - <stringProp name="Argument.value">123123q</stringProp> + <elementProp name="orders" elementType="Argument"> + <stringProp name="Argument.name">orders</stringProp> + <stringProp name="Argument.value">${__P(orders,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="url_suffix" elementType="Argument"> - <stringProp name="Argument.name">url_suffix</stringProp> - <stringProp name="Argument.value">.html</stringProp> + <elementProp name="orders_page_size" elementType="Argument"> + <stringProp name="Argument.name">orders_page_size</stringProp> + <stringProp name="Argument.value">${__P(orders_page_size,20)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="admin_path" elementType="Argument"> - <stringProp name="Argument.name">admin_path</stringProp> - <stringProp name="Argument.value">${__P(admin_path,admin)}</stringProp> + <elementProp name="products_page_size" elementType="Argument"> + <stringProp name="Argument.name">products_page_size</stringProp> + <stringProp name="Argument.value">${__P(products_page_size,20)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="admin-user" elementType="Argument"> - <stringProp name="Argument.name">admin-user</stringProp> - <stringProp name="Argument.value">${__P(admin-user,admin)}</stringProp> + <elementProp name="ramp_period" elementType="Argument"> + <stringProp name="Argument.name">ramp_period</stringProp> + <stringProp name="Argument.value">${__P(ramp_period,0)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="admin-password" elementType="Argument"> - <stringProp name="Argument.name">admin-password</stringProp> - <stringProp name="Argument.value">${__P(admin-password,123123q)}</stringProp> + <elementProp name="redis_host" elementType="Argument"> + <stringProp name="Argument.name">redis_host</stringProp> + <stringProp name="Argument.value">${__P(redis_host,)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="website_id" elementType="Argument"> - <stringProp name="Argument.name">website_id</stringProp> - <stringProp name="Argument.value">1</stringProp> + <elementProp name="report_save_path" elementType="Argument"> + <stringProp name="Argument.name">report_save_path</stringProp> + <stringProp name="Argument.value">${__P(report_save_path,./)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="response_time_file_name" elementType="Argument"> + <stringProp name="Argument.name">response_time_file_name</stringProp> + <stringProp name="Argument.value">${__P(response_time_file_name,production.csv)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="scenario" elementType="Argument"> + <stringProp name="Argument.name">scenario</stringProp> + <stringProp name="Argument.value">${__P(scenario,)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="setupAndTearDownThread" elementType="Argument"> + <stringProp name="Argument.name">setupAndTearDownThread</stringProp> + <stringProp name="Argument.value">${__P(setupAndTearDownThread,1)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="sprint_identifier" elementType="Argument"> + <stringProp name="Argument.name">sprint_identifier</stringProp> + <stringProp name="Argument.value">${__P(sprint_identifier,)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="start_time" elementType="Argument"> + <stringProp name="Argument.name">start_time</stringProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="starting_index" elementType="Argument"> + <stringProp name="Argument.name">starting_index</stringProp> + <stringProp name="Argument.value">${__P(starting_index,0)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + <elementProp name="test_duration" elementType="Argument"> + <stringProp name="Argument.name">test_duration</stringProp> + <stringProp name="Argument.value">${__P(test_duration,900)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="think_time_deviation" elementType="Argument"> <stringProp name="Argument.name">think_time_deviation</stringProp> - <stringProp name="Argument.value">${__P(think_time_deviation, 1000)}</stringProp> + <stringProp name="Argument.value">${__P(think_time_deviation,1000)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="think_time_delay_offset" elementType="Argument"> <stringProp name="Argument.name">think_time_delay_offset</stringProp> - <stringProp name="Argument.value">${__P(think_time_delay_offset, 2000)}</stringProp> + <stringProp name="Argument.value">${__P(think_time_delay_offset,2000)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> - </collectionProp> - </elementProp> - <stringProp name="TestPlan.user_define_classpath"></stringProp> - <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> - </TestPlan> - <hashTree> - <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain">${host}</stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">utf-8</stringProp> - <stringProp name="HTTPSampler.path"></stringProp> - <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> - <stringProp name="HTTPSampler.concurrentPool">4</stringProp> - </ConfigTestElement> - <hashTree/> - <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> - <collectionProp name="HeaderManager.headers"> - <elementProp name="Accept-Language" elementType="Header"> - <stringProp name="Header.name">Accept-Language</stringProp> - <stringProp name="Header.value">en-US,en;q=0.5</stringProp> + <elementProp name="url_suffix" elementType="Argument"> + <stringProp name="Argument.name">url_suffix</stringProp> + <stringProp name="Argument.value">.html</stringProp> + <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="Accept" elementType="Header"> - <stringProp name="Header.name">Accept</stringProp> - <stringProp name="Header.value">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</stringProp> + <elementProp name="users" elementType="Argument"> + <stringProp name="Argument.name">users</stringProp> + <stringProp name="Argument.value">${__P(users,100)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="User-Agent" elementType="Header"> - <stringProp name="Header.name">User-Agent</stringProp> - <stringProp name="Header.value">Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0</stringProp> + <elementProp name="view_catalog_percent" elementType="Argument"> + <stringProp name="Argument.name">view_catalog_percent</stringProp> + <stringProp name="Argument.value">${__P(view_catalog_percent,62)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <elementProp name="Accept-Encoding" elementType="Header"> - <stringProp name="Header.name">Accept-Encoding</stringProp> - <stringProp name="Header.value">gzip, deflate</stringProp> + <elementProp name="view_product_add_to_cart_percent" elementType="Argument"> + <stringProp name="Argument.name">view_product_add_to_cart_percent</stringProp> + <stringProp name="Argument.value">${__P(view_product_add_to_cart_percent,30)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> </elementProp> - </collectionProp> - </HeaderManager> - <hashTree/> - <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> - <collectionProp name="CookieManager.cookies"> - <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> - <stringProp name="Cookie.value">30</stringProp> - <stringProp name="Cookie.domain">${host}</stringProp> - <stringProp name="Cookie.path">/</stringProp> - <boolProp name="Cookie.secure">false</boolProp> - <longProp name="Cookie.expires">0</longProp> - <boolProp name="Cookie.path_specified">true</boolProp> - <boolProp name="Cookie.domain_specified">true</boolProp> + <elementProp name="website_id" elementType="Argument"> + <stringProp name="Argument.name">website_id</stringProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> - <boolProp name="CookieManager.clearEachIteration">true</boolProp> - </CookieManager> - <hashTree/> - <SetupThreadGroup guiclass="SetupThreadGroupGui" testclass="SetupThreadGroup" testname="setUp Thread Group" enabled="true"> - <stringProp name="ThreadGroup.on_sample_error">stoptest</stringProp> - <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> - <boolProp name="LoopController.continue_forever">false</boolProp> - <stringProp name="LoopController.loops">1</stringProp> + </elementProp> + </TestPlan> + <hashTree> + <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain">${host}</stringProp> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol">http</stringProp> + <stringProp name="HTTPSampler.contentEncoding">utf-8</stringProp> + <stringProp name="HTTPSampler.path"/> + <stringProp name="HTTPSampler.implementation">Java</stringProp> + <stringProp name="HTTPSampler.concurrentPool">4</stringProp> + </ConfigTestElement> + <hashTree/> + + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="Accept-Language" elementType="Header"> + <stringProp name="Header.name">Accept-Language</stringProp> + <stringProp name="Header.value">en-US,en;q=0.5</stringProp> </elementProp> - <stringProp name="ThreadGroup.num_threads">1</stringProp> - <stringProp name="ThreadGroup.ramp_time">1</stringProp> - <longProp name="ThreadGroup.start_time">1384333221000</longProp> - <longProp name="ThreadGroup.end_time">1384333221000</longProp> - <boolProp name="ThreadGroup.scheduler">false</boolProp> - <stringProp name="ThreadGroup.duration"></stringProp> - <stringProp name="ThreadGroup.delay"></stringProp> - </SetupThreadGroup> - <hashTree> - <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> - <collectionProp name="CookieManager.cookies"> - <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> - <stringProp name="Cookie.value">30</stringProp> - <stringProp name="Cookie.domain">${host}</stringProp> - <stringProp name="Cookie.path">/</stringProp> - <boolProp name="Cookie.secure">false</boolProp> - <longProp name="Cookie.expires">0</longProp> - <boolProp name="Cookie.path_specified">true</boolProp> - <boolProp name="Cookie.domain_specified">true</boolProp> - </elementProp> - </collectionProp> - <boolProp name="CookieManager.clearEachIteration">true</boolProp> - </CookieManager> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: Clear properties" enabled="true"> - <stringProp name="BeanShellSampler.query">props.remove("category_url_key"); -props.remove("category_name"); -props.remove("simple_products_list"); -props.remove("configurable_products_list"); -props.remove("users"); -props.remove("customer_emails_list");</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> - </BeanShellSampler> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: validate user defined variables" enabled="true"> - <stringProp name="BeanShellSampler.query">Boolean stopTestOnError (String error) { + <elementProp name="Accept" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</stringProp> + </elementProp> + <elementProp name="User-Agent" elementType="Header"> + <stringProp name="Header.name">User-Agent</stringProp> + <stringProp name="Header.value">Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0</stringProp> + </elementProp> + <elementProp name="Accept-Encoding" elementType="Header"> + <stringProp name="Header.name">Accept-Encoding</stringProp> + <stringProp name="Header.value">gzip, deflate</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> + <collectionProp name="CookieManager.cookies"> + <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> + <stringProp name="Cookie.value">30</stringProp> + <stringProp name="Cookie.domain">${host}</stringProp> + <stringProp name="Cookie.path">/</stringProp> + <boolProp name="Cookie.secure">false</boolProp> + <longProp name="Cookie.expires">0</longProp> + <boolProp name="Cookie.path_specified">true</boolProp> + <boolProp name="Cookie.domain_specified">true</boolProp> + </elementProp> + </collectionProp> + <boolProp name="CookieManager.clearEachIteration">true</boolProp> + </CookieManager> + <hashTree/> + + <SetupThreadGroup guiclass="SetupThreadGroupGui" testclass="SetupThreadGroup" testname="setUp Thread Group" enabled="true"> + <stringProp name="ThreadGroup.on_sample_error">stoptest</stringProp> + <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> + <boolProp name="LoopController.continue_forever">false</boolProp> + <stringProp name="LoopController.loops">1</stringProp> + </elementProp> + <stringProp name="ThreadGroup.num_threads">${setupAndTearDownThread}</stringProp> + <stringProp name="ThreadGroup.ramp_time">1</stringProp> + <longProp name="ThreadGroup.start_time">1384333221000</longProp> + <longProp name="ThreadGroup.end_time">1384333221000</longProp> + <boolProp name="ThreadGroup.scheduler">false</boolProp> + <stringProp name="ThreadGroup.duration"/> + <stringProp name="ThreadGroup.delay"/> + </SetupThreadGroup> + <hashTree> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Clear properties" enabled="true"> + <stringProp name="BeanShellSampler.query">props.remove("category_url_key"); +props.remove("category_name"); +props.remove("simple_products_list"); +props.remove("configurable_products_list"); +props.remove("users"); +props.remove("customer_emails_list"); + +/* This is only used when admin is enabled. */ +props.put("activeAdminThread", ""); + +/* Set the environment - at this time '01' or '02' */ +String path = "${host}"; +String environment = path.substring(4, 6); +props.put("environment", environment);</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> + </BeanShellSampler> + <hashTree/> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: validate user defined variables" enabled="true"> + <stringProp name="BeanShellSampler.query">Boolean stopTestOnError (String error) { log.error(error); System.out.println(error); SampleResult.setStopTest(true); return false; } -if ("${host}" == "1") { - return stopTestOnError("\"host\" parameter is not defined. Please define host parameter as: \"-Jhost=example.com\""); +if ("${host}" == "1") { + return stopTestOnError("\"host\" parameter is not defined. Please define host parameter as: \"-Jhost=example.com\""); } -if (${users} < 10) { - return stopTestOnError("\"users\" parameter is invalid. Its value must be 10 or greater"); +String path = "${base_path}"; +String slash = "/"; +if (!slash.equals(path.substring(path.length() -1)) || !slash.equals(path.substring(0, 1))) { + return stopTestOnError("\"base_path\" parameter is invalid. It must start and end with \"/\""); } +</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> + </BeanShellSampler> + <hashTree/> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - Login" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert login form shown" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1397214398">Welcome</stringProp> + <stringProp name="-515240035"><title>Magento Admin</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">admin_form_key</stringProp> + <stringProp name="RegexExtractor.regex"><input name="form_key" type="hidden" value="([^'"]+)" /></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">admin_form_key</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - Login Submit Form" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="dummy" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">dummy</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${admin_form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + <elementProp name="login[password]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${admin_password}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">login[password]</stringProp> + </elementProp> + <elementProp name="login[username]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${admin_user}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">login[username]</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/admin/dashboard/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <stringProp name="HTTPSampler.implementation">Java</stringProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + <stringProp name="TestPlan.comments">Implementation needs to be set to Java as per http://stackoverflow.com/questions/19636282/jmeter-error-in-redirect-url-for-get</stringProp> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert logged-in" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1847038912"><title>Dashboard / Magento Admin</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Admin - Enable All Cache Types" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${admin_form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + <elementProp name="massaction_prepare_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">types</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">massaction_prepare_key</stringProp> + </elementProp> + <elementProp name="types" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">config,layout,block_html,collections,db_ddl,eav,config_integration,full_page,translate,config_webservice,config_integration_api</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">types</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/admin/cache/massEnable</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + <stringProp name="TestPlan.comments">Begin by enabling all cache types</stringProp> + </HTTPSamplerProxy> + <hashTree/> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Admin - Refresh All Cache Types" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${admin_form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + <elementProp name="massaction_prepare_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">types</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">massaction_prepare_key</stringProp> + </elementProp> + <elementProp name="types" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">config,layout,block_html,collections,db_ddl,eav,config_integration,full_page,translate,config_webservice,config_integration_api</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">types</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/admin/cache/massRefresh</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + <stringProp name="TestPlan.comments">Refresh all cache types</stringProp> + </HTTPSamplerProxy> + <hashTree/> + <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller: Disable cache type?" enabled="true"> + <stringProp name="IfController.condition">"${cache_indicator}" == "1" || "${cache_indicator}" == "2"</stringProp> + <boolProp name="IfController.evaluateAll">false</boolProp> + </IfController> + <hashTree> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: resolve cache types" enabled="true"> + <stringProp name="BeanShellSampler.query">// Default to disable all cache types +vars.put("cache_types", "config,layout,block_html,collections,db_ddl,eav,config_integration,full_page,translate,config_webservice,config_integration_api"); -String path = "${base_path}"; -String slash = "/"; -if (!slash.equals(path.substring(path.length() -1)) || !slash.equals(path.substring(0, 1))) { - return stopTestOnError("\"base_path\" parameter is invalid. It must start and end with \"/\""); +if ("${cache_indicator}" == "1") { + // Only disable Full Page Cache + vars.put("cache_types", "full_page"); } </stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> </BeanShellSampler> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request: Open main page (for category extract)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol"></stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - <stringProp name="TestPlan.comments">Site - Get Category 1</stringProp> - </HTTPSamplerProxy> - <hashTree> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extarct first category url key" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">category_url_key</stringProp> - <stringProp name="RegexExtractor.regex"><a href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}" class="level-top" ></stringProp> - <stringProp name="RegexExtractor.template">$2$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> - </RegexExtractor> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extarct first category name" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">category_name</stringProp> - <stringProp name="RegexExtractor.regex"><a href="http://${host}${base_path}(index.php/)?${category_url_key}${url_suffix}" class="level-top" ><span>([^'"]+)</span></stringProp> - <stringProp name="RegexExtractor.template">$2$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert category url" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="484395188">^[a-z0-9-]+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">category_url_key</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert category name" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Admin - Disable Specific Cache Types" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${admin_form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + <elementProp name="massaction_prepare_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">types</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">massaction_prepare_key</stringProp> + </elementProp> + <elementProp name="types" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${cache_types}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">types</stringProp> + </elementProp> </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">category_name</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: Collect category" enabled="true"> - <stringProp name="BeanShellSampler.query">props.put("category_url_key", vars.get("category_url_key")); -props.put("category_name", vars.get("category_name"));</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> - </BeanShellSampler> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request: Search simple products" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> - <collectionProp name="Arguments.arguments"/> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol"></stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}catalogsearch/result/index/?limit=30&q=Simple</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/admin/cache/massDisable</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp> <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> + <stringProp name="HTTPSampler.embedded_url_re"/> </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert search result" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-68828613">Search results for: 'Simple'</stringProp> - <stringProp name="1647182604"><div class="search results"></stringProp> + <hashTree/> + </hashTree> + <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller - Cache Validation - All Enabled" enabled="true"> + <stringProp name="IfController.condition">"${cache_indicator}" == "0"</stringProp> + <boolProp name="IfController.evaluateAll">false</boolProp> + </IfController> + <hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request - Cache Validation - All Enabled" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${admin_form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract product url keys" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">simple_products_url_keys</stringProp> - <stringProp name="RegexExtractor.regex"><a class="product-item-link"\s*href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}"></stringProp> - <stringProp name="RegexExtractor.template">$2$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">-1</stringProp> - </RegexExtractor> - <hashTree/> - </hashTree> - <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach Controller: Simple products loop (search result)" enabled="true"> - <stringProp name="ForeachController.inputVal">simple_products_url_keys</stringProp> - <stringProp name="ForeachController.returnVal">simple_products_url_key</stringProp> - <boolProp name="ForeachController.useSeparator">true</boolProp> - </ForeachController> - <hashTree> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request: Open Simple product" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_products_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extarct product id" enabled="true"> - <stringProp name="XPathExtractor.default"></stringProp> - <stringProp name="XPathExtractor.refname">simple_product_id</stringProp> - <stringProp name="XPathExtractor.xpathQuery">.//input[@type="hidden" and @name="product"]/@value</stringProp> - <boolProp name="XPathExtractor.validate">false</boolProp> - <boolProp name="XPathExtractor.tolerant">true</boolProp> - <boolProp name="XPathExtractor.namespace">false</boolProp> - </XPathExtractor> - <hashTree/> - <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extarct product title" enabled="true"> - <stringProp name="XPathExtractor.default"></stringProp> - <stringProp name="XPathExtractor.refname">simple_product_title</stringProp> - <stringProp name="XPathExtractor.xpathQuery">.//*[@data-ui-id='page-title-wrapper']/text()</stringProp> - <boolProp name="XPathExtractor.validate">false</boolProp> - <boolProp name="XPathExtractor.tolerant">true</boolProp> - <boolProp name="XPathExtractor.namespace">false</boolProp> - </XPathExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert id" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="89649215">^\d+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_id</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert title" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_title</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert url key" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="484395188">^[a-z0-9-]+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_products_url_key</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> - <stringProp name="CounterConfig.start">1</stringProp> - <stringProp name="CounterConfig.end"></stringProp> - <stringProp name="CounterConfig.incr">1</stringProp> - <stringProp name="CounterConfig.name">simple_products_counter</stringProp> - <stringProp name="CounterConfig.format"></stringProp> - <boolProp name="CounterConfig.per_user">false</boolProp> - </CounterConfig> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: Collect simple product" enabled="true"> - <stringProp name="BeanShellSampler.query">import java.util.ArrayList; -import java.util.HashMap; - -// If it is first iteration of cycle then recreate productList -if (1 == Integer.parseInt(vars.get("simple_products_counter"))) { - productList = new ArrayList(); - props.put("simple_products_list", productList); -} else { - productList = props.get("simple_products_list"); -} - -// Create product map -Map productMap = new HashMap(); -productMap.put("id", vars.get("simple_product_id")); -productMap.put("title", vars.get("simple_product_title")); -productMap.put("url_key", vars.get("simple_products_url_key")); - -// Collect products map in products list -productList.add(productMap); </stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> - </BeanShellSampler> - <hashTree/> - </hashTree> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request: Search configurable products" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> - <collectionProp name="Arguments.arguments"/> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol"></stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}catalogsearch/result/index/?limit=30&q=Configurable</stringProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/admin/cache/</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp> <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> + <stringProp name="HTTPSampler.embedded_url_re"/> </HTTPSamplerProxy> <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert search result" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion - Cache Validation - All Enabled" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="-1354477292">Search results for: 'Configurable'</stringProp> - <stringProp name="1647182604"><div class="search results"></stringProp> + <stringProp name="860336383">TRANSLATE(?s).+?<span>Enabled</span></stringProp> + <stringProp name="1466502763">CONFIG(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-1659688004">LAYOUT_GENERAL_CACHE_TAG(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-21423984">BLOCK_HTML(?s).+?<span>Enabled</span></stringProp> + <stringProp name="593884002">COLLECTION_DATA(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-751452301">EAV(?s).+?<span>Enabled</span></stringProp> + <stringProp name="1611481748">FPC(?s).+?<span>Enabled</span></stringProp> + <stringProp name="846147458">DB_DDL(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-534412103">INTEGRATION(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-72935653">INTEGRATION_API_CONFIG(?s).+?<span>Enabled</span></stringProp> + <stringProp name="330643820">WEBSERVICE(?s).+?<span>Enabled</span></stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> <intProp name="Assertion.test_type">2</intProp> </ResponseAssertion> <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract product url keys" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">configurable_products_url_keys</stringProp> - <stringProp name="RegexExtractor.regex"><a class="product-item-link"\s*href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">\s*Configurable</stringProp> - <stringProp name="RegexExtractor.template">$2$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">-1</stringProp> - </RegexExtractor> - <hashTree/> - </hashTree> - <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach Controller: Configurable products loop (search result)" enabled="true"> - <stringProp name="ForeachController.inputVal">configurable_products_url_keys</stringProp> - <stringProp name="ForeachController.returnVal">configurable_products_url_key</stringProp> - <boolProp name="ForeachController.useSeparator">true</boolProp> - </ForeachController> - <hashTree> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request: Open Configurable product" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}${configurable_products_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extarct product id" enabled="true"> - <stringProp name="XPathExtractor.default"></stringProp> - <stringProp name="XPathExtractor.refname">configurable_product_id</stringProp> - <stringProp name="XPathExtractor.xpathQuery">.//input[@type="hidden" and @name="product"]/@value</stringProp> - <boolProp name="XPathExtractor.validate">false</boolProp> - <boolProp name="XPathExtractor.tolerant">true</boolProp> - <boolProp name="XPathExtractor.namespace">false</boolProp> - </XPathExtractor> - <hashTree/> - <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extarct product title" enabled="true"> - <stringProp name="XPathExtractor.default"></stringProp> - <stringProp name="XPathExtractor.refname">configurable_product_title</stringProp> - <stringProp name="XPathExtractor.xpathQuery">.//*[@data-ui-id='page-title-wrapper']/text()</stringProp> - <boolProp name="XPathExtractor.validate">false</boolProp> - <boolProp name="XPathExtractor.tolerant">true</boolProp> - <boolProp name="XPathExtractor.namespace">false</boolProp> - </XPathExtractor> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extarct product attribute id" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">configurable_product_attribute_id</stringProp> - <stringProp name="RegexExtractor.regex">"attributes":\{"(\d+)"</stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extarct product attribute option id" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">configurable_product_attribute_option_id</stringProp> - <stringProp name="RegexExtractor.regex">"options":\[\{"id":"(\d+)"</stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert id" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="89649215">^\d+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_product_id</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert title" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_product_title</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Responce Assertion: Assert url key" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="484395188">^[a-z0-9-]+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_products_url_key</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert attribute id" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="89649215">^\d+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_product_attribute_id</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert attribute option id" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="89649215">^\d+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_product_attribute_option_id</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> - <stringProp name="CounterConfig.start">1</stringProp> - <stringProp name="CounterConfig.end"></stringProp> - <stringProp name="CounterConfig.incr">1</stringProp> - <stringProp name="CounterConfig.name">configurable_products_counter</stringProp> - <stringProp name="CounterConfig.format"></stringProp> - <boolProp name="CounterConfig.per_user">false</boolProp> - </CounterConfig> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: Collect configurable product" enabled="true"> - <stringProp name="BeanShellSampler.query">import java.util.ArrayList; -import java.util.HashMap; - -// If it is first iteration of cycle then recreate productList -if (1 == Integer.parseInt(vars.get("configurable_products_counter"))) { - productList = new ArrayList(); - props.put("configurable_products_list", productList); -} else { - productList = props.get("configurable_products_list"); -} - -// Create product map -Map productMap = new HashMap(); -productMap.put("id", vars.get("configurable_product_id")); -productMap.put("title", vars.get("configurable_product_title")); -productMap.put("url_key", vars.get("configurable_products_url_key")); -productMap.put("attribute_id", vars.get("configurable_product_attribute_id")); -productMap.put("attribute_option_id", vars.get("configurable_product_attribute_option_id")); - -// Collect products map in products list -productList.add(productMap); </stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> - </BeanShellSampler> - <hashTree/> </hashTree> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Admin - Login" enabled="true"> + </hashTree> + <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller - Cache Validation - Only FPC Disabled" enabled="true"> + <stringProp name="IfController.condition">"${cache_indicator}" == "1"</stringProp> + <boolProp name="IfController.evaluateAll">false</boolProp> + </IfController> + <hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request - Cache Validation - Only FPC Disabled" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + <collectionProp name="Arguments.arguments"> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${admin_form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + </collectionProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}${admin_path}</stringProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/admin/cache/</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp> <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> + <stringProp name="HTTPSampler.embedded_url_re"/> </HTTPSamplerProxy> <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert login form shown" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion - Cache Validation - All Disabled" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="-1397214398">Welcome</stringProp> - <stringProp name="-515240035"><title>Magento Admin</title></stringProp> + <stringProp name="860336383">TRANSLATE(?s).+?<span>Enabled</span></stringProp> + <stringProp name="1466502763">CONFIG(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-1659688004">LAYOUT_GENERAL_CACHE_TAG(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-21423984">BLOCK_HTML(?s).+?<span>Enabled</span></stringProp> + <stringProp name="593884002">COLLECTION_DATA(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-751452301">EAV(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-2075232047">FPC(?s).+?<span>Disabled</span></stringProp> + <stringProp name="846147458">DB_DDL(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-534412103">INTEGRATION(?s).+?<span>Enabled</span></stringProp> + <stringProp name="-72935653">INTEGRATION_API_CONFIG(?s).+?<span>Enabled</span></stringProp> + <stringProp name="330643820">WEBSERVICE(?s).+?<span>Enabled</span></stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> <intProp name="Assertion.test_type">2</intProp> </ResponseAssertion> <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">admin_form_key</stringProp> - <stringProp name="RegexExtractor.regex"><input name="form_key" type="hidden" value="([^'"]+)" /></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">admin_form_key</stringProp> - </ResponseAssertion> - <hashTree/> </hashTree> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Admin - Login Submit Form" enabled="true"> + </hashTree> + <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller - Cache Validation - All Disabled" enabled="true"> + <stringProp name="IfController.condition">"${cache_indicator}" == "2"</stringProp> + <boolProp name="IfController.evaluateAll">false</boolProp> + </IfController> + <hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request - Cache Validation - All Disabled" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"> - <elementProp name="dummy" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">dummy</stringProp> - </elementProp> <elementProp name="form_key" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> <stringProp name="Argument.value">${admin_form_key}</stringProp> <stringProp name="Argument.metadata">=</stringProp> <boolProp name="HTTPArgument.use_equals">true</boolProp> <stringProp name="Argument.name">form_key</stringProp> - </elementProp> - <elementProp name="login[password]" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">true</boolProp> - <stringProp name="Argument.value">${admin-password}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">login[password]</stringProp> - </elementProp> - <elementProp name="login[username]" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">true</boolProp> - <stringProp name="Argument.value">${admin-user}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">login[username]</stringProp> + <stringProp name="Argument.desc">true</stringProp> </elementProp> </collectionProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}${admin_path}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/admin/cache/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp> <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> + <stringProp name="HTTPSampler.embedded_url_re"/> </HTTPSamplerProxy> <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert logged-in" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion - Cache Validation - All Disabled" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="1847038912"><title>Dashboard / Magento Admin</title></stringProp> + <stringProp name="409065414">TRANSLATE(?s).+?<span>Disabled</span></stringProp> + <stringProp name="2020354010">CONFIG(?s).+?<span>Disabled</span></stringProp> + <stringProp name="-402279255">LAYOUT_GENERAL_CACHE_TAG(?s).+?<span>Disabled</span></stringProp> + <stringProp name="-1155702187">BLOCK_HTML(?s).+?<span>Disabled</span></stringProp> + <stringProp name="738976195">COLLECTION_DATA(?s).+?<span>Disabled</span></stringProp> + <stringProp name="1983223762">EAV(?s).+?<span>Disabled</span></stringProp> + <stringProp name="-2075232047">FPC(?s).+?<span>Disabled</span></stringProp> + <stringProp name="-30791261">DB_DDL(?s).+?<span>Disabled</span></stringProp> + <stringProp name="121535308">INTEGRATION(?s).+?<span>Disabled</span></stringProp> + <stringProp name="1542403370">INTEGRATION_API_CONFIG(?s).+?<span>Disabled</span></stringProp> + <stringProp name="1168465145">WEBSERVICE(?s).+?<span>Disabled</span></stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> @@ -764,2814 +908,6506 @@ productList.add(productMap); </stringProp> </ResponseAssertion> <hashTree/> </hashTree> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Admin - Open Customer Grid" enabled="true"> + </hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Open main page (for category extract)" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + <stringProp name="TestPlan.comments">Site - Get Category 1</stringProp> + </HTTPSamplerProxy> + <hashTree> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract first category url key" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">category_url_key</stringProp> + <stringProp name="RegexExtractor.regex"><a href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}" class="level-top" ></stringProp> + <stringProp name="RegexExtractor.template">$2$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract first category name" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">category_name</stringProp> + <stringProp name="RegexExtractor.regex"><a href="http://${host}${base_path}(index.php/)?${category_url_key}${url_suffix}" class="level-top" ><span>([^'"]+)</span></stringProp> + <stringProp name="RegexExtractor.template">$2$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert category url" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="484395188">^[a-z0-9-]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">category_url_key</stringProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert category name" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">category_name</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Collect category" enabled="true"> + <stringProp name="BeanShellSampler.query">props.put("category_url_key", vars.get("category_url_key")); +props.put("category_name", vars.get("category_name"));</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> + </BeanShellSampler> + <hashTree/> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Search simple products" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}catalogsearch/result/?limit=30&q=Simple</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert search result" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1297547762">(?i)Search results for: 'Simple'</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract product url keys" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">simple_products_url_keys</stringProp> + <stringProp name="RegexExtractor.regex"><a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s).+?Simple</stringProp> + <stringProp name="RegexExtractor.template">$2$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">-1</stringProp> + </RegexExtractor> + <hashTree/> + </hashTree> + <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach Controller: Simple products loop (search result)" enabled="true"> + <stringProp name="ForeachController.inputVal">simple_products_url_keys</stringProp> + <stringProp name="ForeachController.returnVal">simple_products_url_key</stringProp> + <boolProp name="ForeachController.useSeparator">true</boolProp> + </ForeachController> + <hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Open Simple product" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}${admin_path}/customer/index/</stringProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_products_url_key}${url_suffix}</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> + <stringProp name="HTTPSampler.embedded_url_re"/> </HTTPSamplerProxy> <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Customer Grid" enabled="true"> + <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extract product id" enabled="true"> + <stringProp name="XPathExtractor.default"/> + <stringProp name="XPathExtractor.refname">simple_product_id</stringProp> + <stringProp name="XPathExtractor.xpathQuery">.//input[@type="hidden" and @name="product"]/@value</stringProp> + <boolProp name="XPathExtractor.validate">false</boolProp> + <boolProp name="XPathExtractor.tolerant">true</boolProp> + <boolProp name="XPathExtractor.namespace">false</boolProp> + </XPathExtractor> + <hashTree/> + <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extract product title" enabled="true"> + <stringProp name="XPathExtractor.default"/> + <stringProp name="XPathExtractor.refname">simple_product_title</stringProp> + <stringProp name="XPathExtractor.xpathQuery">.//*[@data-ui-id='page-title-wrapper']/text()</stringProp> + <boolProp name="XPathExtractor.validate">false</boolProp> + <boolProp name="XPathExtractor.tolerant">true</boolProp> + <boolProp name="XPathExtractor.namespace">false</boolProp> + </XPathExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract uenc" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">simple_product_uenc</stringProp> + <stringProp name="RegexExtractor.regex">${base_path}checkout/cart/add/uenc/([^/]+)/product/</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert id" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="-679437259">Customers</stringProp> - <stringProp name="495525733"><title>Customers / Customers / Magento Admin</title></stringProp> + <stringProp name="89649215">^\d+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">simple_product_id</stringProp> </ResponseAssertion> <hashTree/> - </hashTree> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Admin - Prepare Customers search Data" enabled="true"> - <stringProp name="BeanShellSampler.query">import org.apache.jmeter.protocol.http.util.Base64Encoder; -String searchData = "customer_since[locale]=en_US&website_id=1"; -vars.put("searchData", new String(Base64Encoder.encode(searchData)));</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> - </BeanShellSampler> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Admin - Search Customers" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="form_key" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${admin_form_key}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">form_key</stringProp> - </elementProp> - <elementProp name="internal_customer" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">internal_customer</stringProp> - </elementProp> - </collectionProp> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}${admin_path}/customer/index/grid/limit/${users}/filter/${searchData}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert title" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="-1083053965">We couldn't find any records.</stringProp> + <stringProp name="2845929">^.+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">simple_product_title</stringProp> </ResponseAssertion> <hashTree/> - <XPathAssertion guiclass="XPathAssertionGui" testclass="XPathAssertion" testname="XPath Assertion" enabled="true"> - <boolProp name="XPath.negate">false</boolProp> - <stringProp name="XPath.xpath">//table[@id='customerGrid_table']//tr[@data-role='row']</stringProp> - <boolProp name="XPath.validate">false</boolProp> - <boolProp name="XPath.whitespace">false</boolProp> - <boolProp name="XPath.tolerant">true</boolProp> - <boolProp name="XPath.namespace">false</boolProp> - <boolProp name="XPath.show_warnings">true</boolProp> - <boolProp name="XPath.report_errors">true</boolProp> - </XPathAssertion> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert url key" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="484395188">^[a-z0-9-]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">simple_products_url_key</stringProp> + </ResponseAssertion> <hashTree/> - <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor" enabled="true"> - <stringProp name="XPathExtractor.default"></stringProp> - <stringProp name="XPathExtractor.refname">customer_emails</stringProp> - <stringProp name="XPathExtractor.xpathQuery">//*[@id='customerGrid_table']//td[@data-column='email']/text()</stringProp> - <boolProp name="XPathExtractor.validate">false</boolProp> - <boolProp name="XPathExtractor.tolerant">true</boolProp> - <boolProp name="XPathExtractor.namespace">false</boolProp> - <boolProp name="XPathExtractor.show_warnings">true</boolProp> - <boolProp name="XPathExtractor.report_errors">true</boolProp> - </XPathExtractor> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert uenc" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="824150030">^[\w\,]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">simple_product_uenc</stringProp> + </ResponseAssertion> <hashTree/> </hashTree> - <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach Controller: customer emails loop (search result)" enabled="true"> - <stringProp name="ForeachController.inputVal">customer_emails</stringProp> - <stringProp name="ForeachController.returnVal">customer_email</stringProp> - <boolProp name="ForeachController.useSeparator">true</boolProp> - </ForeachController> - <hashTree> - <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> - <stringProp name="CounterConfig.start">1</stringProp> - <stringProp name="CounterConfig.end"></stringProp> - <stringProp name="CounterConfig.incr">1</stringProp> - <stringProp name="CounterConfig.name">email_counter</stringProp> - <stringProp name="CounterConfig.format"></stringProp> - <boolProp name="CounterConfig.per_user">false</boolProp> - </CounterConfig> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: Collect customer emails" enabled="true"> - <stringProp name="BeanShellSampler.query">import java.util.ArrayList; + <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> + <stringProp name="CounterConfig.start">1</stringProp> + <stringProp name="CounterConfig.end"/> + <stringProp name="CounterConfig.incr">1</stringProp> + <stringProp name="CounterConfig.name">simple_products_counter</stringProp> + <stringProp name="CounterConfig.format"/> + <boolProp name="CounterConfig.per_user">false</boolProp> + </CounterConfig> + <hashTree/> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Collect simple product" enabled="true"> + <stringProp name="BeanShellSampler.query">import java.util.ArrayList; +import java.util.HashMap; -// If it is first iteration of cycle then recreate emailsList -if (1 == Integer.parseInt(vars.get("email_counter"))) { - emailsList = new ArrayList(); - props.put("customer_emails_list", emailsList); +// If it is first iteration of cycle then recreate productList +if (1 == Integer.parseInt(vars.get("simple_products_counter"))) { + productList = new ArrayList(); + props.put("simple_products_list", productList); } else { - emailsList = props.get("customer_emails_list"); -} -emailsList.add(vars.get("customer_email"));</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> - </BeanShellSampler> - <hashTree/> - </hashTree> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: Validate properties and count users" enabled="true"> - <stringProp name="BeanShellSampler.query">Boolean stopTestOnError (String error) { - log.error(error); - System.out.println(error); - SampleResult.setStopTest(true); - return false; + productList = props.get("simple_products_list"); } -if (props.get("simple_products_list") == null) { - return stopTestOnError("Cannot find simple products. Test stopped."); -} -if (props.get("configurable_products_list") == null) { - return stopTestOnError("Cannot find configurable products. Test stopped."); -} -if (props.get("customer_emails_list") == null) { - return stopTestOnError("Cannot find customer emails. Test stopped."); -} -int orders = Integer.parseInt(vars.get("orders")); +// Create product map +Map productMap = new HashMap(); +productMap.put("id", vars.get("simple_product_id")); +productMap.put("title", vars.get("simple_product_title")); +productMap.put("url_key", vars.get("simple_products_url_key")); +productMap.put("uenc", vars.get("simple_product_uenc")); -if (orders > 0) { - int checkout_sum = Integer.parseInt(vars.get("guest_checkout_percent")) + Integer.parseInt(vars.get("customer_checkout_percent")); - checkout_sum = checkout_sum > 0 ? checkout_sum : 1; - int users = orders * (100 / checkout_sum); - props.put("users", users); -} else { - props.put("users", Integer.parseInt(vars.get("users"))); -} -</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> +// Collect products map in products list +productList.add(productMap);</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> </BeanShellSampler> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="WarmUp Add To Cart" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - </collectionProp> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree/> </hashTree> - <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Category Product browsing" enabled="true"> - <stringProp name="ThreadGroup.on_sample_error">startnextloop</stringProp> - <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> - <boolProp name="LoopController.continue_forever">false</boolProp> - <stringProp name="LoopController.loops">${loops}</stringProp> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Search configurable products" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> + <collectionProp name="Arguments.arguments"/> </elementProp> - <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${view_catalog_percent}/100>>0))}</stringProp> - <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> - <longProp name="ThreadGroup.start_time">1304708488000</longProp> - <longProp name="ThreadGroup.end_time">1304708488000</longProp> - <boolProp name="ThreadGroup.scheduler">false</boolProp> - <stringProp name="ThreadGroup.duration"></stringProp> - <stringProp name="ThreadGroup.delay"></stringProp> - </ThreadGroup> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}catalogsearch/result/?limit=30&q=Configurable</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> <hashTree> - <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> - <collectionProp name="CookieManager.cookies"> - <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> - <stringProp name="Cookie.value">30</stringProp> - <stringProp name="Cookie.domain">${host}</stringProp> - <stringProp name="Cookie.path">/</stringProp> - <boolProp name="Cookie.secure">false</boolProp> - <longProp name="Cookie.expires">0</longProp> - <boolProp name="Cookie.path_specified">true</boolProp> - <boolProp name="Cookie.domain_specified">true</boolProp> - </elementProp> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert search result" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1354477292">Search results for: 'Configurable'</stringProp> + <stringProp name="1647182604"><div class="search results"></stringProp> </collectionProp> - <boolProp name="CookieManager.clearEachIteration">true</boolProp> - </CookieManager> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments(CatProdBrows)" enabled="true"> - <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> - <stringProp name="BeanShellSampler.query">number = (int)(Math.random() * props.get("simple_products_list").size()); -simpleList = props.get("simple_products_list").get(number); -vars.put("simple_product_1_url_key", simpleList.get("url_key")); -vars.put("simple_product_1_name", simpleList.get("title")); - -do { - number1 = (int)(Math.random() * props.get("simple_products_list").size()); -} while(number == number1); -simpleList = props.get("simple_products_list").get(number1); -vars.put("simple_product_2_url_key", simpleList.get("url_key")); -vars.put("simple_product_2_name", simpleList.get("title")); - -number = (int)(Math.random() * props.get("configurable_products_list").size()); -configurableList = props.get("configurable_products_list").get(number); -vars.put("configurable_product_1_url_key", configurableList.get("url_key")); -vars.put("configurable_product_1_name", configurableList.get("title")); - -vars.put("category_url_key", props.get("category_url_key")); -vars.put("category_name", props.get("category_name"));</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> - </BeanShellSampler> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract product url keys" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">configurable_products_url_keys</stringProp> + <stringProp name="RegexExtractor.regex"><a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s).+?Configurable</stringProp> + <stringProp name="RegexExtractor.template">$2$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">-1</stringProp> + </RegexExtractor> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page(CatProdBrows)" enabled="true"> + </hashTree> + <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach Controller: Configurable products loop (search result)" enabled="true"> + <stringProp name="ForeachController.inputVal">configurable_products_url_keys</stringProp> + <stringProp name="ForeachController.returnVal">configurable_products_url_key</stringProp> + <boolProp name="ForeachController.useSeparator">true</boolProp> + </ForeachController> + <hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - HTTP Request: Open Configurable product" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}</stringProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${configurable_products_url_key}${url_suffix}</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> + <stringProp name="HTTPSampler.embedded_url_re"/> </HTTPSamplerProxy> <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="571386695"><title>Home page</title></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> + <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extract product id" enabled="true"> + <stringProp name="XPathExtractor.default"/> + <stringProp name="XPathExtractor.refname">configurable_product_id</stringProp> + <stringProp name="XPathExtractor.xpathQuery">.//input[@type="hidden" and @name="product"]/@value</stringProp> + <boolProp name="XPathExtractor.validate">false</boolProp> + <boolProp name="XPathExtractor.tolerant">true</boolProp> + <boolProp name="XPathExtractor.namespace">false</boolProp> + </XPathExtractor> <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category(CatProdBrows)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> + <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath Extractor: Extract product title" enabled="true"> + <stringProp name="XPathExtractor.default"/> + <stringProp name="XPathExtractor.refname">configurable_product_title</stringProp> + <stringProp name="XPathExtractor.xpathQuery">.//*[@data-ui-id='page-title-wrapper']/text()</stringProp> + <boolProp name="XPathExtractor.validate">false</boolProp> + <boolProp name="XPathExtractor.tolerant">true</boolProp> + <boolProp name="XPathExtractor.namespace">false</boolProp> + </XPathExtractor> <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View(CatProdBrows)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract uenc" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">configurable_product_uenc</stringProp> + <stringProp name="RegexExtractor.regex">${base_path}checkout/cart/add/uenc/([^/]+)/product/</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View(CatProdBrows)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract product attribute id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">configurable_product_attribute_id</stringProp> + <stringProp name="RegexExtractor.regex">"spConfig": \{"attributes":\{"(\d+)"</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract product attribute option id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">configurable_product_attribute_option_id</stringProp> + <stringProp name="RegexExtractor.regex">"options":\[\{"id":"(\d+)"</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert id" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> + <stringProp name="89649215">^\d+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">configurable_product_id</stringProp> </ResponseAssertion> <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View(CatProdBrows)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert title" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> + <stringProp name="2845929">^.+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">configurable_product_title</stringProp> </ResponseAssertion> <hashTree/> - </hashTree> - </hashTree> - <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Product browsing and adding items to the cart" enabled="true"> - <stringProp name="ThreadGroup.on_sample_error">startnextloop</stringProp> - <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> - <boolProp name="LoopController.continue_forever">false</boolProp> - <stringProp name="LoopController.loops">${loops}</stringProp> - </elementProp> - <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${view_product_add_to_cart_percent}/100>>0))}</stringProp> - <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> - <longProp name="ThreadGroup.start_time">1304708488000</longProp> - <longProp name="ThreadGroup.end_time">1304708488000</longProp> - <boolProp name="ThreadGroup.scheduler">false</boolProp> - <stringProp name="ThreadGroup.duration"></stringProp> - <stringProp name="ThreadGroup.delay"></stringProp> - </ThreadGroup> - <hashTree> - <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> - <collectionProp name="CookieManager.cookies"> - <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> - <stringProp name="Cookie.value">30</stringProp> - <stringProp name="Cookie.domain">${host}</stringProp> - <stringProp name="Cookie.path">/</stringProp> - <boolProp name="Cookie.secure">false</boolProp> - <longProp name="Cookie.expires">0</longProp> - <boolProp name="Cookie.path_specified">true</boolProp> - <boolProp name="Cookie.domain_specified">true</boolProp> - </elementProp> - </collectionProp> - <boolProp name="CookieManager.clearEachIteration">true</boolProp> - </CookieManager> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments(BrowsAddToCart)" enabled="true"> - <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> - <stringProp name="BeanShellSampler.query">number = (int)(Math.random() * props.get("simple_products_list").size()); -simpleList = props.get("simple_products_list").get(number); -vars.put("simple_product_1_url_key", simpleList.get("url_key")); -vars.put("simple_product_1_name", simpleList.get("title")); -vars.put("simple_product_1_id", simpleList.get("id")); - -do { - number1 = (int)(Math.random() * props.get("simple_products_list").size()); -} while(number == number1); -simpleList = props.get("simple_products_list").get(number1); -vars.put("simple_product_2_url_key", simpleList.get("url_key")); -vars.put("simple_product_2_name", simpleList.get("title")); -vars.put("simple_product_2_id", simpleList.get("id")); - -number = (int)(Math.random() * props.get("configurable_products_list").size()); -configurableList = props.get("configurable_products_list").get(number); -vars.put("configurable_product_1_url_key", configurableList.get("url_key")); -vars.put("configurable_product_1_name", configurableList.get("title")); -vars.put("configurable_product_1_id", configurableList.get("id")); -vars.put("configurable_attribute_id", configurableList.get("attribute_id")); -vars.put("configurable_option_id", configurableList.get("attribute_option_id")); - -vars.put("category_url_key", props.get("category_url_key")); -vars.put("category_name", props.get("category_name"));</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> - </BeanShellSampler> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert url key" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="571386695"><title>Home page</title></stringProp> + <stringProp name="484395188">^[a-z0-9-]+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">configurable_products_url_key</stringProp> </ResponseAssertion> <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert attribute id" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> + <stringProp name="89649215">^\d+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">configurable_product_attribute_id</stringProp> </ResponseAssertion> <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert attribute option id" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> + <stringProp name="89649215">^\d+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">configurable_product_attribute_option_id</stringProp> </ResponseAssertion> <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">simple_product_1_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert uenc" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> + <stringProp name="824150030">^[\w\,]+$</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> <intProp name="Assertion.test_type">1</intProp> <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_1_form_action</stringProp> + <stringProp name="Scope.variable">configurable_product_uenc</stringProp> </ResponseAssertion> <hashTree/> </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> + <stringProp name="CounterConfig.start">1</stringProp> + <stringProp name="CounterConfig.end"/> + <stringProp name="CounterConfig.incr">1</stringProp> + <stringProp name="CounterConfig.name">configurable_products_counter</stringProp> + <stringProp name="CounterConfig.format"/> + <boolProp name="CounterConfig.per_user">false</boolProp> + </CounterConfig> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 Add To Cart(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${simple_product_1_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${simple_product_1_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="210217247">You added ${simple_product_1_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="518066445"><div>* This product is out of stock.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Collect configurable product" enabled="true"> + <stringProp name="BeanShellSampler.query">import java.util.ArrayList; +import java.util.HashMap; + +// If it is first iteration of cycle then recreate productList +if (1 == Integer.parseInt(vars.get("configurable_products_counter"))) { + productList = new ArrayList(); + props.put("configurable_products_list", productList); +} else { + productList = props.get("configurable_products_list"); +} + +// Create product map +Map productMap = new HashMap(); +productMap.put("id", vars.get("configurable_product_id")); +productMap.put("title", vars.get("configurable_product_title")); +productMap.put("url_key", vars.get("configurable_products_url_key")); +productMap.put("uenc", vars.get("configurable_product_uenc")); +productMap.put("attribute_id", vars.get("configurable_product_attribute_id")); +productMap.put("attribute_option_id", vars.get("configurable_product_attribute_option_id")); + +// Collect products map in products list +productList.add(productMap); </stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> + </BeanShellSampler> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">simple_product_2_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_2_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + </hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - Open Customer Grid" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/customer/index/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="BeanShell PreProcessor" enabled="true"> + <stringProp name="filename"/> + <stringProp name="parameters"/> + <boolProp name="resetInterpreter">true</boolProp> + <stringProp name="script">import org.apache.jmeter.protocol.http.control.CookieManager; +import org.apache.jmeter.protocol.http.control.Cookie; +CookieManager manager = sampler.getCookieManager(); +Cookie cookie = new Cookie("adminhtml",vars.get("COOKIE_adminhtml"),vars.get("host"),"/",false,0); +manager.add(cookie); </stringProp> + </BeanShellPreProcessor> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 Add To Cart(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${simple_product_2_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${simple_product_2_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="221533374">You added ${simple_product_2_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="518066445"><div>* This product is out of stock.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Customer Grid" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-679437259">Customers</stringProp> + <stringProp name="495525733"><title>Customers / Customers / Magento Admin</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - Search Customers" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="namespace" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer_listing</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">namespace</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">configurable_product_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_product_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 Add To Cart(BrowsAddToCart)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${configurable_product_1_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="super_attribute[${configurable_attribute_id}]" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${configurable_option_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">super_attribute[${configurable_attribute_id}]</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> + <elementProp name="search" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">search</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${configurable_product_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1346272328">You added ${configurable_product_1_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-815931116"><div>* We don't have as many &quot;${configurable_product_1_name}&quot; as you requested.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - </hashTree> - <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Guest Checkout" enabled="true"> - <stringProp name="ThreadGroup.on_sample_error">startnextloop</stringProp> - <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> - <boolProp name="LoopController.continue_forever">false</boolProp> - <stringProp name="LoopController.loops">${loops}</stringProp> - </elementProp> - <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${guest_checkout_percent}/100>>0))}</stringProp> - <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> - <longProp name="ThreadGroup.start_time">1304708488000</longProp> - <longProp name="ThreadGroup.end_time">1304708488000</longProp> - <boolProp name="ThreadGroup.scheduler">false</boolProp> - <stringProp name="ThreadGroup.duration"></stringProp> - <stringProp name="ThreadGroup.delay"></stringProp> - </ThreadGroup> + <elementProp name="filters[placeholder]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer_since[locale]=en_US&website_id=1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">filters[placeholder]</stringProp> + </elementProp> + <elementProp name="paging[pageSize]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${customers_page_size}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">paging[pageSize]</stringProp> + </elementProp> + <elementProp name="paging[current]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">paging[current]</stringProp> + </elementProp> + <elementProp name="sorting[field]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">entity_id</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sorting[field]</stringProp> + </elementProp> + <elementProp name="sorting[direction]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">asc</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sorting[direction]</stringProp> + </elementProp> + <elementProp name="isAjax" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">isAjax</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${admin_path}/mui/index/render/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert total records is not 0" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="827137952">\"totalRecords\":0</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">20</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract customer emails" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">customer_emails</stringProp> + <stringProp name="RegexExtractor.regex">\"email\":\"([^"]+)</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">-1</stringProp> + </RegexExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract customer ids" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">customer_ids</stringProp> + <stringProp name="RegexExtractor.regex">\"entity_id\":\"([^"]+)</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">-1</stringProp> + </RegexExtractor> + <hashTree/> + </hashTree> + <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach Controller: customer emails loop (search result)" enabled="true"> + <stringProp name="ForeachController.inputVal">customer_emails</stringProp> + <stringProp name="ForeachController.returnVal">customer_email</stringProp> + <boolProp name="ForeachController.useSeparator">true</boolProp> + </ForeachController> <hashTree> - <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> - <collectionProp name="CookieManager.cookies"> - <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> - <stringProp name="Cookie.value">30</stringProp> - <stringProp name="Cookie.domain">${host}</stringProp> - <stringProp name="Cookie.path">/</stringProp> - <boolProp name="Cookie.secure">false</boolProp> - <longProp name="Cookie.expires">0</longProp> - <boolProp name="Cookie.path_specified">true</boolProp> - <boolProp name="Cookie.domain_specified">true</boolProp> - </elementProp> - </collectionProp> - <boolProp name="CookieManager.clearEachIteration">true</boolProp> - </CookieManager> + <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> + <stringProp name="CounterConfig.start">1</stringProp> + <stringProp name="CounterConfig.end"/> + <stringProp name="CounterConfig.incr">1</stringProp> + <stringProp name="CounterConfig.name">email_counter</stringProp> + <stringProp name="CounterConfig.format"/> + <boolProp name="CounterConfig.per_user">false</boolProp> + </CounterConfig> <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments(GuestChkt)" enabled="true"> - <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> - <stringProp name="BeanShellSampler.query">number = (int)(Math.random() * props.get("simple_products_list").size()); -simpleList = props.get("simple_products_list").get(number); -vars.put("simple_product_1_url_key", simpleList.get("url_key")); -vars.put("simple_product_1_name", simpleList.get("title")); -vars.put("simple_product_1_id", simpleList.get("id")); + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Collect customer emails" enabled="true"> + <stringProp name="BeanShellSampler.query">import java.util.ArrayList; -do { - number1 = (int)(Math.random() * props.get("simple_products_list").size()); -} while(number == number1); -simpleList = props.get("simple_products_list").get(number1); -vars.put("simple_product_2_url_key", simpleList.get("url_key")); -vars.put("simple_product_2_name", simpleList.get("title")); -vars.put("simple_product_2_id", simpleList.get("id")); - -number = (int)(Math.random() * props.get("configurable_products_list").size()); -configurableList = props.get("configurable_products_list").get(number); -vars.put("configurable_product_1_url_key", configurableList.get("url_key")); -vars.put("configurable_product_1_name", configurableList.get("title")); -vars.put("configurable_product_1_id", configurableList.get("id")); -vars.put("configurable_attribute_id", configurableList.get("attribute_id")); -vars.put("configurable_option_id", configurableList.get("attribute_option_id")); - -vars.put("category_url_key", props.get("category_url_key")); -vars.put("category_name", props.get("category_name"));</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> +// If it is first iteration of cycle then recreate emailsList +if (1 == Integer.parseInt(vars.get("email_counter"))) { + emailsList = new ArrayList(); + props.put("customer_emails_list", emailsList); +} else { + emailsList = props.get("customer_emails_list"); +} +emailsList.add(vars.get("customer_email"));</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> </BeanShellSampler> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="571386695"><title>Home page</title></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + </hashTree> + <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach Controller: customer ids loop (search result)" enabled="true"> + <stringProp name="ForeachController.inputVal">customer_ids</stringProp> + <stringProp name="ForeachController.returnVal">customer_id</stringProp> + <boolProp name="ForeachController.useSeparator">true</boolProp> + </ForeachController> + <hashTree> + <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> + <stringProp name="CounterConfig.start">1</stringProp> + <stringProp name="CounterConfig.end"/> + <stringProp name="CounterConfig.incr">1</stringProp> + <stringProp name="CounterConfig.name">id_counter</stringProp> + <stringProp name="CounterConfig.format"/> + <boolProp name="CounterConfig.per_user">false</boolProp> + </CounterConfig> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Collect customer ids" enabled="true"> + <stringProp name="BeanShellSampler.query">import java.util.ArrayList; + +// If it is first iteration of cycle then recreate idsList +if (1 == Integer.parseInt(vars.get("id_counter"))) { + idsList = new ArrayList(); + props.put("customer_ids_list", idsList); +} else { + idsList = props.get("customer_ids_list"); +} +idsList.add(vars.get("customer_id"));</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> + </BeanShellSampler> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">simple_product_1_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_1_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + </hashTree> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Validate properties and count users" enabled="true"> + <stringProp name="BeanShellSampler.query">Boolean stopTestOnError (String error) { + log.error(error); + System.out.println(error); + SampleResult.setStopTest(true); + return false; +} + +if (props.get("simple_products_list") == null) { + return stopTestOnError("Cannot find simple products. Test stopped."); +} +if (props.get("configurable_products_list") == null) { + return stopTestOnError("Cannot find configurable products. Test stopped."); +} +if (props.get("customer_emails_list") == null) { + return stopTestOnError("Cannot find customer emails. Test stopped."); +} +int orders = Integer.parseInt(vars.get("orders")); + + +if (orders > 0) { + int checkout_sum = Integer.parseInt(vars.get("guest_checkout_percent")) + Integer.parseInt(vars.get("customer_checkout_percent")); + checkout_sum = checkout_sum > 0 ? checkout_sum : 1; + int users = orders * (100 / checkout_sum); + props.put("users", users); +} else { + props.put("users", Integer.parseInt(vars.get("users"))); +} +</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> + </BeanShellSampler> + <hashTree/> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="SetUp - WarmUp Add To Cart" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree/> + </hashTree> + + <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Catalog Browsing By Guest" enabled="true"> + <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> + <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> + <boolProp name="LoopController.continue_forever">false</boolProp> + <stringProp name="LoopController.loops">${loops}</stringProp> + </elementProp> + <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${view_catalog_percent}/100>>0))}</stringProp> + <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> + <longProp name="ThreadGroup.start_time">1437409133000</longProp> + <longProp name="ThreadGroup.end_time">1437409133000</longProp> + <boolProp name="ThreadGroup.scheduler">false</boolProp> + <stringProp name="ThreadGroup.duration"/> + <stringProp name="ThreadGroup.delay"/> + </ThreadGroup> + <hashTree> + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 1" enabled="true"> + <stringProp name="variableName">rv1</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">1</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 2" enabled="true"> + <stringProp name="variableName">rv2</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">2</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 3" enabled="true"> + <stringProp name="variableName">rv3</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">3</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments${__property(activeAdminThread)}(CatProdBrows)" enabled="true"> + <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> + <stringProp name="BeanShellSampler.query">number = (int)(${rv1} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); + +number1 = (int)(${rv2} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); + +number = (int)(${rv3} * props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); + +vars.put("category_url_key", props.get("category_url_key")); +vars.put("category_name", props.get("category_name")); +vars.put("testLabel", "CatProdBrows");</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> + </BeanShellSampler> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="571386695"><title>Home page</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 Add To Cart(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${simple_product_1_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer All Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${simple_product_1_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="210217247">You added ${simple_product_1_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="518066445"><div>* This product is out of stock.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-2001627678">\"messages\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract category id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">category_id</stringProp> + <stringProp name="RegexExtractor.regex"><li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert category id" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1191417111">^[0-9]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">category_id</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 2(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_2_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Configurable Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${configurable_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + </hashTree> + + <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Abandoned Cart By Guest" enabled="true"> + <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> + <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> + <boolProp name="LoopController.continue_forever">false</boolProp> + <stringProp name="LoopController.loops">${loops}</stringProp> + </elementProp> + <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${view_product_add_to_cart_percent}/100>>0))}</stringProp> + <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> + <longProp name="ThreadGroup.start_time">1437411475000</longProp> + <longProp name="ThreadGroup.end_time">1437411475000</longProp> + <boolProp name="ThreadGroup.scheduler">false</boolProp> + <stringProp name="ThreadGroup.duration"/> + <stringProp name="ThreadGroup.delay"/> + </ThreadGroup> + <hashTree> + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 1" enabled="true"> + <stringProp name="variableName">rv1</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">1</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 2" enabled="true"> + <stringProp name="variableName">rv2</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">2</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 3" enabled="true"> + <stringProp name="variableName">rv3</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">3</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments${__property(activeAdminThread)}(BrowsAddToCart)" enabled="true"> + <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> + <stringProp name="BeanShellSampler.query">number = (int)(${rv1} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_uenc", simpleList.get("uenc")); + +number1 = (int)(${rv2} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_uenc", simpleList.get("uenc")); + +number = (int)(${rv3} * props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); +vars.put("configurable_product_1_uenc", simpleList.get("uenc")); + +vars.put("category_url_key", props.get("category_url_key")); +vars.put("category_name", props.get("category_name")); +vars.put("testLabel", "BrowsAddToCart"); +vars.put("loadType", "Guest");</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> + </BeanShellSampler> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="571386695"><title>Home page</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer All Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">simple_product_2_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_2_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-2001627678">\"messages\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Load Login Form${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="blocks" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">["customer_form_login"]</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">blocks</stringProp> + </elementProp> + <elementProp name="handles" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">["default","customer_account_login"]</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">handles</stringProp> + </elementProp> + <elementProp name="originalRequest" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">{"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">originalRequest</stringProp> + </elementProp> + <elementProp name="ajax" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">ajax</stringProp> + </elementProp> + <elementProp name="isAjax" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">isAjax</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}page_cache/block/render/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="940598773">"customer_form_login"</stringProp> + <stringProp name="1951684663">Registered Customers</stringProp> + <stringProp name="474011748">form_key</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">form_key</stringProp> + <stringProp name="RegexExtractor.regex"><input name=\\"form_key\\" type=\\"hidden\\" value=\\"([^'"]+)\\" \\/></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">form_key</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract category id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">category_id</stringProp> + <stringProp name="RegexExtractor.regex"><li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert category id" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1191417111">^[0-9]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">category_id</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${simple_product_1_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${simple_product_1_uenc}/product/${simple_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="210217247">You added ${simple_product_1_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2057973164">This product is out of stock.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323027">\"summary_count\":1</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 2(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_2_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${simple_product_2_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${simple_product_2_uenc}/product/${simple_product_2_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}2${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="221533374">You added ${simple_product_2_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2057973164">This product is out of stock.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323026">\"summary_count\":2</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Configurable Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${configurable_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${configurable_product_1_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="super_attribute[${configurable_attribute_id}]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${configurable_option_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">super_attribute[${configurable_attribute_id}]</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${configurable_product_1_uenc}/product/${configurable_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}3${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1346272328">You added ${configurable_product_1_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-108122347">We don't have as many &quot;${configurable_product_1_name}&quot; as you requested.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323025">\"summary_count\":3</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + </hashTree> + + <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Checkout By Guest" enabled="true"> + <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> + <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> + <boolProp name="LoopController.continue_forever">false</boolProp> + <stringProp name="LoopController.loops">${loops}</stringProp> + </elementProp> + <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${guest_checkout_percent}/100>>0))}</stringProp> + <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> + <longProp name="ThreadGroup.start_time">1437409133000</longProp> + <longProp name="ThreadGroup.end_time">1437409133000</longProp> + <boolProp name="ThreadGroup.scheduler">false</boolProp> + <stringProp name="ThreadGroup.duration"/> + <stringProp name="ThreadGroup.delay"/> + </ThreadGroup> + <hashTree> + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 1" enabled="true"> + <stringProp name="variableName">rv1</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">1</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 2" enabled="true"> + <stringProp name="variableName">rv2</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">2</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 3" enabled="true"> + <stringProp name="variableName">rv3</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">3</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments${__property(activeAdminThread)}(GuestChkt)" enabled="true"> + <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> + <stringProp name="BeanShellSampler.query">number = (int)(${rv1} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_uenc", simpleList.get("uenc")); + +number1 = (int)(${rv2} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_uenc", simpleList.get("uenc")); + +number = (int)(${rv3} * props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); +vars.put("configurable_product_1_uenc", simpleList.get("uenc")); + +vars.put("category_url_key", props.get("category_url_key")); +vars.put("category_name", props.get("category_name")); +vars.put("testLabel", "GuestChkt"); +vars.put("loadType", "Guest");</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> + </BeanShellSampler> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="571386695"><title>Home page</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 Add To Cart(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${simple_product_2_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer All Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-2001627678">\"messages\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Load Login Form${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="blocks" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">["customer_form_login"]</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">blocks</stringProp> + </elementProp> + <elementProp name="handles" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">["default","customer_account_login"]</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">handles</stringProp> + </elementProp> + <elementProp name="originalRequest" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">{"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">originalRequest</stringProp> + </elementProp> + <elementProp name="ajax" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">ajax</stringProp> + </elementProp> + <elementProp name="isAjax" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">isAjax</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}page_cache/block/render/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="940598773">"customer_form_login"</stringProp> + <stringProp name="1951684663">Registered Customers</stringProp> + <stringProp name="474011748">form_key</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">form_key</stringProp> + <stringProp name="RegexExtractor.regex"><input name=\\"form_key\\" type=\\"hidden\\" value=\\"([^'"]+)\\" \\/></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">form_key</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract category id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">category_id</stringProp> + <stringProp name="RegexExtractor.regex"><li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert category id" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1191417111">^[0-9]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">category_id</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${simple_product_1_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${simple_product_1_uenc}/product/${simple_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="210217247">You added ${simple_product_1_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2057973164">This product is out of stock.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323027">\"summary_count\":1</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 2(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_2_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${simple_product_2_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${simple_product_2_uenc}/product/${simple_product_2_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}2${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="221533374">You added ${simple_product_2_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2057973164">This product is out of stock.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323026">\"summary_count\":2</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Configurable Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${configurable_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${configurable_product_1_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="super_attribute[${configurable_attribute_id}]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${configurable_option_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">super_attribute[${configurable_attribute_id}]</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${configurable_product_1_uenc}/product/${configurable_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}3${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1346272328">You added ${configurable_product_1_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-108122347">We don't have as many &quot;${configurable_product_1_name}&quot; as you requested.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323025">\"summary_count\":3</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout start${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1403911775"><title>Checkout</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-179817969"><title>Shopping Cart</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract Cart Id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">cart_id</stringProp> + <stringProp name="RegexExtractor.regex">"quoteData":{"entity_id":"([^'"]+)",</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">form_key</stringProp> + <stringProp name="RegexExtractor.regex"><input name="form_key" type="hidden" value="([^'"]+)" /></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Cart Id extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">cart_id</stringProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">form_key</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Estimate Shipping Methods ${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> + <collectionProp name="Arguments.arguments"> + <elementProp name="" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">{"address":{"country_id":"US"}}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}/rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Referer</stringProp> + <stringProp name="Header.value">${base_path}checkout/onepage/</stringProp> + </elementProp> + <elementProp name="Content-Type" elementType="Header"> + <stringProp name="Header.name">Content-Type</stringProp> + <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> + </elementProp> + <elementProp name="X-Requested-With" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + <elementProp name="Accept" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">application/json</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1224567411">"available":true</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Email Available ${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> + <collectionProp name="Arguments.arguments"> + <elementProp name="" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">{"customerEmail":"test@example.com"}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}rest/default/V1/customers/isEmailAvailable</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Referer</stringProp> + <stringProp name="Header.value">${base_path}checkout/onepage/</stringProp> + </elementProp> + <elementProp name="Content-Type" elementType="Header"> + <stringProp name="Header.name">Content-Type</stringProp> + <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> + </elementProp> + <elementProp name="X-Requested-With" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + <elementProp name="Accept" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">application/json</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="3569038">true</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">8</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Estimate Shipping Methods ${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> + <collectionProp name="Arguments.arguments"> + <elementProp name="" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">{"address":{"country_id":"US","postcode":"95630"}}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}/rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Referer</stringProp> + <stringProp name="Header.value">${base_path}checkout/onepage/</stringProp> + </elementProp> + <elementProp name="Content-Type" elementType="Header"> + <stringProp name="Header.name">Content-Type</stringProp> + <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> + </elementProp> + <elementProp name="X-Requested-With" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + <elementProp name="Accept" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">application/json</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1224567411">"available":true</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Billing/Shipping Information ${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> + <collectionProp name="Arguments.arguments"> + <elementProp name="" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">{"addressInformation":{"shipping_address":{"countryId":"US","regionId":"12","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}rest/default/V1/carts/${cart_id}/shipping-information</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Referer</stringProp> + <stringProp name="Header.value">${base_path}checkout/onepage/</stringProp> + </elementProp> + <elementProp name="Content-Type" elementType="Header"> + <stringProp name="Header.name">Content-Type</stringProp> + <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> + </elementProp> + <elementProp name="X-Requested-With" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + <elementProp name="Accept" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">application/json</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1494218646">{"payment_methods":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Payment Info/Place Order ${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> + <collectionProp name="Arguments.arguments"> + <elementProp name="" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">{"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"12","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"}}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}/rest/default/V1/guest-carts/${cart_id}/payment-information</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Referer</stringProp> + <stringProp name="Header.value">${base_path}checkout/onepage/</stringProp> + </elementProp> + <elementProp name="Content-Type" elementType="Header"> + <stringProp name="Header.name">Content-Type</stringProp> + <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> + </elementProp> + <elementProp name="X-Requested-With" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + <elementProp name="Accept" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">application/json</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-297987887">"[0-9]+"</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <com.atlantbh.jmeter.plugins.jsonutils.jsonpathextractor.JSONPathExtractor guiclass="com.atlantbh.jmeter.plugins.jsonutils.jsonpathextractor.gui.JSONPathExtractorGui" testclass="com.atlantbh.jmeter.plugins.jsonutils.jsonpathextractor.JSONPathExtractor" testname="Extract cart id" enabled="true"> + <stringProp name="VAR">order_id</stringProp> + <stringProp name="JSONPATH">$</stringProp> + <stringProp name="DEFAULT"/> + <stringProp name="VARIABLE"/> + <stringProp name="SUBJECT">BODY</stringProp> + </com.atlantbh.jmeter.plugins.jsonutils.jsonpathextractor.JSONPathExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="89649215">^\d+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">order_id</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout success${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/onepage/success/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="494863233">Thank you for your purchase!</stringProp> + <stringProp name="1635682758">Your order # is</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + </hashTree> + + <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Checkout By Customer" enabled="true"> + <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> + <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> + <boolProp name="LoopController.continue_forever">false</boolProp> + <stringProp name="LoopController.loops">${loops}</stringProp> + </elementProp> + <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${customer_checkout_percent}/100>>0))}</stringProp> + <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> + <longProp name="ThreadGroup.start_time">1437177203000</longProp> + <longProp name="ThreadGroup.end_time">1437177203000</longProp> + <boolProp name="ThreadGroup.scheduler">false</boolProp> + <stringProp name="ThreadGroup.duration"/> + <stringProp name="ThreadGroup.delay"/> + </ThreadGroup> + <hashTree> + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 1" enabled="true"> + <stringProp name="variableName">rv1</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">1</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 2" enabled="true"> + <stringProp name="variableName">rv2</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">2</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <RandomVariableConfig guiclass="TestBeanGUI" testclass="RandomVariableConfig" testname="Random Variable 3" enabled="true"> + <stringProp name="variableName">rv3</stringProp> + <stringProp name="outputFormat">'.'</stringProp> + <stringProp name="minimumValue">1</stringProp> + <stringProp name="maximumValue">999999</stringProp> + <stringProp name="randomSeed">3</stringProp> + <boolProp name="perThread">true</boolProp> + </RandomVariableConfig> + <hashTree/> + + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments${__property(activeAdminThread)}(CustomerChkt)" enabled="true"> + <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> + <stringProp name="BeanShellSampler.query">import org.apache.jmeter.samplers.SampleResult; + +number = (int)(${rv1} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number); +vars.put("simple_product_1_url_key", simpleList.get("url_key")); +vars.put("simple_product_1_name", simpleList.get("title")); +vars.put("simple_product_1_id", simpleList.get("id")); +vars.put("simple_product_1_uenc", simpleList.get("uenc")); + +number1 = (int)(${rv2} * props.get("simple_products_list").size()); +simpleList = props.get("simple_products_list").get(number1); +vars.put("simple_product_2_url_key", simpleList.get("url_key")); +vars.put("simple_product_2_name", simpleList.get("title")); +vars.put("simple_product_2_id", simpleList.get("id")); +vars.put("simple_product_2_uenc", simpleList.get("uenc")); + +number = (int)(${rv3} * props.get("configurable_products_list").size()); +configurableList = props.get("configurable_products_list").get(number); +vars.put("configurable_product_1_url_key", configurableList.get("url_key")); +vars.put("configurable_product_1_name", configurableList.get("title")); +vars.put("configurable_product_1_id", configurableList.get("id")); +vars.put("configurable_attribute_id", configurableList.get("attribute_id")); +vars.put("configurable_option_id", configurableList.get("attribute_option_id")); +vars.put("configurable_product_1_uenc", simpleList.get("uenc")); + +vars.put("category_url_key", props.get("category_url_key")); +vars.put("category_name", props.get("category_name")); + +emails_index = 0; +if (!props.containsKey("customer_emails_index")) { + props.put("customer_emails_index", emails_index); +} + +try { + emails_index = props.get("customer_emails_index"); + emails_list = props.get("customer_emails_list"); + if (emails_index == emails_list.size()) { + emails_index=0; + } + vars.put("customer_email", emails_list.get(emails_index)); + props.put("customer_emails_index", ++emails_index); +} +catch (java.lang.Exception e) { + log.error("Caught Exception in 'Customer Checkout' thread."); + log.info("Using default email address - user_1@example.com"); + vars.put("customer_email", "user_1@example.com"); +} +vars.put("testLabel", "CustomerChkt"); +vars.put("loadType", "Customer");</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> + </BeanShellSampler> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="571386695"><title>Home page</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer All Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-2001627678">\"messages\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Login Page${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/account/login/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="637394530"><title>Customer Login</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Load Login Form${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="blocks" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">["customer_form_login"]</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">blocks</stringProp> + </elementProp> + <elementProp name="handles" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">["default","customer_account_login"]</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">handles</stringProp> + </elementProp> + <elementProp name="originalRequest" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">{"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">originalRequest</stringProp> + </elementProp> + <elementProp name="ajax" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">ajax</stringProp> + </elementProp> + <elementProp name="isAjax" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">isAjax</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}page_cache/block/render/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="940598773">"customer_form_login"</stringProp> + <stringProp name="1951684663">Registered Customers</stringProp> + <stringProp name="474011748">form_key</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">form_key</stringProp> + <stringProp name="RegexExtractor.regex"><input name=\\"form_key\\" type=\\"hidden\\" value=\\"([^'"]+)\\" \\/></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">form_key</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + <elementProp name="login[username]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${customer_email}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">login[username]</stringProp> + </elementProp> + <elementProp name="login[password]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">${customer_password}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">login[password]</stringProp> + </elementProp> + <elementProp name="send" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">send</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/account/loginPost/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1312950388"><title>My Account</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor: Extract category id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">category_id</stringProp> + <stringProp name="RegexExtractor.regex"><li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + <stringProp name="Scope.variable">simple_product_1_url_key</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion: Assert category id" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1191417111">^[0-9]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">category_id</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${simple_product_1_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${simple_product_1_uenc}/product/${simple_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="210217247">You added ${simple_product_1_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2057973164">This product is out of stock.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323027">\"summary_count\":1</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Simple Product 2(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${simple_product_2_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${simple_product_2_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${simple_product_2_uenc}/product/${simple_product_2_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}2${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="221533374">You added ${simple_product_2_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2057973164">This product is out of stock.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323026">\"summary_count\":2</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> + <stringProp name="-1787050162"><span>In stock</span></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Ajax Review Configurable Product 1(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}review/product/listAjax/id/${configurable_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="49586">200</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_code</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 Add To Cart${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${configurable_product_1_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">product</stringProp> + </elementProp> + <elementProp name="related_product" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value"/> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">related_product</stringProp> + </elementProp> + <elementProp name="qty" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">qty</stringProp> + </elementProp> + <elementProp name="super_attribute[${configurable_attribute_id}]" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${configurable_option_id}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">super_attribute[${configurable_attribute_id}]</stringProp> + </elementProp> + <elementProp name="form_key" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">form_key</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/cart/add/uenc/${configurable_product_1_uenc}/product/${configurable_product_1_id}/</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Load ${loadType}3${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">cart,messages</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + <stringProp name="Argument.desc">true</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1346272328">You added ${configurable_product_1_name} to your shopping cart.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-108122347">We don't have as many &quot;${configurable_product_1_name}&quot; as you requested.</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-350323025">\"summary_count\":3</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout start${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-1403911775"><title>Checkout</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-179817969"><title>Shopping Cart</title></stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract Cart Id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">cart_id</stringProp> + <stringProp name="RegexExtractor.regex">"quoteData":{"entity_id":"([^'"]+)",</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">form_key</stringProp> + <stringProp name="RegexExtractor.regex"><input name="form_key" type="hidden" value="([^'"]+)" /></stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract Address Id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">address_id</stringProp> + <stringProp name="RegexExtractor.regex">"default_billing":"([^'"]+)",</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract Customer Id" enabled="true"> + <stringProp name="RegexExtractor.useHeaders">false</stringProp> + <stringProp name="RegexExtractor.refname">customer_id</stringProp> + <stringProp name="RegexExtractor.regex">"customer_id":([^'",]+),</stringProp> + <stringProp name="RegexExtractor.template">$1$</stringProp> + <stringProp name="RegexExtractor.default"/> + <stringProp name="RegexExtractor.match_number">1</stringProp> + </RegexExtractor> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Cart Id extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">cart_id</stringProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="2845929">^.+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">form_key</stringProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Address Id extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="576002869">[0-9]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">address_id</stringProp> + </ResponseAssertion> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Customer Id extracted" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="576002869">[0-9]+$</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">1</intProp> + <stringProp name="Assertion.scope">variable</stringProp> + <stringProp name="Scope.variable">customer_id</stringProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${simple_product_2_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="221533374">You added ${simple_product_2_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="518066445"><div>* This product is out of stock.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">configurable_product_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_product_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 Add To Cart(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${configurable_product_1_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="super_attribute[${configurable_attribute_id}]" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${configurable_option_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">super_attribute[${configurable_attribute_id}]</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${configurable_product_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1346272328">You added ${configurable_product_1_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-815931116"><div>* We don't have as many &quot;${configurable_product_1_name}&quot; as you requested.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout start(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Billing/Shipping Information${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> + <collectionProp name="Arguments.arguments"> + <elementProp name="" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">{"addressInformation":{"shipping_address":{"customerAddressId":"${address_id}","countryId":"US","regionId":5,"regionCode":"AR","region":"Arkansas","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}checkout/index/</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1403911775"><title>Checkout</title></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-179817969"><title>Shopping Cart</title></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract Cart Id" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">cart_id</stringProp> - <stringProp name="RegexExtractor.regex">"quoteData":{"entity_id":"([^'"]+)",</stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">form_key</stringProp> - <stringProp name="RegexExtractor.regex"><input name="form_key" type="hidden" value="([^'"]+)" /></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Cart Id extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">cart_id</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">form_key</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout shipping information" enabled="true"> - <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> - <collectionProp name="Arguments.arguments"> - <elementProp name="" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">{"addressInformation":{"shipping_address":{"countryId":"US","regionId":"12","regionCode":"CA","region"
 -:"California","street":["10441 Jefferson Blvd","ste 200"],"company":"","telephone":"1-310-945-0345","fax"
 -:"","postcode":"90232","city":"Culver City","firstname":"Firstname","lastname":"Lastname","saveInAddressBook"
 -:false},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - </elementProp> - </collectionProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}/rest/default/V1/carts/mine/shipping-information</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Referer</stringProp> + <stringProp name="Header.value">${host}${base_path}checkout/onepage</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}rest/default/V1/carts/${cart_id}/shipping-information</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> - <collectionProp name="HeaderManager.headers"> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Referer</stringProp> - <stringProp name="Header.value">http://mage2.com/checkout/index/</stringProp> - </elementProp> - <elementProp name="Content-Type" elementType="Header"> - <stringProp name="Header.name">Content-Type</stringProp> - <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> - </elementProp> - <elementProp name="X-Requested-With" elementType="Header"> - <stringProp name="Header.name">X-Requested-With</stringProp> - <stringProp name="Header.value">XMLHttpRequest</stringProp> - </elementProp> - <elementProp name="Accept" elementType="Header"> - <stringProp name="Header.name">Accept</stringProp> - <stringProp name="Header.value">application/json</stringProp> - </elementProp> - </collectionProp> - </HeaderManager> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1494218646">{"payment_methods":</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout payment information" enabled="true"> - <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> - <collectionProp name="Arguments.arguments"> - <elementProp name="" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">{"cartId":"${cart_id}","email":"user@example.com","paymentMethod":{"method":"checkmo","po_number":null,"cc_owner":null,"cc_number":null,"cc_type":null,"cc_exp_year":null,"cc_exp_month":null,"additional_data":null},"billingAddress":{"countryId"
 -:"US","regionId":"12","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd","ste 200"
 -],"company":"","telephone":"1-310-945-0345","fax":"","postcode":"90232","city":"Culver City","firstname"
 -:"Firstname","lastname":"Lastname","saveInAddressBook":false}}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - </elementProp> - </collectionProp> + <elementProp name="Content-Type" elementType="Header"> + <stringProp name="Header.name">Content-Type</stringProp> + <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> - <collectionProp name="HeaderManager.headers"> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Referer</stringProp> - <stringProp name="Header.value">http://mage2.com/checkout/index/</stringProp> - </elementProp> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Content-Type</stringProp> - <stringProp name="Header.value">application/json; charset=UTF-8 </stringProp> - </elementProp> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Accept</stringProp> - <stringProp name="Header.value">application/json</stringProp> - </elementProp> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">X-Requested-With</stringProp> - <stringProp name="Header.value">XMLHttpRequest</stringProp> - </elementProp> - </collectionProp> - </HeaderManager> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1412623327">^"\d+"$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout success(GuestChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + <elementProp name="X-Requested-With" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + <elementProp name="Accept" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">application/json</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-740937264">{"payment_methods"</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}checkout/onepage/success/</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="494863233">Thank you for your purchase!</stringProp> - <stringProp name="1635682758">Your order # is</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - </hashTree> - <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Customer Checkout" enabled="true"> - <stringProp name="ThreadGroup.on_sample_error">startnextloop</stringProp> - <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> - <boolProp name="LoopController.continue_forever">false</boolProp> - <stringProp name="LoopController.loops">${loops}</stringProp> - </elementProp> - <stringProp name="ThreadGroup.num_threads">${__javaScript(Math.round(props.get("users")*${customer_checkout_percent}/100>>0))}</stringProp> - <stringProp name="ThreadGroup.ramp_time">${ramp_period}</stringProp> - <longProp name="ThreadGroup.start_time">1304708488000</longProp> - <longProp name="ThreadGroup.end_time">1304708488000</longProp> - <boolProp name="ThreadGroup.scheduler">false</boolProp> - <stringProp name="ThreadGroup.duration"></stringProp> - <stringProp name="ThreadGroup.delay"></stringProp> - </ThreadGroup> - <hashTree> - <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> - <collectionProp name="CookieManager.cookies"> - <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> - <stringProp name="Cookie.value">30</stringProp> - <stringProp name="Cookie.domain">${host}</stringProp> - <stringProp name="Cookie.path">/</stringProp> - <boolProp name="Cookie.secure">false</boolProp> - <longProp name="Cookie.expires">0</longProp> - <boolProp name="Cookie.path_specified">true</boolProp> - <boolProp name="Cookie.domain_specified">true</boolProp> - </elementProp> - </collectionProp> - <boolProp name="CookieManager.clearEachIteration">true</boolProp> - </CookieManager> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="Get arguments(CustomerChkt)" enabled="true"> - <stringProp name="TestPlan.comments">Passing arguments between threads</stringProp> - <stringProp name="BeanShellSampler.query">import org.apache.jmeter.samplers.SampleResult; - -number = (int)(Math.random() * props.get("simple_products_list").size()); -simpleList = props.get("simple_products_list").get(number); -vars.put("simple_product_1_url_key", simpleList.get("url_key")); -vars.put("simple_product_1_name", simpleList.get("title")); -vars.put("simple_product_1_id", simpleList.get("id")); - -do { - number1 = (int)(Math.random() * props.get("simple_products_list").size()); -} while(number == number1); -simpleList = props.get("simple_products_list").get(number1); -vars.put("simple_product_2_url_key", simpleList.get("url_key")); -vars.put("simple_product_2_name", simpleList.get("title")); -vars.put("simple_product_2_id", simpleList.get("id")); - -number = (int)(Math.random() * props.get("configurable_products_list").size()); -configurableList = props.get("configurable_products_list").get(number); -vars.put("configurable_product_1_url_key", configurableList.get("url_key")); -vars.put("configurable_product_1_name", configurableList.get("title")); -vars.put("configurable_product_1_id", configurableList.get("id")); -vars.put("configurable_attribute_id", configurableList.get("attribute_id")); -vars.put("configurable_option_id", configurableList.get("attribute_option_id")); - -vars.put("category_url_key", props.get("category_url_key")); -vars.put("category_name", props.get("category_name")); - -emailsCount = props.get("customer_emails_list").size(); -print(emailsCount); -if (emailsCount < 1) { - log.error("You have to increase customers qty for running 'Customer Checkout' thread."); - System.out.println("You have to increase customers qty for running 'Customer Checkout' thread."); - SampleResult.setStopTest(true); -} else { - emails = props.get("customer_emails_list"); - email = emails.get(emailsCount - 1); - emails.remove(email); - props.put("customer_emails_list", emails); - vars.put("customer_email", email); -}</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">true</boolProp> - </BeanShellSampler> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Home Page(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">true</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="571386695"><title>Home page</title></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Category(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${category_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="1210004667"><span class="base" data-ui-id="page-title">${category_name}</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 View(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout Payment Info/Place Order${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> + <collectionProp name="Arguments.arguments"> + <elementProp name="" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">{"cartId":"${cart_id}","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"customerAddressId":"${address_id}","countryId":"US","regionId":5,"regionCode":"AR","region":"Arkansas","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"}}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="1254853024"><title>${simple_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">simple_product_1_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_1_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 1 Add To Cart(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${simple_product_1_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}rest/default/V1/carts/mine/payment-information</stringProp> + <stringProp name="HTTPSampler.method">POST</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> + <collectionProp name="HeaderManager.headers"> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Referer</stringProp> + <stringProp name="Header.value">${host}${base_path}checkout/onepage</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${simple_product_1_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="210217247">You added ${simple_product_1_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="518066445"><div>* This product is out of stock.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 View(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Content-Type</stringProp> + <stringProp name="Header.value">application/json; charset=UTF-8 </stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${simple_product_2_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2142356705"><title>${simple_product_2_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">simple_product_2_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">simple_product_2_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Simple Product 2 Add To Cart(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${simple_product_2_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> - </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> - </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">Accept</stringProp> + <stringProp name="Header.value">application/json</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${simple_product_2_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="221533374">You added ${simple_product_2_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="518066445"><div>* This product is out of stock.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 View(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> + <elementProp name="" elementType="Header"> + <stringProp name="Header.name">X-Requested-With</stringProp> + <stringProp name="Header.value">XMLHttpRequest</stringProp> + </elementProp> + </collectionProp> + </HeaderManager> + <hashTree/> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert order number" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="-297987887">"[0-9]+"</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> + <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> + <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> + </GaussianRandomTimer> + <hashTree/> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout success${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"/> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}checkout/onepage/success/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="494863233">Thank you for your purchase!</stringProp> + <stringProp name="-1590086334">Your order number is</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Customer Section Load${__property(activeAdminThread)}(${testLabel})" enabled="true"> + <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> + <collectionProp name="Arguments.arguments"> + <elementProp name="sections" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">customer</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">sections</stringProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}${configurable_product_1_url_key}${url_suffix}</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="199922279"><title>${configurable_product_1_name}</stringProp> - <stringProp name="-1787050162"><span>In stock</span></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form action" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">configurable_product_form_action</stringProp> - <stringProp name="RegexExtractor.regex"><form action="([^'"]+)"\s*method="post"\s*id="product_addtocart_form"></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_action extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">configurable_product_form_action</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Configurable Product 1 Add To Cart(CustomerChkt)" enabled="true"> + <elementProp name="update_section_id" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">true</boolProp> + <stringProp name="Argument.value">false</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">update_section_id</stringProp> + </elementProp> + <elementProp name="_" elementType="HTTPArgument"> + <boolProp name="HTTPArgument.always_encode">false</boolProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> + <stringProp name="Argument.metadata">=</stringProp> + <boolProp name="HTTPArgument.use_equals">true</boolProp> + <stringProp name="Argument.name">_</stringProp> + </elementProp> + </collectionProp> + </elementProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}customer/section/load/</stringProp> + <stringProp name="HTTPSampler.method">GET</stringProp> + <boolProp name="HTTPSampler.follow_redirects">true</boolProp> + <boolProp name="HTTPSampler.auto_redirects">false</boolProp> + <boolProp name="HTTPSampler.use_keepalive">true</boolProp> + <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> + <boolProp name="HTTPSampler.monitor">false</boolProp> + <stringProp name="HTTPSampler.embedded_url_re"/> + </HTTPSamplerProxy> + <hashTree> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="1393473040">\"customer\":</stringProp> + </collectionProp> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">2</intProp> + </ResponseAssertion> + <hashTree/> + </hashTree> + </hashTree> + + <PostThreadGroup guiclass="PostThreadGroupGui" testclass="PostThreadGroup" testname="tearDown Thread Group" enabled="true"> + <stringProp name="ThreadGroup.on_sample_error">stoptest</stringProp> + <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> + <boolProp name="LoopController.continue_forever">false</boolProp> + <stringProp name="LoopController.loops">1</stringProp> + </elementProp> + <stringProp name="ThreadGroup.num_threads">1</stringProp> + <stringProp name="ThreadGroup.ramp_time">1</stringProp> + <longProp name="ThreadGroup.start_time">1395324075000</longProp> + <longProp name="ThreadGroup.end_time">1395324075000</longProp> + <boolProp name="ThreadGroup.scheduler">false</boolProp> + <stringProp name="ThreadGroup.duration"/> + <stringProp name="ThreadGroup.delay"/> + </PostThreadGroup> + <hashTree> + <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller: Dashboard enabled?" enabled="true"> + <stringProp name="IfController.condition">"${dashboard_enabled}" == "1"</stringProp> + <boolProp name="IfController.evaluateAll">false</boolProp> + </IfController> + <hashTree> + <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Trigger End Event" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"> - <elementProp name="product" elementType="HTTPArgument"> + <elementProp name="environment" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${configurable_product_1_id}</stringProp> + <stringProp name="Argument.value">${__property(environment)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">product</stringProp> + <stringProp name="Argument.name">environment</stringProp> </elementProp> - <elementProp name="related_product" elementType="HTTPArgument"> + <elementProp name="startTime" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value"></stringProp> + <stringProp name="Argument.value">${start_time}</stringProp> <stringProp name="Argument.metadata">=</stringProp> <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">related_product</stringProp> + <stringProp name="Argument.name">startTime</stringProp> </elementProp> - <elementProp name="qty" elementType="HTTPArgument"> + <elementProp name="endTime" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">1</stringProp> + <stringProp name="Argument.value">${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)}</stringProp> <stringProp name="Argument.metadata">=</stringProp> <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">qty</stringProp> + <stringProp name="Argument.name">endTime</stringProp> </elementProp> - <elementProp name="super_attribute[${configurable_attribute_id}]" elementType="HTTPArgument"> + <elementProp name="stats_server" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">${configurable_option_id}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">super_attribute[${configurable_attribute_id}]</stringProp> - </elementProp> - <elementProp name="isAjax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">isAjax</stringProp> - </elementProp> - <elementProp name="ajax" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">true</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">ajax</stringProp> - </elementProp> - </collectionProp> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${configurable_product_form_action}</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1346272328">You added ${configurable_product_1_name} to your shopping cart.</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-815931116"><div>* We don't have as many &quot;${configurable_product_1_name}&quot; as you requested.</div></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout start(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}checkout/index/</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1403911775"><title>Checkout</title></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-179817969"><title>Shopping Cart</title></stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">6</intProp> - </ResponseAssertion> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract Cart Id" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">cart_id</stringProp> - <stringProp name="RegexExtractor.regex">"quoteData":{"entity_id":"([^'"]+)",</stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract form key" enabled="true"> - <stringProp name="RegexExtractor.useHeaders">false</stringProp> - <stringProp name="RegexExtractor.refname">form_key</stringProp> - <stringProp name="RegexExtractor.regex"><input name="form_key" type="hidden" value="([^'"]+)" /></stringProp> - <stringProp name="RegexExtractor.template">$1$</stringProp> - <stringProp name="RegexExtractor.default"></stringProp> - <stringProp name="RegexExtractor.match_number">1</stringProp> - </RegexExtractor> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert Cart Id extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">cart_id</stringProp> - </ResponseAssertion> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert form_key extracted" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="2845929">^.+$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - <stringProp name="Assertion.scope">variable</stringProp> - <stringProp name="Scope.variable">form_key</stringProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"> - <elementProp name="context" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">true</boolProp> - <stringProp name="Argument.name">context</stringProp> - <stringProp name="Argument.value">checkout</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - </elementProp> - <elementProp name="login[username]" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">true</boolProp> - <stringProp name="Argument.value">${customer_email}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">login[username]</stringProp> - </elementProp> - <elementProp name="login[password]" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">true</boolProp> - <stringProp name="Argument.value">${customer_password}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">login[password]</stringProp> - </elementProp> - <elementProp name="form_key" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">true</boolProp> - <stringProp name="Argument.value">${form_key}</stringProp> + <stringProp name="Argument.value">${redis_host}</stringProp> <stringProp name="Argument.metadata">=</stringProp> <boolProp name="HTTPArgument.use_equals">true</boolProp> - <stringProp name="Argument.name">form_key</stringProp> - </elementProp> - </collectionProp> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}customer/account/loginPost/</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree/> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout shipping information" enabled="true"> - <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> - <collectionProp name="Arguments.arguments"> - <elementProp name="" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">{"addressInformation":{"shipping_address":{"countryId":"US","regionId":"12","regionCode":"CA","region"
 -:"California","street":["10441 Jefferson Blvd","ste 200"],"company":"","telephone":"1-310-945-0345","fax"
 -:"","postcode":"90232","city":"Culver City","firstname":"Firstname","lastname":"Lastname","saveInAddressBook"
 -:false},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> - </elementProp> - </collectionProp> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}rest/default/V1/carts/mine/shipping-information</stringProp> - <stringProp name="HTTPSampler.method">POST</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> - <collectionProp name="HeaderManager.headers"> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Referer</stringProp> - <stringProp name="Header.value">http://mage2.com/checkout/index/</stringProp> - </elementProp> - <elementProp name="Content-Type" elementType="Header"> - <stringProp name="Header.name">Content-Type</stringProp> - <stringProp name="Header.value">application/json; charset=UTF-8</stringProp> - </elementProp> - <elementProp name="X-Requested-With" elementType="Header"> - <stringProp name="Header.name">X-Requested-With</stringProp> - <stringProp name="Header.value">XMLHttpRequest</stringProp> - </elementProp> - <elementProp name="Accept" elementType="Header"> - <stringProp name="Header.name">Accept</stringProp> - <stringProp name="Header.value">application/json</stringProp> - </elementProp> - </collectionProp> - </HeaderManager> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1494218646">{"payment_methods":</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> - <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout payment information" enabled="true"> - <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> - <collectionProp name="Arguments.arguments"> - <elementProp name="" elementType="HTTPArgument"> - <boolProp name="HTTPArgument.always_encode">false</boolProp> - <stringProp name="Argument.value">{"cartId":"${cart_id}","paymentMethod":{"method":"checkmo","po_number":null,"cc_owner":null,"cc_number":null
 -,"cc_type":null,"cc_exp_year":null,"cc_exp_month":null,"additional_data":null},"billingAddress":{"countryId"
 -:"US","regionId":"12","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd","ste 200"
 -],"company":"","telephone":"1-310-945-0345","fax":"","postcode":"90232","city":"Culver City","firstname"
 -:"Firstname","lastname":"Lastname","saveInAddressBook":false}}</stringProp> - <stringProp name="Argument.metadata">=</stringProp> + <stringProp name="Argument.name">stats_server</stringProp> </elementProp> </collectionProp> </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp> - <stringProp name="HTTPSampler.path">${base_path}rest/default/V1/carts/mine/payment-information</stringProp> + <stringProp name="HTTPSampler.domain"/> + <stringProp name="HTTPSampler.port"/> + <stringProp name="HTTPSampler.connect_timeout"/> + <stringProp name="HTTPSampler.response_timeout"/> + <stringProp name="HTTPSampler.protocol"/> + <stringProp name="HTTPSampler.contentEncoding"/> + <stringProp name="HTTPSampler.path">${base_path}DeploymentEvent.php</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> + <stringProp name="HTTPSampler.embedded_url_re"/> </HTTPSamplerProxy> - <hashTree> - <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> - <collectionProp name="HeaderManager.headers"> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Referer</stringProp> - <stringProp name="Header.value">http://mage2.com/checkout/index/</stringProp> - </elementProp> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Content-Type</stringProp> - <stringProp name="Header.value">application/json; charset=UTF-8 </stringProp> - </elementProp> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">Accept</stringProp> - <stringProp name="Header.value">application/json</stringProp> - </elementProp> - <elementProp name="" elementType="Header"> - <stringProp name="Header.name">X-Requested-With</stringProp> - <stringProp name="Header.value">XMLHttpRequest</stringProp> - </elementProp> - </collectionProp> - </HeaderManager> - <hashTree/> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="-1412623327">^"\d+"$</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">1</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - <GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="Random Timer" enabled="true"> - <stringProp name="ConstantTimer.delay">${think_time_delay_offset}</stringProp> - <stringProp name="RandomTimer.range">${think_time_deviation}</stringProp> - </GaussianRandomTimer> <hashTree/> - <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Checkout success(CustomerChkt)" enabled="true"> - <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true"> - <collectionProp name="Arguments.arguments"/> - </elementProp> - <stringProp name="HTTPSampler.domain"></stringProp> - <stringProp name="HTTPSampler.port"></stringProp> - <stringProp name="HTTPSampler.connect_timeout"></stringProp> - <stringProp name="HTTPSampler.response_timeout"></stringProp> - <stringProp name="HTTPSampler.protocol">http</stringProp> - <stringProp name="HTTPSampler.contentEncoding"></stringProp> - <stringProp name="HTTPSampler.path">${base_path}checkout/onepage/success/</stringProp> - <stringProp name="HTTPSampler.method">GET</stringProp> - <boolProp name="HTTPSampler.follow_redirects">true</boolProp> - <boolProp name="HTTPSampler.auto_redirects">false</boolProp> - <boolProp name="HTTPSampler.use_keepalive">true</boolProp> - <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> - <boolProp name="HTTPSampler.monitor">false</boolProp> - <stringProp name="HTTPSampler.embedded_url_re"></stringProp> - </HTTPSamplerProxy> - <hashTree> - <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> - <collectionProp name="Asserion.test_strings"> - <stringProp name="494863233">Thank you for your purchase!</stringProp> - <stringProp name="-1590086334">Your order number is</stringProp> - </collectionProp> - <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> - <boolProp name="Assertion.assume_success">false</boolProp> - <intProp name="Assertion.test_type">2</intProp> - </ResponseAssertion> - <hashTree/> - </hashTree> - </hashTree> - <PostThreadGroup guiclass="PostThreadGroupGui" testclass="PostThreadGroup" testname="tearDown Thread Group" enabled="true"> - <stringProp name="ThreadGroup.on_sample_error">stoptest</stringProp> - <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> - <boolProp name="LoopController.continue_forever">false</boolProp> - <stringProp name="LoopController.loops">1</stringProp> - </elementProp> - <stringProp name="ThreadGroup.num_threads">1</stringProp> - <stringProp name="ThreadGroup.ramp_time">1</stringProp> - <longProp name="ThreadGroup.start_time">1395324075000</longProp> - <longProp name="ThreadGroup.end_time">1395324075000</longProp> - <boolProp name="ThreadGroup.scheduler">false</boolProp> - <stringProp name="ThreadGroup.duration"></stringProp> - <stringProp name="ThreadGroup.delay"></stringProp> - </PostThreadGroup> - <hashTree> - <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> - <collectionProp name="CookieManager.cookies"> - <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> - <stringProp name="Cookie.value">30</stringProp> - <stringProp name="Cookie.domain">${host}</stringProp> - <stringProp name="Cookie.path">/</stringProp> - <boolProp name="Cookie.secure">false</boolProp> - <longProp name="Cookie.expires">0</longProp> - <boolProp name="Cookie.path_specified">true</boolProp> - <boolProp name="Cookie.domain_specified">true</boolProp> - </elementProp> + <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert curl call was successful" enabled="true"> + <collectionProp name="Asserion.test_strings"> + <stringProp name="185669135">Errors:</stringProp> </collectionProp> - <boolProp name="CookieManager.clearEachIteration">true</boolProp> - </CookieManager> - <hashTree/> - <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler: Clear properties" enabled="true"> - <stringProp name="BeanShellSampler.query">props.remove("category_url_key"); -props.remove("category_name"); -props.remove("simple_products_list"); -props.remove("configurable_products_list"); -props.remove("users"); -props.remove("customer_emails_list");</stringProp> - <stringProp name="BeanShellSampler.filename"></stringProp> - <stringProp name="BeanShellSampler.parameters"></stringProp> - <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> - </BeanShellSampler> + <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> + <boolProp name="Assertion.assume_success">false</boolProp> + <intProp name="Assertion.test_type">6</intProp> + </ResponseAssertion> <hashTree/> </hashTree> - <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> - <boolProp name="ResultCollector.error_logging">false</boolProp> - <objProp> - <name>saveConfig</name> - <value class="SampleSaveConfiguration"> - <time>true</time> - <latency>true</latency> - <timestamp>true</timestamp> - <success>true</success> - <label>true</label> - <code>true</code> - <message>true</message> - <threadName>true</threadName> - <dataType>true</dataType> - <encoding>false</encoding> - <assertions>true</assertions> - <subresults>true</subresults> - <responseData>false</responseData> - <samplerData>false</samplerData> - <xml>false</xml> - <fieldNames>false</fieldNames> - <responseHeaders>false</responseHeaders> - <requestHeaders>false</requestHeaders> - <responseDataOnError>false</responseDataOnError> - <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> - <assertionsResultsToSave>0</assertionsResultsToSave> - <bytes>true</bytes> - <hostname>true</hostname> - <threadCounts>true</threadCounts> - <sampleCount>true</sampleCount> - </value> - </objProp> - <stringProp name="filename">${report_save_path}/view-results-tree.log</stringProp> - </ResultCollector> - <hashTree/> - <ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="Detailed URLs report" enabled="true"> - <boolProp name="ResultCollector.error_logging">false</boolProp> - <objProp> - <name>saveConfig</name> - <value class="SampleSaveConfiguration"> - <time>true</time> - <latency>false</latency> - <timestamp>false</timestamp> - <success>false</success> - <label>true</label> - <code>false</code> - <message>false</message> - <threadName>false</threadName> - <dataType>false</dataType> - <encoding>false</encoding> - <assertions>false</assertions> - <subresults>false</subresults> - <responseData>false</responseData> - <samplerData>false</samplerData> - <xml>false</xml> - <fieldNames>true</fieldNames> - <responseHeaders>false</responseHeaders> - <requestHeaders>false</requestHeaders> - <responseDataOnError>false</responseDataOnError> - <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> - <assertionsResultsToSave>0</assertionsResultsToSave> - <url>true</url> - <hostname>true</hostname> - <threadCounts>true</threadCounts> - <sampleCount>true</sampleCount> - </value> - </objProp> - <stringProp name="filename">${report_save_path}/detailed-urls-report.log</stringProp> - </ResultCollector> - <hashTree/> - <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"> - <boolProp name="ResultCollector.error_logging">false</boolProp> - <objProp> - <name>saveConfig</name> - <value class="SampleSaveConfiguration"> - <time>true</time> - <latency>true</latency> - <timestamp>true</timestamp> - <success>true</success> - <label>true</label> - <code>true</code> - <message>true</message> - <threadName>true</threadName> - <dataType>true</dataType> - <encoding>false</encoding> - <assertions>true</assertions> - <subresults>true</subresults> - <responseData>false</responseData> - <samplerData>false</samplerData> - <xml>false</xml> - <fieldNames>false</fieldNames> - <responseHeaders>false</responseHeaders> - <requestHeaders>false</requestHeaders> - <responseDataOnError>false</responseDataOnError> - <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> - <assertionsResultsToSave>0</assertionsResultsToSave> - <bytes>true</bytes> - <hostname>true</hostname> - <threadCounts>true</threadCounts> - <sampleCount>true</sampleCount> - </value> - </objProp> - <stringProp name="filename">${report_save_path}/summary-report.log</stringProp> - </ResultCollector> + <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> + <collectionProp name="CookieManager.cookies"> + <elementProp name="product_list_limit" elementType="Cookie" testname="product_list_limit"> + <stringProp name="Cookie.value">30</stringProp> + <stringProp name="Cookie.domain">${host}</stringProp> + <stringProp name="Cookie.path">/</stringProp> + <boolProp name="Cookie.secure">false</boolProp> + <longProp name="Cookie.expires">0</longProp> + <boolProp name="Cookie.path_specified">true</boolProp> + <boolProp name="Cookie.domain_specified">true</boolProp> + </elementProp> + </collectionProp> + <boolProp name="CookieManager.clearEachIteration">true</boolProp> + </CookieManager> + <hashTree/> + <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="SetUp - BeanShell Sampler: Clear properties" enabled="true"> + <stringProp name="BeanShellSampler.query">props.remove("category_url_key"); +props.remove("category_name"); +props.remove("simple_products_list"); +props.remove("configurable_products_list"); +props.remove("users"); +props.remove("customer_emails_list");</stringProp> + <stringProp name="BeanShellSampler.filename"/> + <stringProp name="BeanShellSampler.parameters"/> + <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> + </BeanShellSampler> <hashTree/> </hashTree> + + <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> + <boolProp name="ResultCollector.error_logging">false</boolProp> + <objProp> + <name>saveConfig</name> + <value class="SampleSaveConfiguration"> + <time>true</time> + <latency>true</latency> + <timestamp>true</timestamp> + <success>true</success> + <label>true</label> + <code>true</code> + <message>true</message> + <threadName>true</threadName> + <dataType>true</dataType> + <encoding>false</encoding> + <assertions>true</assertions> + <subresults>true</subresults> + <responseData>false</responseData> + <samplerData>false</samplerData> + <xml>false</xml> + <fieldNames>false</fieldNames> + <responseHeaders>false</responseHeaders> + <requestHeaders>false</requestHeaders> + <responseDataOnError>false</responseDataOnError> + <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> + <assertionsResultsToSave>0</assertionsResultsToSave> + <bytes>true</bytes> + <threadCounts>true</threadCounts> + </value> + </objProp> + <objProp> + <name/> + <value class="SampleSaveConfiguration"> + <time>true</time> + <latency>true</latency> + <timestamp>true</timestamp> + <success>true</success> + <label>true</label> + <code>true</code> + <message>true</message> + <threadName>true</threadName> + <dataType>true</dataType> + <encoding>false</encoding> + <assertions>true</assertions> + <subresults>true</subresults> + <responseData>false</responseData> + <samplerData>false</samplerData> + <xml>true</xml> + <fieldNames>false</fieldNames> + <responseHeaders>false</responseHeaders> + <requestHeaders>true</requestHeaders> + <responseDataOnError>false</responseDataOnError> + <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> + <assertionsResultsToSave>0</assertionsResultsToSave> + <bytes>true</bytes> + <hostname>true</hostname> + <threadCounts>true</threadCounts> + <sampleCount>true</sampleCount> + </value> + </objProp> + <stringProp name="filename"/> + </ResultCollector> + <hashTree/> + + <ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="Detailed URLs report" enabled="true"> + <boolProp name="ResultCollector.error_logging">false</boolProp> + <objProp> + <name>saveConfig</name> + <value class="SampleSaveConfiguration"> + <time>true</time> + <latency>false</latency> + <timestamp>false</timestamp> + <success>false</success> + <label>true</label> + <code>false</code> + <message>false</message> + <threadName>false</threadName> + <dataType>false</dataType> + <encoding>false</encoding> + <assertions>false</assertions> + <subresults>false</subresults> + <responseData>false</responseData> + <samplerData>false</samplerData> + <xml>false</xml> + <fieldNames>true</fieldNames> + <responseHeaders>false</responseHeaders> + <requestHeaders>false</requestHeaders> + <responseDataOnError>false</responseDataOnError> + <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> + <assertionsResultsToSave>0</assertionsResultsToSave> + <url>true</url> + <hostname>true</hostname> + <threadCounts>true</threadCounts> + <sampleCount>true</sampleCount> + </value> + </objProp> + <stringProp name="filename">${report_save_path}/detailed-urls-report.log</stringProp> + </ResultCollector> + <hashTree/> + + <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"> + <boolProp name="ResultCollector.error_logging">false</boolProp> + <objProp> + <name>saveConfig</name> + <value class="SampleSaveConfiguration"> + <time>true</time> + <latency>true</latency> + <timestamp>true</timestamp> + <success>true</success> + <label>true</label> + <code>true</code> + <message>true</message> + <threadName>true</threadName> + <dataType>true</dataType> + <encoding>false</encoding> + <assertions>true</assertions> + <subresults>true</subresults> + <responseData>false</responseData> + <samplerData>false</samplerData> + <xml>false</xml> + <fieldNames>false</fieldNames> + <responseHeaders>false</responseHeaders> + <requestHeaders>false</requestHeaders> + <responseDataOnError>false</responseDataOnError> + <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> + <assertionsResultsToSave>0</assertionsResultsToSave> + <bytes>true</bytes> + <hostname>true</hostname> + <threadCounts>true</threadCounts> + <sampleCount>true</sampleCount> + </value> + </objProp> + <stringProp name="filename">${report_save_path}/summary-report.log</stringProp> + </ResultCollector> + <hashTree/> + </hashTree> + <WorkBench guiclass="WorkBenchGui" testclass="WorkBench" testname="WorkBench" enabled="true"> + <boolProp name="WorkBench.save">true</boolProp> + </WorkBench> </hashTree> </jmeterTestPlan> diff --git a/setup/pub/magento/setup/readiness-check.js b/setup/pub/magento/setup/readiness-check.js index d150e2f5cb1376818e275bde259daa02961965f5..0dcc1bb42d5fa41f7756ef19a57459a7a490c3dc 100644 --- a/setup/pub/magento/setup/readiness-check.js +++ b/setup/pub/magento/setup/readiness-check.js @@ -24,14 +24,14 @@ angular.module('readiness-check', []) }; switch ($state.current.type) { case 'uninstall': - $scope.dependencyUrl = 'index.php/environment/uninstall-dependency-check'; + $scope.dependencyUrl = 'index.php/dependency-check/uninstall-dependency-check'; if ($localStorage.packages) { $scope.componentDependency.packages = $localStorage.packages; } break; case 'enable': case 'disable': - $scope.dependencyUrl = 'index.php/environment/enable-disable-dependency-check'; + $scope.dependencyUrl = 'index.php/dependency-check/enable-disable-dependency-check'; if ($localStorage.packages) { $scope.componentDependency.packages = { type: $state.current.type, @@ -40,7 +40,7 @@ angular.module('readiness-check', []) } break; default: - $scope.dependencyUrl = 'index.php/environment/component-dependency'; + $scope.dependencyUrl = 'index.php/dependency-check/component-dependency'; if ($localStorage.packages) { $scope.componentDependency.packages = $localStorage.packages; } diff --git a/setup/pub/styles/setup.css b/setup/pub/styles/setup.css index ebfc3c336164a2046dcf2123e4c325b9f5dddeac..37dbf409f7a4c8f8b8282bcfc4591ff5dde62a93 100644 --- a/setup/pub/styles/setup.css +++ b/setup/pub/styles/setup.css @@ -3,4 +3,4 @@ * See COPYING.txt for license details. */ -.abs-action-delete,.abs-icon,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-radio+label:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__menu .level-0>a:before,.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;line-height:1;font-style:normal;font-weight:400;speak:none}.validation-symbol:after{content:'*';color:#e22626;font-weight:400;margin-left:3px}.abs-modal-overlay,.modals-overlay{background:rgba(0,0,0,.35);bottom:0;left:0;position:fixed;right:0;top:0}.abs-action-delete>span,.abs-visually-hidden,.admin__control-fields .admin__field:nth-child(n+2):not(.admin__field-option)>.admin__field-label,.admin__field-tooltip .admin__field-tooltip-action span,.selectmenu .action-delete>span,.selectmenu .action-edit>span,.selectmenu .action-save>span,.selectmenu-toggle span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.abs-visually-hidden-reset{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.abs-clearfix:after,.abs-clearfix:before,.action-multicheck-wrap:after,.action-multicheck-wrap:before,.actions-split:after,.actions-split:before,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:before,.admin__data-grid-filters-footer:after,.admin__data-grid-filters-footer:before,.admin__data-grid-filters:after,.admin__data-grid-filters:before,.admin__data-grid-header-row:after,.admin__data-grid-header-row:before,.page-actions._fixed:after,.page-actions._fixed:before,.page-content:after,.page-content:before,.page-header-actions:after,.page-header-actions:before,.page-main-actions:not(._hidden):after,.page-main-actions:not(._hidden):before{content:'';display:table}.abs-clearfix:after,.action-multicheck-wrap:after,.actions-split:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-filters-footer:after,.admin__data-grid-filters:after,.admin__data-grid-header-row:after,.page-actions._fixed:after,.page-content:after,.page-header-actions:after,.page-main-actions:not(._hidden):after{clear:both}.abs-list-reset-styles{margin:0;padding:0;list-style:none}.abs-draggable-handle{cursor:-webkit-grab;cursor:move;font-size:0;margin-top:-4px;padding:0 1rem 0 0;vertical-align:middle;display:inline-block;text-decoration:none}.abs-draggable-handle:before{-webkit-font-smoothing:antialiased;font-size:1.8rem;line-height:inherit;color:#9e9e9e;content:'\e617';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.abs-draggable-handle:hover:before{color:#858585}html{box-sizing:border-box;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}:focus{box-shadow:none;outline:0}._keyfocus :focus{box-shadow:0 0 0 1px #008bdb}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}embed,img,object,video{max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/light/opensans-300.eot);src:url(../fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../fonts/opensans/light/opensans-300.woff) format('woff'),url(../fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/regular/opensans-400.eot);src:url(../fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../fonts/opensans/regular/opensans-400.woff) format('woff'),url(../fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/semibold/opensans-600.eot);src:url(../fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/bold/opensans-700.eot);src:url(../fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../fonts/opensans/bold/opensans-700.woff) format('woff'),url(../fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#333;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.36;font-size:1.4rem}h1{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2.8rem}h2{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2rem}h3{margin:0 0 2rem;color:#41362f;font-weight:600;line-height:1.2;font-size:1.7rem}h4,h5,h6{font-weight:600;margin-top:0}p{margin:0 0 1em}small{font-size:1.2rem}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}dl,ol,ul{padding-left:0}nav ol,nav ul{list-style:none;margin:0;padding:0}html{height:100%}body{background-color:#fff;min-height:100%;min-width:102.4rem}.page-wrapper{background-color:#fff;display:inline-block;margin-left:-4px;vertical-align:top;width:calc(100% - 8.8rem)}.page-content{padding-bottom:3rem;padding-left:3rem;padding-right:3rem}.notices-wrapper{margin:0 3rem}.notices-wrapper .messages{margin-bottom:0}@media (min-width:1024px){html{width:100vw}body{overflow-x:hidden}}.row{margin-left:0;margin-right:0}.row:after{clear:both;content:'';display:table}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:0;padding-right:0}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.row-gutter{margin-left:-1.5rem;margin-right:-1.5rem}.row-gutter>[class*=col-]{padding-left:1.5rem;padding-right:1.5rem}.abs-clearer:after,.component-manager-content:after,.component-manager-title:after,.form-row:after,.header:after,.nav:after,body:after{clear:both;content:'';display:table}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:Icons;src:url(../fonts/icons/icons.eot);src:url(../fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../fonts/icons/icons.woff2) format('woff2'),url(../fonts/icons/icons.woff) format('woff'),url(../fonts/icons/icons.ttf) format('truetype'),url(../fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}.icon-failed:before,.icon-success:before,[class*=icon-]:after{font-family:Icons}.icon-success{color:#79a22e}.icon-success:before{content:'\e62d'}.icon-failed{color:#e22626}.icon-failed:before{content:'\e632'}.icon-success-thick:after{content:'\e62d'}.icon-collapse:after{content:'\e615'}.icon-failed-thick:after{content:'\e632'}.icon-expand:after{content:'\e616'}.icon-warning:after{content:'\e623'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.5em;left:0;position:absolute;right:0;top:.45em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e62d'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e632'}dl,ol,ul{margin-top:0}.list{padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success,.list-item-warning{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{left:-.1em;position:absolute}.list-item-success:before{color:#79a22e}.list-item-failed:before{color:#e22626}.list-item-warning:before{color:#ef672f}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .9em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-medium{font-size:1.4rem;padding:.5em 1.5em .6em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:active,.btn-link:focus,.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:focus,.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1);color:#fff}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active,.btn-secondary:focus{background-color:#574e48;color:#fff}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary[disabled]:active{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:focus:after,.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:focus:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:focus:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:focus:after,.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:focus:after,.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:focus:after,.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}.form-row.form-row-text{padding-top:.6rem}.form-row.form-row-text .action-sign-out{font-size:1.2rem;margin-left:1rem}.form-note{font-size:1.2rem;font-weight:600;margin-top:1rem}.form-el-dummy{display:none}.fieldset{border:0;margin:0;min-width:0;padding:0}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-el-input:required{box-shadow:none}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;vertical-align:top;padding:.43em .55em .5em 0}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{margin-bottom:2.5em;padding-top:1.5em;font-weight:600;font-size:1.25em}.form-legend{width:100%;border-top:1px solid #ccc}.form-legend-light{margin-bottom:1.5em;font-size:1em}.form-legend-expand{cursor:pointer;transition:opacity .2s linear}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e615'}.form-legend-expand:after{margin-left:.5em;font-weight:400;font-size:1.15em;font-family:Icons;content:'\e616';vertical-align:sub}.form-el-checkbox,.form-el-radio{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{background-color:#fff;border-color:#adadad;border-radius:2px;height:1.6rem;line-height:1.2;width:1.6rem;font-size:1.2rem}.form-el-checkbox:checked+.form-label::before{content:'\e62d';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.8rem;width:1.8rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative;z-index:0}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{position:relative;height:45.2rem;border:1px solid #adadad;overflow:auto;margin:0 0 1.5rem}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.8rem 1rem .9rem}.check-result-message{margin-left:.5em;min-height:3.68rem;-webkit-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}body:not([class]){min-width:0}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0}.abs-action-delete,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-radio+label:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__menu .level-0>a:before,.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;line-height:1;font-style:normal;font-weight:400;speak:none}.text-stretch{margin-bottom:1.5em}.page-title-jumbo{font-size:4rem;font-weight:300;letter-spacing:-.05em;margin-bottom:2.9rem}.page-title-jumbo-success:before{color:#79a22e;content:'\e62d';font-size:3.9rem;margin-left:-.3rem;margin-right:2.4rem}.list{margin-bottom:3rem}.list-dot .list-item{display:list-item;list-style-position:inside;margin-bottom:1.2rem}.list-title{color:#333;font-size:1.4rem;font-weight:700;letter-spacing:.025em;margin-bottom:1.2rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{font-family:Icons;font-size:1.6rem;top:0}.list-item-success:before{content:'\e62d';font-size:1.6rem}.list-item-failed:before{content:'\e632';font-size:1.4rem;left:.1rem;top:.2rem}.list-item-warning:before{content:'\e623';font-size:1.3rem;left:.2rem}.form-wrap{padding-top:2.1rem;margin-bottom:3.6rem}.form-el-label-horizontal{display:inline-block;font-size:1.3rem;font-weight:600;letter-spacing:.025em;margin-left:.4rem;margin-bottom:.4rem}.app-updater{min-width:768px}body._has-modal{height:100%;overflow:hidden;width:100%}.modals-overlay{z-index:899}.modal-popup,.modal-slide{bottom:0;min-width:0;pointer-events:none;position:fixed;right:0;top:0;visibility:hidden}.modal-popup._show,.modal-slide._show{visibility:visible}.modal-popup._show .modal-inner-wrap,.modal-slide._show .modal-inner-wrap{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-popup .modal-inner-wrap,.modal-slide .modal-inner-wrap{background-color:#fff;box-shadow:0 0 12px 2px rgba(0,0,0,.35);opacity:1;pointer-events:auto}.modal-slide{left:14.8rem;z-index:900}.modal-slide._show .modal-inner-wrap{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto}.modal-slide._inner-scroll .modal-inner-wrap{overflow-y:visible;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.modal-slide._inner-scroll .modal-footer,.modal-slide._inner-scroll .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.modal-slide._inner-scroll .modal-content{overflow-y:auto}.modal-slide._inner-scroll .modal-footer{margin-top:auto}.modal-slide .modal-content,.modal-slide .modal-footer,.modal-slide .modal-header{padding:0 2.6rem 2.6rem}.modal-slide .modal-header{padding-bottom:2.1rem;padding-top:2.1rem}.modal-popup{left:0;overflow-y:auto;z-index:900}.modal-popup._show .modal-inner-wrap{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.modal-popup .modal-inner-wrap{box-sizing:border-box;height:auto;left:0;margin:5rem auto;position:absolute;right:0;-webkit-transform:translateY(-200%);-ms-transform:translateY(-200%);transform:translateY(-200%);transition-duration:.2s;transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-timing-function:ease;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:75%}.modal-popup._inner-scroll{overflow-y:visible}.ie10 .modal-popup._inner-scroll,.ie9 .modal-popup._inner-scroll{overflow-y:auto}.modal-popup._inner-scroll .modal-inner-wrap{max-height:90%}.ie10 .modal-popup._inner-scroll .modal-inner-wrap,.ie9 .modal-popup._inner-scroll .modal-inner-wrap{max-height:none}.modal-popup._inner-scroll .modal-content{overflow-y:auto}.modal-popup .modal-content,.modal-popup .modal-footer,.modal-popup .modal-header{padding-left:3rem;padding-right:3rem}.modal-popup .modal-footer,.modal-popup .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.modal-popup .modal-header{padding-bottom:3rem;padding-top:3rem}.modal-popup .modal-footer{margin-top:auto;padding-bottom:3rem;padding-top:3rem}.modal-popup .modal-footer-actions{text-align:right}.modal-popup.confirm .modal-inner-wrap{left:50%;margin-left:-25rem;width:50rem}.modal-popup.confirm .modal-footer{text-align:right}.modal-popup._image-box .modal-inner-wrap{margin:5rem auto;max-width:78rem;position:static}.modal-popup._image-box .thumbnail-preview{padding-bottom:3rem;text-align:center}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image-block{border:1px solid #ccc;margin:0 auto 2rem;max-width:58rem;padding:2rem}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image{max-height:54rem}@media (max-width:768px){.modal-popup.modal-slide{left:14.8rem;z-index:900}.modal-popup.modal-slide._show .modal-inner-wrap{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.modal-popup.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto;margin:0;max-height:none}}.admin__action-dropdown-wrap{display:inline-block;position:relative}.admin__action-dropdown-wrap .admin__action-dropdown-text:after{left:-6px;right:0}.admin__action-dropdown-wrap .admin__action-dropdown-menu{left:auto;right:0}.admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__action-dropdown-wrap.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin__action-dropdown-wrap._active .admin__action-dropdown-text:after,.admin__action-dropdown-wrap.active .admin__action-dropdown-text:after{background-color:#fff;content:'';height:6px;position:absolute;top:100%}.admin__action-dropdown-wrap._active .admin__action-dropdown-menu,.admin__action-dropdown-wrap.active .admin__action-dropdown-menu{display:block}.admin__action-dropdown-wrap._disabled .admin__action-dropdown{cursor:default}.admin__action-dropdown-wrap._disabled:hover .admin__action-dropdown{color:#333}.admin__action-dropdown{background-color:#fff;border:1px solid transparent;border-bottom:none;border-radius:0;box-shadow:none;color:#333;display:inline-block;font-size:1.3rem;font-weight:400;letter-spacing:-.025em;padding:.7rem 3.3rem .8rem 1.5rem;position:relative;vertical-align:baseline;z-index:2}.admin__action-dropdown._active:after,.admin__action-dropdown.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .admin__action-dropdown:after,.active .admin__action-dropdown:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin__action-dropdown:focus,.admin__action-dropdown:hover{background-color:#fff;color:#000;text-decoration:none}.admin__action-dropdown:after{right:1.5rem}.admin__action-dropdown:before{margin-right:1rem}.admin__action-dropdown-menu{background-color:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;line-height:1.36;margin-top:-1px;min-width:120%;padding:.5rem 1rem;position:absolute;top:100%;transition:all .15s ease;z-index:1}.admin__action-dropdown-menu>li{display:block}.admin__action-dropdown-menu>li>a{color:#333;display:block;text-decoration:none;padding:.6rem .5rem}.selectmenu{display:inline-block;position:relative;text-align:left;z-index:1}.selectmenu._active{z-index:500;border-color:#007bdb}.selectmenu .action-delete,.selectmenu .action-edit,.selectmenu .action-save{background-color:transparent;border-color:transparent;box-shadow:none;padding:0 1rem}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover,.selectmenu .action-save:hover{background-color:transparent;border-color:transparent;box-shadow:none}.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before{content:'\e630'}.selectmenu .action-delete,.selectmenu .action-edit{border:0 solid #fff;border-left-width:1px;bottom:0;position:absolute;right:0;top:0;z-index:1}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover{border:0 solid #fff;border-left-width:1px}.selectmenu .action-save:before{content:'\e625'}.selectmenu .action-edit:before{content:'\e631'}.selectmenu-value{display:inline-block}.selectmenu-value input[type=text]{-moz-appearance:none;-webkit-appearance:none;appearance:none;border:0;display:inline;margin:0;width:6rem}body._keyfocus .selectmenu-value input[type=text]:focus{box-shadow:none}.selectmenu-toggle{padding-right:3rem;background:0 0;border-width:0;bottom:0;float:right;position:absolute;right:0;top:0;width:0}.selectmenu-toggle._active:after,.selectmenu-toggle.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.1rem;top:50%;transition:all .2s linear;width:0}._active .selectmenu-toggle:after,.active .selectmenu-toggle:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:hover:after{border-color:#000 transparent transparent}.selectmenu-toggle:active,.selectmenu-toggle:focus,.selectmenu-toggle:hover{background:0 0}.selectmenu._active .selectmenu-toggle:before{border-color:#007bdb}body._keyfocus .selectmenu-toggle:focus{box-shadow:none}.selectmenu-toggle:before{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';display:block;position:absolute;right:0;top:0;width:3.2rem}.selectmenu-items{background:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;float:left;left:-1px;margin-top:3px;max-width:20rem;min-width:calc(100% + 2px);position:absolute;top:100%}.selectmenu-items._active{display:block}.selectmenu-items ul{float:left;list-style-type:none;margin:0;min-width:100%;padding:0}.selectmenu-items li{display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;transition:background .2s linear}.selectmenu-items li:hover{background:#e3e3e3}.selectmenu-items li:last-child .selectmenu-item-action,.selectmenu-items li:last-child .selectmenu-item-action:visited{color:#008bdb;text-decoration:none}.selectmenu-items li:last-child .selectmenu-item-action:hover{color:#0fa7ff;text-decoration:underline}.selectmenu-items li:last-child .selectmenu-item-action:active{color:#ff5501;text-decoration:underline}.selectmenu-item{position:relative;width:100%;z-index:1}li._edit>.selectmenu-item{display:none}.selectmenu-item-edit{display:none;padding:.3rem 4rem .3rem .4rem;position:relative;white-space:nowrap;z-index:1}li:last-child .selectmenu-item-edit{padding-right:.4rem}.selectmenu-item-edit .admin__control-text{width:5.4rem;margin:0}li._edit .selectmenu-item-edit{display:block}.selectmenu-item-action{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:0;color:#333;display:block;font-size:1.4rem;font-weight:400;min-width:100%;padding:1rem 6rem 1rem 1.5rem;text-align:left;transition:background .2s linear;width:5rem}.selectmenu-item-action:focus,.selectmenu-item-action:hover{background:#e3e3e3}.abs-actions-split-xl .action-default,.page-actions .actions-split .action-default{margin-right:4rem}.abs-actions-split-xl .action-toggle,.page-actions .actions-split .action-toggle{padding-right:4rem}.abs-actions-split-xl .action-toggle:after,.page-actions .actions-split .action-toggle:after{border-width:.9rem .6rem 0;margin-top:-.3rem;right:1.4rem}.actions-split{position:relative;z-index:200}.actions-split._active,.actions-split.active,.actions-split:hover{box-shadow:0 0 0 1px #007bdb}.actions-split._active .action-toggle.action-primary,.actions-split._active .action-toggle.primary,.actions-split.active .action-toggle.action-primary,.actions-split.active .action-toggle.primary{background-color:#ba4000;border-color:#ba4000}.actions-split._active .dropdown-menu,.actions-split.active .dropdown-menu{opacity:1;visibility:visible;display:block}.actions-split .action-default,.actions-split .action-toggle{float:left;margin:0}.actions-split .action-default._active,.actions-split .action-default.active,.actions-split .action-default:hover,.actions-split .action-toggle._active,.actions-split .action-toggle.active,.actions-split .action-toggle:hover{box-shadow:none}.actions-split .action-default{margin-right:3.2rem;min-width:9.3rem}.actions-split .action-toggle{padding-right:3.2rem;border-left-color:rgba(0,0,0,.2);bottom:0;padding-left:0;position:absolute;right:0;top:0}.actions-split .action-toggle._active:after,.actions-split .action-toggle.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .actions-split .action-toggle:after,.active .actions-split .action-toggle:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:hover:after{border-color:#000 transparent transparent}.actions-split .action-toggle.action-primary:after,.actions-split .action-toggle.action-secondary:after,.actions-split .action-toggle.primary:after,.actions-split .action-toggle.secondary:after{border-color:#fff transparent transparent}.actions-split .action-toggle>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-select-wrap{display:inline-block;position:relative}.action-select-wrap .action-select{padding-right:3.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#fff;font-weight:400;text-align:left}.action-select-wrap .action-select._active:after,.action-select-wrap .action-select.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .action-select-wrap .action-select:after,.active .action-select-wrap .action-select:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:hover:after{border-color:#000 transparent transparent}.action-select-wrap .action-select:hover,.action-select-wrap .action-select:hover:before{border-color:#878787}.action-select-wrap .action-select:before{background-color:#e3e3e3;border:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:3.2rem}.action-select-wrap .action-select._active{border-color:#007bdb}.action-select-wrap .action-select._active:before{border-color:#007bdb #007bdb #007bdb #adadad}.action-select-wrap .action-select[disabled]{color:#333}.action-select-wrap .action-select[disabled]:after{border-color:#333 transparent transparent}.action-select-wrap._active{z-index:500}.action-select-wrap._active .action-select,.action-select-wrap._active .action-select:before{border-color:#007bdb}.action-select-wrap._active .action-select:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .abs-action-menu .action-submenu,.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu,.action-select-wrap .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:45rem;overflow-y:auto}.action-select-wrap .action-menu-items{left:0;position:absolute;right:0;top:100%}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu{min-width:100%;position:static}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{position:absolute}.action-multicheck-wrap{display:inline-block;height:1.6rem;padding-top:1px;position:relative;width:3.1rem;z-index:200}.action-multicheck-wrap:hover .action-multicheck-toggle,.action-multicheck-wrap:hover .admin__control-checkbox+label:before{border-color:#878787}.action-multicheck-wrap._active .action-multicheck-toggle,.action-multicheck-wrap._active .admin__control-checkbox+label:before{border-color:#007bdb}.action-multicheck-wrap._active .abs-action-menu .action-submenu,.action-multicheck-wrap._active .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .action-menu,.action-multicheck-wrap._active .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu .action-submenu{opacity:1;visibility:visible;display:block}.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{background-color:#fff}.action-multicheck-wrap._disabled .action-multicheck-toggle,.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{border-color:#adadad;opacity:1}.action-multicheck-wrap .action-multicheck-toggle,.action-multicheck-wrap .admin__control-checkbox,.action-multicheck-wrap .admin__control-checkbox+label{float:left}.action-multicheck-wrap .action-multicheck-toggle{border-radius:0 1px 1px 0;height:1.6rem;margin-left:-1px;padding:0;position:relative;transition:border-color .1s linear;width:1.6rem}.action-multicheck-wrap .action-multicheck-toggle._active:after,.action-multicheck-wrap .action-multicheck-toggle.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .action-multicheck-wrap .action-multicheck-toggle:after,.active .action-multicheck-wrap .action-multicheck-toggle:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:hover:after{border-color:#000 transparent transparent}.action-multicheck-wrap .action-multicheck-toggle:focus{border-color:#007bdb}.action-multicheck-wrap .action-multicheck-toggle:after{right:.3rem}.action-multicheck-wrap .action-multicheck-toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.action-multicheck-wrap .abs-action-menu .action-submenu,.action-multicheck-wrap .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap .action-menu,.action-multicheck-wrap .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:-1.2rem;margin-top:1px;right:auto;text-align:left}.action-multicheck-wrap .action-menu-item{white-space:nowrap}.admin__action-multiselect-wrap{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.admin__action-multiselect-wrap.action-select-wrap:focus{box-shadow:none}.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .action-menu,.admin__action-multiselect-wrap.action-select-wrap .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:none;overflow-y:inherit}.admin__action-multiselect-wrap .action-menu-item{transition:background-color .1s linear}.admin__action-multiselect-wrap .action-menu-item._selected{background-color:#e3e3e3}.admin__action-multiselect-wrap .action-menu-item._hover{background-color:#e0f6fe}.admin__action-multiselect-wrap .admin__action-multiselect{border:1px solid #adadad;cursor:pointer;min-height:3.2rem;padding:.7rem 3.6rem .6rem 1em;white-space:normal}.admin__action-multiselect-wrap .admin__action-multiselect:after{bottom:1.25rem;top:auto}.admin__action-multiselect-wrap .admin__action-multiselect:before{height:3.2rem;top:auto;width:3.2rem}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{text-align:left}.admin__action-multiselect-label{position:relative;z-index:1}.admin__action-multiselect-label:before{margin-right:.5rem}.admin__action-multiselect-search-wrap{margin-bottom:1rem;padding:1rem;position:relative}.admin__action-multiselect-search-wrap+.admin__action-multiselect-menu-inner{border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;margin-bottom:1rem}.admin__action-multiselect-menu-inner{margin-bottom:0;max-height:17.2rem;overflow-y:auto}.admin__action-multiselect-search{padding-right:3rem;width:100%}.admin__action-multiselect-search-label{display:block;font-size:1.5rem;height:1em;overflow:hidden;position:absolute;right:2.2rem;top:1.7rem;width:1em}.admin__action-multiselect-search-label:before{content:'\e60c'}.admin__action-multiselect-actions-wrap{text-align:center}.admin__action-multiselect-actions-wrap .action-default{font-size:1.3rem;min-width:13rem}.admin__action-multiselect-crumb{background-color:#f5f5f5;border:1px solid #a79d95;border-radius:1px;display:inline-block;font-size:1.2rem;margin:-.3rem .9rem .5rem -1.1rem;padding:.3rem 2.4rem .4rem 1rem;position:relative;transition:border-color .1s linear}.admin__action-multiselect-crumb:hover{border-color:#908379}.admin__action-multiselect-crumb .action-close{bottom:0;font-size:.5em;position:absolute;right:0;top:0;width:2rem}.admin__action-multiselect-crumb .action-close:hover{color:#000}.admin__action-multiselect-crumb .action-close:active,.admin__action-multiselect-crumb .action-close:focus{background-color:transparent}.admin__action-multiselect-crumb .action-close:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.abs-action-delete,.abs-action-reset,.action-close,.notifications-close,.search-global-field._active .search-global-action{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0}.abs-action-delete:hover,.abs-action-reset:hover,.action-close:hover,.notifications-close:hover,.search-global-field._active .search-global-action:hover{background-color:transparent;border:none;box-shadow:none}.abs-action-default,.abs-action-pattern,.abs-action-primary,.abs-action-quaternary,.abs-action-secondary,.abs-action-tertiary,.action-default,.action-primary,.action-quaternary,.action-secondary,.action-tertiary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button,.page-actions>button.action-primary,.page-actions>button.primary,button,button.primary,button.secondary,button.tertiary{border:1px solid;border-radius:0;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:1.36;padding:.6rem 1em;text-align:center;vertical-align:baseline}.abs-action-default.disabled,.abs-action-default[disabled],.abs-action-pattern.disabled,.abs-action-pattern[disabled],.abs-action-primary.disabled,.abs-action-primary[disabled],.abs-action-quaternary.disabled,.abs-action-quaternary[disabled],.abs-action-secondary.disabled,.abs-action-secondary[disabled],.abs-action-tertiary.disabled,.abs-action-tertiary[disabled],.action-default.disabled,.action-default[disabled],.action-primary.disabled,.action-primary[disabled],.action-quaternary.disabled,.action-quaternary[disabled],.action-secondary.disabled,.action-secondary[disabled],.action-tertiary.disabled,.action-tertiary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.disabled,.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions .page-actions-buttons>button[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.disabled,.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],.page-actions>button[disabled],button.disabled,button.primary.disabled,button.primary[disabled],button.secondary.disabled,button.secondary[disabled],button.tertiary.disabled,button.tertiary[disabled],button[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-l,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions button,.page-actions>button.action-primary,.page-actions>button.primary{font-size:1.6rem;letter-spacing:.025em;padding-bottom:.6875em;padding-top:.6875em}.abs-action-delete{display:inline-block;font-size:1.6rem;margin-left:1.2rem;padding-top:.7rem;text-decoration:none;vertical-align:middle}.abs-action-delete:after{color:#666;content:'\e630'}.abs-action-delete:hover:after{color:#35302c}.abs-action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.abs-action-default:active,.abs-action-default:focus,.abs-action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.abs-action-primary,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary,button.primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.abs-action-primary:active,.abs-action-primary:focus,.abs-action-primary:hover,.page-actions .page-actions-buttons>button.action-primary:active,.page-actions .page-actions-buttons>button.action-primary:focus,.page-actions .page-actions-buttons>button.action-primary:hover,.page-actions .page-actions-buttons>button.primary:active,.page-actions .page-actions-buttons>button.primary:focus,.page-actions .page-actions-buttons>button.primary:hover,.page-actions>button.action-primary:active,.page-actions>button.action-primary:focus,.page-actions>button.action-primary:hover,.page-actions>button.primary:active,.page-actions>button.primary:focus,.page-actions>button.primary:hover,button.primary:active,button.primary:focus,button.primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-primary.disabled,.abs-action-primary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],button.primary.disabled,button.primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-secondary,button.secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.abs-action-secondary:active,.abs-action-secondary:focus,.abs-action-secondary:hover,button.secondary:active,button.secondary:focus,button.secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-secondary:active,button.secondary:active{background-color:#35302c}.abs-action-tertiary,button.tertiary{background-color:transparent;border-color:transparent;text-shadow:none;color:#008bdb}.abs-action-tertiary:active,.abs-action-tertiary:focus,.abs-action-tertiary:hover,button.tertiary:active,button.tertiary:focus,button.tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#0fa7ff;text-decoration:underline}.abs-action-quaternary,.page-actions .page-actions-buttons>button,.page-actions>button{background-color:transparent;border-color:transparent;text-shadow:none;color:#333}.abs-action-quaternary:active,.abs-action-quaternary:focus,.abs-action-quaternary:hover,.page-actions .page-actions-buttons>button:active,.page-actions .page-actions-buttons>button:focus,.page-actions .page-actions-buttons>button:hover,.page-actions>button:active,.page-actions>button:focus,.page-actions>button:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#1a1a1a}.abs-action-menu,.actions-split .abs-action-menu .action-submenu,.actions-split .abs-action-menu .action-submenu .action-submenu,.actions-split .action-menu,.actions-split .action-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.actions-split .dropdown-menu{text-align:left;background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu._active,.actions-split .abs-action-menu .action-submenu .action-submenu._active,.actions-split .abs-action-menu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .action-menu._active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .actions-split .dropdown-menu .action-submenu._active,.actions-split .dropdown-menu._active{display:block}.abs-action-menu>li,.actions-split .abs-action-menu .action-submenu .action-submenu>li,.actions-split .abs-action-menu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .action-menu>li,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .actions-split .dropdown-menu .action-submenu>li,.actions-split .dropdown-menu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu>li>a:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .abs-action-menu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .action-menu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu>li>a:hover{text-decoration:none}.abs-action-menu>li._visible,.abs-action-menu>li:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu .action-submenu>li:hover,.actions-split .abs-action-menu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .action-menu>li._visible,.actions-split .action-menu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu>li:hover,.actions-split .dropdown-menu>li._visible,.actions-split .dropdown-menu>li:hover{background-color:#e3e3e3}.abs-action-menu>li:active,.actions-split .abs-action-menu .action-submenu .action-submenu>li:active,.actions-split .abs-action-menu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .action-menu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu>li:active,.actions-split .dropdown-menu>li:active{background-color:#cacaca}.abs-action-menu>li._parent,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent,.actions-split .abs-action-menu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .action-menu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent,.actions-split .dropdown-menu>li._parent{display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.abs-action-menu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-menu-item,.abs-action-menu .item,.actions-split .abs-action-menu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .item,.actions-split .abs-action-menu .action-submenu .item,.actions-split .action-menu .action-menu-item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .item,.actions-split .action-menu .item,.actions-split .actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .actions-split .dropdown-menu .action-submenu .item,.actions-split .dropdown-menu .action-menu-item,.actions-split .dropdown-menu .item{display:block;padding:.6875em 1em;cursor:pointer}.abs-action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu a.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .abs-action-menu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .action-menu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu a.action-menu-item{color:#333}.abs-action-menu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.abs-action-wrap-triangle{position:relative}.abs-action-wrap-triangle .action-default{width:100%}.abs-action-wrap-triangle .action-default:after,.abs-action-wrap-triangle .action-default:before{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.abs-action-wrap-triangle .action-default:active,.abs-action-wrap-triangle .action-default:focus,.abs-action-wrap-triangle .action-default:hover{box-shadow:none}._keyfocus .abs-action-wrap-triangle .action-default:focus{box-shadow:0 0 0 1px #007bdb}.ie10 .abs-action-wrap-triangle .action-default.disabled,.ie10 .abs-action-wrap-triangle .action-default[disabled],.ie9 .abs-action-wrap-triangle .action-default.disabled,.ie9 .abs-action-wrap-triangle .action-default[disabled]{background-color:#fcfcfc;opacity:1;text-shadow:none}.abs-action-wrap-triangle-right{display:inline-block;padding-right:1.6rem;position:relative}.abs-action-wrap-triangle-right .action-default:after,.abs-action-wrap-triangle-right .action-default:before{border-color:transparent transparent transparent #e3e3e3;border-width:1.7rem 0 1.6rem 1.7rem;left:100%;margin-left:-1.7rem}.abs-action-wrap-triangle-right .action-default:before{border-left-color:#949494;right:-1px}.abs-action-wrap-triangle-right .action-default:active:after,.abs-action-wrap-triangle-right .action-default:focus:after,.abs-action-wrap-triangle-right .action-default:hover:after{border-left-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-right .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-right .action-default[disabled]:after{border-color:transparent transparent transparent #fcfcfc}.abs-action-wrap-triangle-right .action-primary:after{border-color:transparent transparent transparent #eb5202}.abs-action-wrap-triangle-right .action-primary:active:after,.abs-action-wrap-triangle-right .action-primary:focus:after,.abs-action-wrap-triangle-right .action-primary:hover:after{border-left-color:#ba4000}.abs-action-wrap-triangle-left{display:inline-block;padding-left:1.6rem}.abs-action-wrap-triangle-left .action-default{text-indent:-.85rem}.abs-action-wrap-triangle-left .action-default:after,.abs-action-wrap-triangle-left .action-default:before{border-color:transparent #e3e3e3 transparent transparent;border-width:1.7rem 1.7rem 1.6rem 0;margin-right:-1.7rem;right:100%}.abs-action-wrap-triangle-left .action-default:before{border-right-color:#949494;left:-1px}.abs-action-wrap-triangle-left .action-default:active:after,.abs-action-wrap-triangle-left .action-default:focus:after,.abs-action-wrap-triangle-left .action-default:hover:after{border-right-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-left .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-left .action-default[disabled]:after{border-color:transparent #fcfcfc transparent transparent}.abs-action-wrap-triangle-left .action-primary:after{border-color:transparent #eb5202 transparent transparent}.abs-action-wrap-triangle-left .action-primary:active:after,.abs-action-wrap-triangle-left .action-primary:focus:after,.abs-action-wrap-triangle-left .action-primary:hover:after{border-right-color:#ba4000}.action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.action-default:active,.action-default:focus,.action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.action-primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.action-primary:active,.action-primary:focus,.action-primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-primary.disabled,.action-primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.action-secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.action-secondary:active,.action-secondary:focus,.action-secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-secondary:active{background-color:#35302c}.action-quaternary,.action-tertiary{background-color:transparent;border-color:transparent;text-shadow:none}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover,.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none}.action-tertiary{color:#008bdb}.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{color:#0fa7ff;text-decoration:underline}.action-quaternary{color:#333}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover{color:#1a1a1a}.action-close>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-close:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.action-close:before{content:'\e62f';transition:color .1s linear}.action-close:hover{cursor:pointer;text-decoration:none}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu .action-submenu .action-submenu._active,.abs-action-menu .action-submenu._active,.action-menu .action-submenu._active,.action-menu._active,.actions-split .action-menu .action-submenu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .dropdown-menu .action-submenu._active{display:block}.abs-action-menu .action-submenu .action-submenu>li,.abs-action-menu .action-submenu>li,.action-menu .action-submenu>li,.action-menu>li,.actions-split .action-menu .action-submenu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .dropdown-menu .action-submenu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu .action-submenu .action-submenu>li>a:hover,.abs-action-menu .action-submenu>li>a:hover,.action-menu .action-submenu>li>a:hover,.action-menu>li>a:hover,.actions-split .action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu>li>a:hover{text-decoration:none}.abs-action-menu .action-submenu .action-submenu>li._visible,.abs-action-menu .action-submenu .action-submenu>li:hover,.abs-action-menu .action-submenu>li._visible,.abs-action-menu .action-submenu>li:hover,.action-menu .action-submenu>li._visible,.action-menu .action-submenu>li:hover,.action-menu>li._visible,.action-menu>li:hover,.actions-split .action-menu .action-submenu .action-submenu>li._visible,.actions-split .action-menu .action-submenu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu>li:hover{background-color:#e3e3e3}.abs-action-menu .action-submenu .action-submenu>li:active,.abs-action-menu .action-submenu>li:active,.action-menu .action-submenu>li:active,.action-menu>li:active,.actions-split .action-menu .action-submenu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu>li:active{background-color:#cacaca}.abs-action-menu .action-submenu .action-submenu>li._parent,.abs-action-menu .action-submenu>li._parent,.action-menu .action-submenu>li._parent,.action-menu>li._parent,.actions-split .action-menu .action-submenu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu>li._parent{display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.abs-action-menu .action-submenu>li._parent>.action-menu-item,.action-menu .action-submenu>li._parent>.action-menu-item,.action-menu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .item,.abs-action-menu .action-submenu .item,.action-menu .action-menu-item,.action-menu .action-submenu .action-menu-item,.action-menu .action-submenu .item,.action-menu .item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .item,.actions-split .action-menu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .item{display:block;padding:.6875em 1em;cursor:pointer}.abs-action-menu .action-submenu .action-submenu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu .action-submenu,.ie9 .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .action-menu .action-submenu,.ie9 .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu .action-submenu .action-submenu a.action-menu-item,.abs-action-menu .action-submenu a.action-menu-item,.action-menu .action-submenu a.action-menu-item,.action-menu a.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu a.action-menu-item{color:#333}.abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.abs-action-menu .action-submenu a.action-menu-item:focus,.action-menu .action-submenu a.action-menu-item:focus,.action-menu a.action-menu-item:focus,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.messages .message:last-child{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:1.4rem;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.modal-popup .action-close,.modal-slide .action-close{color:#736963;position:absolute;right:0;top:0}.modal-popup .action-close:active,.modal-slide .action-close:active{-webkit-transform:none;-ms-transform:none;transform:none}.modal-popup .action-close:active:before,.modal-slide .action-close:active:before{font-size:1.8rem}.modal-popup .action-close:hover:before,.modal-slide .action-close:hover:before{color:#58504b}.modal-popup .action-close:before,.modal-slide .action-close:before{font-size:2rem}.modal-popup .modal-title{font-size:2.4rem;margin-right:6.4rem}.modal-popup .action-close{padding:3rem}.modal-popup .action-close:active,.modal-popup .action-close:focus{background:0 0;padding-right:3.1rem;padding-top:3.1rem}.modal-slide .modal-title{font-size:2.1rem;margin-right:5.7rem}.modal-slide .action-close{padding:2.1rem 2.6rem}.modal-slide .action-close:active{padding-right:2.7rem;padding-top:2.2rem}.modal-slide .page-main-actions{margin-bottom:.6rem;margin-top:2.1rem}.modal-title{font-weight:400;margin-bottom:0;min-height:1em}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}.spinner>span:nth-child(1){-webkit-animation-delay:.27s;animation-delay:.27s;-webkit-transform:rotate(-315deg);-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){-webkit-animation-delay:.36s;animation-delay:.36s;-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){-webkit-animation-delay:.45s;animation-delay:.45s;-webkit-transform:rotate(-225deg);-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){-webkit-animation-delay:.54s;animation-delay:.54s;-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){-webkit-animation-delay:.63s;animation-delay:.63s;-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){-webkit-animation-delay:.72s;animation-delay:.72s;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){-webkit-animation-delay:.81s;animation-delay:.81s;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){-webkit-animation-delay:.9;animation-delay:.9;-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}@-webkit-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span{-webkit-transform:scale(0.4);-ms-transform:scale(0.4);transform:scale(0.4);-webkit-animation-name:fade;animation-name:fade;-webkit-animation-duration:.72s;animation-duration:.72s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-direction:linear;animation-direction:linear;background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.popup-loading{background:rgba(255,255,255,.8);border-color:#ef672f;color:#ef672f;font-size:14px;font-weight:700;left:50%;margin-left:-100px;padding:100px 0 10px;position:fixed;text-align:center;top:40%;width:200px;z-index:1003}.popup-loading:after{background-image:url(../images/loader-1.gif);content:'';height:64px;left:50%;margin:-32px 0 0 -32px;position:absolute;top:40%;width:64px;z-index:2}.loading-mask,.loading-old{background:rgba(255,255,255,.4);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2003}.loading-mask img,.loading-old img{display:none}.loading-mask p,.loading-old p{margin-top:118px}.loading-mask .loader,.loading-old .loader{background:url(../images/loader-1.gif) 50% 30% no-repeat #e5e2dd;border-radius:5px;bottom:0;color:#5e5b56;font-size:14px;font-weight:700;height:160px;left:0;margin:auto;opacity:.95;position:absolute;right:0;text-align:center;top:0;width:160px}.admin-user{float:right;line-height:1.36;margin-left:.3rem;z-index:390}.admin-user._active .admin__action-dropdown,.admin-user.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin-user .admin__action-dropdown{height:3.3rem;padding:.7rem 2.8rem .4rem 4rem}.admin-user .admin__action-dropdown._active:after,.admin-user .admin__action-dropdown.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:after{border-color:#777 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.3rem;top:50%;transition:all .2s linear;width:0}._active .admin-user .admin__action-dropdown:after,.active .admin-user .admin__action-dropdown:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin-user .admin__action-dropdown:before{color:#777;content:'\e600';font-size:2rem;left:1.1rem;margin-top:-1.1rem;position:absolute;top:50%}.admin-user .admin__action-dropdown:hover:before{color:#333}.admin-user .admin__action-dropdown-menu{min-width:20rem;padding-left:1rem;padding-right:1rem}.admin-user .admin__action-dropdown-menu>li>a{padding-right:1.8rem;padding-left:.5em;white-space:nowrap;transition:background-color .1s linear}.admin-user .admin__action-dropdown-menu>li>a:hover{background-color:#e0f6fe;color:#333}.admin-user .admin__action-dropdown-menu>li>a:active{background-color:#c7effd;bottom:-1px;position:relative}.admin-user .admin__action-dropdown-menu .admin-user-name{text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:20rem;overflow:hidden;vertical-align:top}.admin-user-account-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:11.2rem}.search-global{float:right;margin-right:-.3rem;position:relative;z-index:380}.search-global-field{min-width:5rem}.search-global-field._active .search-global-input{background-color:#fff;border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);padding-right:4rem;width:25rem}.search-global-field._active .search-global-action{display:block;height:3.3rem;position:absolute;right:0;text-indent:-100%;top:0;width:5rem;z-index:3}.search-global-field .autocomplete-results{height:3.3rem;position:absolute;right:0;top:0;width:25rem}.search-global-field .search-global-menu{border:1px solid #007bdb;border-top-color:transparent;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin-top:-2px;padding:0;position:absolute;right:0;top:100%;z-index:2}.search-global-field .search-global-menu:after{background-color:#fff;content:'';height:5px;left:0;position:absolute;right:0;top:-5px}.search-global-field .search-global-menu>li{background-color:#fff;border-top:1px solid #ddd;display:block;font-size:1.2rem;padding:.75rem 1.4rem .55rem}.search-global-field .search-global-menu>li._active{background-color:#e0f6fe}.search-global-field .search-global-menu .title{display:block;font-size:1.4rem}.search-global-field .search-global-menu .type{color:#1a1a1a;display:block}.search-global-label{cursor:pointer;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;z-index:2}.search-global-label:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.search-global-label:hover:before{color:#000}.search-global-label:before{color:#777;content:'\e60c';font-size:2rem}.search-global-input{background-color:transparent;border:1px solid transparent;font-size:1.4rem;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;transition:all .1s linear,width .3s linear;width:5rem;z-index:1}.search-global-action{display:none}.notifications-wrapper{float:right;line-height:1;position:relative}.notifications-wrapper.active{z-index:400}.notifications-wrapper.active .notifications-action{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.notifications-wrapper.active .notifications-action:after{border:none;background-color:#fff;content:'';display:block;height:6px;left:-6px;margin-top:0;position:absolute;right:0;top:100%;width:auto}.notifications-wrapper .admin__action-dropdown-menu{padding:1rem 0 0;width:32rem}.notifications-action{color:#777;height:3.3rem;padding:.75rem 2rem .65rem}.notifications-action:after{display:none}.notifications-action:before{content:'\e607';font-size:1.9rem;margin-right:0}.notifications-action:active:before{position:relative;top:1px}.notifications-action .notifications-counter{background-color:#e22626;border-radius:1em;color:#fff;display:inline-block;font-size:1.1rem;font-weight:700;left:50%;margin-left:.3em;margin-top:-1.1em;padding:.3em .5em;position:absolute;top:50%}.notifications-entry{line-height:1.36;padding:.6rem 2rem .8rem;position:relative;transition:background-color .1s linear}.notifications-entry:hover{background-color:#e0f6fe}.notifications-entry.notifications-entry-last{margin:0 2rem;padding:.3rem 0 1.3rem;text-align:center}.notifications-entry.notifications-entry-last:hover{background-color:transparent}.notifications-entry+.notifications-entry-last{border-top:1px solid #ddd;padding-bottom:.6rem}.notifications-entry ._cutted{cursor:pointer}.notifications-entry ._cutted .notifications-entry-description-start:after{content:'...'}.notifications-entry-title{color:#ef672f;display:block;font-size:1.1rem;font-weight:700;margin-bottom:.7rem;margin-right:1em}.notifications-entry-description{color:#333;font-size:1.1rem;margin-bottom:.8rem}.notifications-entry-description-end{display:none}.notifications-entry-description-end._show{display:inline}.notifications-entry-time{color:#777;font-size:1.1rem}.notifications-close{line-height:1;padding:1rem;position:absolute;right:0;top:.6rem}.notifications-close:before{color:#ccc;content:'\e620';transition:color .1s linear}.notifications-close:hover:before{color:#b3b3b3}.notifications-close:active{-webkit-transform:scale(0.95);-ms-transform:scale(0.95);transform:scale(0.95)}.page-header-actions{padding-top:1.1rem}.page-header-hgroup{padding-right:1.5rem}.page-title{color:#333;font-size:2.8rem;margin-bottom:0}.page-header{padding:1.5rem 3rem}.menu-wrapper{display:inline-block;position:relative;width:8.8rem;z-index:700}.menu-wrapper:before{background-color:#373330;bottom:0;content:'';left:0;position:fixed;top:0;width:8.8rem;z-index:699}.menu-wrapper._fixed{left:0;position:fixed;top:0}.menu-wrapper._fixed~.page-wrapper{margin-left:8.8rem}.menu-wrapper .logo{display:block;height:8.8rem;padding:2.4rem 0 2.2rem;position:relative;text-align:center;z-index:700}._keyfocus .menu-wrapper .logo:focus{background-color:#4a4542;box-shadow:none}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a{background-color:#373330}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a:after{display:none}.menu-wrapper .logo:hover .logo-img{-webkit-filter:brightness(1.1);filter:brightness(1.1)}.menu-wrapper .logo:active .logo-img{-webkit-transform:scale(0.95);-ms-transform:scale(0.95);transform:scale(0.95)}.menu-wrapper .logo .logo-img{height:4.2rem;transition:-webkit-filter .2s linear,filter .2s linear,transform .1s linear;width:3.5rem}.abs-menu-separator,.admin__menu .item-partners>a:after,.admin__menu .level-0:first-child>a:after{background-color:#736963;content:'';display:block;height:1px;left:0;margin-left:16%;position:absolute;top:0;width:68%}.admin__menu li{display:block}.admin__menu .level-0:first-child>a{position:relative}.admin__menu .level-0:first-child._active>a:after{display:none}.admin__menu .level-0._active>a,.admin__menu .level-0:hover>a{color:#f7f3eb}.admin__menu .level-0._active>a{background-color:#524d49}.admin__menu .level-0:hover>a{background-color:#4a4542}.admin__menu .level-0>a{color:#aaa6a0;display:block;font-size:1rem;letter-spacing:.025em;min-height:6.2rem;padding:1.2rem .5rem .5rem;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;transition:background-color .1s linear;word-wrap:break-word;z-index:700}.admin__menu .level-0>a:focus{box-shadow:none}.admin__menu .level-0>a:before{content:'\e63a';display:block;font-size:2.2rem;height:2.2rem}.admin__menu .level-0>.submenu{background-color:#4a4542;box-shadow:0 0 3px #000;left:100%;min-height:calc(8.8rem + 2rem + 100%);padding:2rem 0 0;position:absolute;top:0;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-duration:.3s;transition-timing-function:ease-in-out;visibility:hidden;z-index:697}.admin__menu .level-0._show>.submenu{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);visibility:visible;z-index:698}.admin__menu .level-1{margin-left:1.5rem;margin-right:1.5rem}.admin__menu [class*=level-]:not(.level-0) a{display:block;padding:1.25rem 1.5rem}.admin__menu [class*=level-]:not(.level-0) a:hover{background-color:#403934}.admin__menu [class*=level-]:not(.level-0) a:active{padding-top:1.35rem;padding-bottom:1.15rem;background-color:#322c29}.admin__menu .submenu li{min-width:23.8rem}.admin__menu .submenu a{color:#fcfcfc;transition:background-color .1s linear}.admin__menu .submenu a:focus,.admin__menu .submenu a:hover{box-shadow:none;text-decoration:none}._keyfocus .admin__menu .submenu a:focus{background-color:#403934}._keyfocus .admin__menu .submenu a:active{background-color:#322c29}.admin__menu .submenu .parent{margin-bottom:4.5rem}.admin__menu .submenu .parent .submenu-group-title,.admin__menu .submenu .parent>a{color:#a79d95;display:block;font-size:1.6rem;font-weight:600;margin-bottom:.7rem;padding:1.25rem 1.5rem;pointer-events:none}.admin__menu .submenu .column{display:table-cell}.admin__menu .submenu-title{color:#fff;display:block;font-size:2.2rem;font-weight:600;margin-bottom:4.2rem;margin-left:3rem;margin-right:5.8rem}.admin__menu .submenu-sub-title{color:#fff;display:block;font-size:1.2rem;margin:-3.8rem 5.8rem 3.8rem 3rem}.admin__menu .action-close{padding:2.4rem 2.8rem;position:absolute;right:0;top:0}.admin__menu .action-close:before{color:#a79d95;font-size:1.7rem}.admin__menu .action-close:hover:before{color:#fff}.admin__menu .item-dashboard>a:before{content:'\e604';font-size:1.8rem;padding-top:.4rem}.admin__menu .item-sales>a:before{content:'\e60b'}.admin__menu .item-catalog>a:before{content:'\e608'}.admin__menu .item-customer>a:before{content:'\e603';font-size:2.6rem;position:relative;top:-.4rem}.admin__menu .item-marketing>a:before{content:'\e609';font-size:2rem;padding-top:.2rem}.admin__menu .item-content>a:before{content:'\e602';font-size:2.4rem;position:relative;top:-.2rem}.admin__menu .item-report>a:before{content:'\e60a'}.admin__menu .item-stores>a:before{content:'\e60d';font-size:1.9rem;padding-top:.3rem}.admin__menu .item-system>a:before{content:'\e60e'}.admin__menu .item-partners>a{padding-bottom:1rem}.admin__menu .item-partners>a:before{content:'\e612'}.admin__menu-overlay{bottom:0;left:0;position:fixed;right:0;top:0;z-index:697}.store-switcher{color:#333;float:left;font-size:1.3rem;margin-top:.7rem}.store-switcher .admin__action-dropdown{margin-left:.5em;background-color:#f8f8f8}.store-switcher .dropdown{display:inline-block;position:relative}.store-switcher .dropdown:after,.store-switcher .dropdown:before{content:'';display:table}.store-switcher .dropdown:after{clear:both}.store-switcher .dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e607';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle:active:after,.store-switcher .dropdown .action.toggle:hover:after{color:#333}.store-switcher .dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle.active:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e618';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle.active:active:after,.store-switcher .dropdown .action.toggle.active:hover:after{color:#333}.store-switcher .dropdown .dropdown-menu{background:#fff;border:1px solid #ada89e;z-index:100;margin:4px 0 0;padding:0;list-style:none;box-sizing:border-box;position:absolute;top:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);min-width:19.5rem;display:none}.store-switcher .dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .dropdown.active{overflow:visible}.store-switcher .dropdown.active .dropdown-menu{display:block}.store-switcher .dropdown-menu{left:0;margin-top:.5em;padding-top:.25em}.store-switcher .dropdown-menu li{border:0;cursor:default}.store-switcher .dropdown-menu li:hover{cursor:default}.store-switcher .dropdown-menu li a,.store-switcher .dropdown-menu li span{color:#333;display:block;padding:.5rem 1.3rem}.store-switcher .dropdown-menu li a{text-decoration:none}.store-switcher .dropdown-menu li a:hover{background:#e9e9e9}.store-switcher .dropdown-menu li span{color:#adadad;cursor:default}.store-switcher .dropdown-menu li.current span{background:#eee;color:#333}.store-switcher .dropdown-menu .store-switcher-store a,.store-switcher .dropdown-menu .store-switcher-store span{padding-left:2.6rem}.store-switcher .dropdown-menu .store-switcher-store-view a,.store-switcher .dropdown-menu .store-switcher-store-view span{padding-left:3.9rem}.store-switcher .dropdown-menu .dropdown-toolbar{border-top:1px solid #ebebeb;margin-top:1rem}.store-switcher .dropdown-menu .dropdown-toolbar a:before{content:'\e60e';margin-right:.25em;position:relative;top:1px}.store-switcher-label{font-weight:700}.store-switcher-alt{display:inline-block;position:relative}.store-switcher-alt.active .dropdown-menu{display:block}.store-switcher-alt .dropdown-menu{margin-top:2px;white-space:nowrap}.store-switcher-alt .dropdown-menu ul{list-style:none;margin:0;padding:0}.store-switcher-alt strong{color:#a6a098;display:block;font-size:14px;font-weight:500;line-height:1.333;padding:5px 10px}.store-switcher-alt .store-selected{color:#676056;cursor:pointer;font-size:12px;font-weight:400;line-height:1.333}.store-switcher-alt .store-selected:after{color:#b3b0ad;content:'\e02c';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;margin:0 0 0 3px;speak:none;vertical-align:text-top}.store-switcher-alt .store-switcher-store,.store-switcher-alt .store-switcher-website{padding:0}.store-switcher-alt .store-switcher-store:hover,.store-switcher-alt .store-switcher-website:hover{background:0 0}.store-switcher-alt .manage-stores,.store-switcher-alt .store-switcher-all,.store-switcher-alt .store-switcher-store-view{padding:0}.store-switcher-alt .manage-stores>a,.store-switcher-alt .store-switcher-all>a{color:#676056;display:block;font-size:12px;padding:8px 15px;text-decoration:none}.store-switcher-website{margin:5px 0 0}.store-switcher-website>strong{padding-left:13px}.store-switcher-store{margin:1px 0 0}.store-switcher-store>strong{padding-left:20px}.store-switcher-store>ul{margin-top:1px}.store-switcher-store-view:first-child{border-top:1px solid #e5e5e5}.store-switcher-store-view>a{color:#333;display:block;font-size:13px;padding:5px 15px 5px 24px;text-decoration:none}.tooltip{margin-left:.5em}.tooltip .help a,.tooltip .help span{cursor:pointer;display:inline-block;height:22px;position:relative;vertical-align:middle;width:22px;z-index:2}.tooltip .help a:before,.tooltip .help span:before{color:#333;content:'\e633';font-size:1.7rem}.tooltip .help a span,.tooltip .help span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.tooltip .help a:hover{text-decoration:none}.tooltip .tooltip-content{background:#000;border-radius:3px;color:#fff;display:none;margin-left:-19px;margin-top:10px;max-width:200px;padding:4px 8px;position:absolute;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{border-bottom:5px solid #000;border-left:5px solid transparent;border-right:5px solid transparent;content:'';height:0;left:20px;opacity:.8;position:absolute;top:-5px;width:0}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}.page-actions._fixed,.page-main-actions:not(._hidden){background:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;padding:1.5rem}.page-main-actions{margin:0 0 3rem}.page-main-actions._hidden .store-switcher{display:none}.page-actions{float:right}.page-main-actions .page-actions._fixed{left:8.8rem;position:fixed;right:0;top:0;z-index:400}.page-main-actions .page-actions._fixed .page-actions-inner:before{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;content:attr(data-title);float:left;font-size:2.8rem;margin-top:.3rem;max-width:50%}.page-actions .page-actions-buttons>button,.page-actions>button{float:right;margin-left:1.3rem}.page-actions .page-actions-buttons>button.action-back,.page-actions .page-actions-buttons>button.back,.page-actions>button.action-back,.page-actions>button.back{float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1}.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before{content:'\e626';margin-right:.5em;position:relative;top:1px}.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary{-ms-flex-order:2;-webkit-order:2;order:2}.page-actions .page-actions-buttons>button.save:not(.primary),.page-actions>button.save:not(.primary){-ms-flex-order:1;-webkit-order:1;order:1}.page-actions .page-actions-buttons>button.delete,.page-actions>button.delete{-ms-flex-order:-1;-webkit-order:-1;order:-1}.page-actions .actions-split{float:right;margin-left:1.3rem;-ms-flex-order:2;-webkit-order:2;order:2}.page-actions .actions-split .dropdown-menu .item{display:block}.page-actions-buttons{float:right;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;display:-webkit-flex;display:-ms-flexbox;display:flex}.customer-index-edit .page-actions-buttons{background-color:transparent}.admin__page-nav{background:#f1f1f1;border:1px solid #e3e3e3}.admin__page-nav._collapsed:first-child{border-bottom:none}.admin__page-nav._collapsed._show{border-bottom:1px solid #e3e3e3}.admin__page-nav._collapsed._show ._collapsible{background:#f1f1f1}.admin__page-nav._collapsed._show ._collapsible:after{content:'\e62b'}.admin__page-nav._collapsed._show ._collapsible+.admin__page-nav-items{display:block}.admin__page-nav._collapsed._hide .admin__page-nav-title-messages,.admin__page-nav._collapsed._hide .admin__page-nav-title-messages ._active{display:inline-block}.admin__page-nav+._collapsed{border-bottom:none;border-top:none}.admin__page-nav-title{border-bottom:1px solid #e3e3e3;color:#303030;display:block;font-size:1.4rem;line-height:1.2;margin:0 0 -1px;padding:1.8rem 1.5rem;position:relative;text-transform:uppercase}.admin__page-nav-title._collapsible{background:#fff;cursor:pointer;margin:0;padding-right:3.5rem;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-title._collapsible+.admin__page-nav-items{display:none;margin-top:-1px}.admin__page-nav-title._collapsible:after{content:'\e628';font-size:1.3rem;font-weight:700;position:absolute;right:1.8rem;top:2rem}.admin__page-nav-title._collapsible:hover{background:#f1f1f1}.admin__page-nav-title._collapsible:last-child{margin:0 0 -1px}.admin__page-nav-title strong{font-weight:700}.admin__page-nav-title .admin__page-nav-title-messages{display:none}.admin__page-nav-items{list-style-type:none;margin:0;padding:1rem 0 1.3rem}.admin__page-nav-item{border-left:3px solid transparent;margin-left:.7rem;padding:0;position:relative;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-item:hover{border-color:#e4e4e4}.admin__page-nav-item:hover .admin__page-nav-link{background:#e4e4e4;color:#303030;text-decoration:none}.admin__page-nav-item._active,.admin__page-nav-item.ui-state-active{border-color:#eb5202}.admin__page-nav-item._active .admin__page-nav-link,.admin__page-nav-item.ui-state-active .admin__page-nav-link{background:#fff;border-color:#e3e3e3;border-right:1px solid #fff;color:#303030;margin-right:-1px;font-weight:600}.admin__page-nav-item._loading:before,.admin__page-nav-item.ui-tabs-loading:before{display:none}.admin__page-nav-item._loading .admin__page-nav-item-message-loader,.admin__page-nav-item.ui-tabs-loading .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-link{border:1px solid transparent;border-width:1px 0;color:#303030;display:block;font-weight:500;line-height:1.2;margin:0 0 -1px;padding:2rem 4rem 2rem 1rem;transition:border-color .1s ease-out,background-color .1s ease-out;word-wrap:break-word}.admin__page-nav-item-messages,.admin__page-nav-link._changed .admin__page-nav-item-message._changed,.admin__page-nav-link._error .admin__page-nav-item-message._error{display:inline-block}.admin__page-nav-item-messages .admin__page-nav-item-message{position:relative}.admin__page-nav-item-messages .admin__page-nav-item-message:hover{z-index:500}.admin__page-nav-item-messages .admin__page-nav-item-message:hover .admin__page-nav-item-message-tooltip{display:block}.admin__page-nav-item-messages .admin__page-nav-item-message._changed,.admin__page-nav-item-messages .admin__page-nav-item-message._error{display:none}.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon{display:inline-block;font-size:1.4rem;padding-left:.8em;vertical-align:top}.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon:after,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon:after{color:#666;content:'\e631'}.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon:after{color:#eb5202;content:'\e623'}.admin__page-nav-item-messages .admin__page-nav-item-message-loader{display:none;margin-top:-1rem;position:absolute;right:0;top:50%}.admin__page-nav-item-messages .admin__page-nav-item-message-loader .spinner{font-size:2rem;margin-right:1.5rem}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;left:-1rem;line-height:1.36;padding:2rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after,.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf}.admin__data-grid-wrap-static .data-grid{box-sizing:border-box}.admin__data-grid-wrap-static .data-grid thead{color:#333}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td{background-color:#f5f5f5}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td._dragging{background-color:rgba(245,245,245,.95)}.admin__data-grid-wrap-static .data-grid ul{padding-left:1rem;margin-left:1rem}.admin__data-grid-wrap-static .admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:401}.admin__data-grid-wrap-static .admin__data-grid-loading-mask .grid-loader{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-filters-actions-wrap{float:right}.data-grid-search-control-wrap{float:left;max-width:45.5rem;position:relative;width:50%}.data-grid-search-control-wrap :-ms-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-webkit-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-moz-placeholder{font-style:italic}.data-grid-search-control-wrap .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:.6rem 2rem .2rem;position:absolute;right:0;top:1px}.data-grid-search-control-wrap .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.data-grid-search-control-wrap .action-submit:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.data-grid-search-control-wrap .action-submit:hover:before{color:#1a1a1a}._keyfocus .data-grid-search-control-wrap .action-submit:focus{box-shadow:0 0 0 1px #008bdb}.data-grid-search-control-wrap .action-submit:before{content:'\e60c';font-size:2rem;transition:color .1s linear}.data-grid-search-control-wrap .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.data-grid-search-control-wrap .abs-action-menu .action-submenu,.data-grid-search-control-wrap .abs-action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .action-menu,.data-grid-search-control-wrap .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{z-index:400;max-height:19.25rem;overflow-y:auto}.data-grid-search-control-wrap .action-menu-item._selected{background-color:#e0f6fe}.data-grid-search-control-wrap .data-grid-search-label{display:none}.data-grid-search-control{padding-right:6rem;width:100%}.data-grid-filters-action-wrap{float:left;padding-left:2rem}.data-grid-filters-action-wrap .action-default{font-size:1.3rem;margin-bottom:1rem;padding-left:1.7rem;padding-right:2.1rem;padding-top:.7rem}.data-grid-filters-action-wrap .action-default._active{background-color:#fff;border-bottom-color:#fff;border-right-color:#ccc;font-weight:600;margin:-.1rem 0 0;padding-bottom:1.6rem;padding-top:.8rem;position:relative;z-index:281}.data-grid-filters-action-wrap .action-default._active:after{background-color:#eb5202;bottom:100%;content:'';height:3px;left:-1px;position:absolute;right:-1px}.data-grid-filters-action-wrap .action-default:before{color:#333;content:'\e605';font-size:1.8rem;margin-right:.4rem;position:relative;top:-1px;vertical-align:top}.data-grid-filters-action-wrap .filters-active{display:none}.admin__data-grid-filters-wrap{opacity:0;visibility:hidden;clear:both;font-size:1.3rem;transition:opacity .3s ease}.admin__data-grid-filters-wrap._show{opacity:1;visibility:visible;border-bottom:1px solid #ccc;border-top:1px solid #ccc;margin-bottom:.7rem;padding:3.6rem 0 3rem;position:relative;top:-1px;z-index:280}.admin__data-grid-filters-wrap._show .admin__data-grid-filters,.admin__data-grid-filters-wrap._show .admin__data-grid-filters-footer{display:block}.admin__data-grid-filters-wrap .admin__form-field-label,.admin__data-grid-filters-wrap .admin__form-field-legend{display:block;font-weight:700;margin:0 0 .3rem;text-align:left}.admin__data-grid-filters-wrap .admin__form-field{display:inline-block;margin-bottom:2em;margin-left:0;padding-left:2rem;padding-right:2rem;vertical-align:top;width:calc(100% / 4 - 4px)}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field{display:block;float:none;margin-bottom:1.5rem;padding-left:0;padding-right:0;width:auto}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field:last-child{margin-bottom:0}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-label{border:1px solid transparent;float:left;font-weight:400;line-height:1.36;margin-bottom:0;padding-bottom:.6rem;padding-right:1em;padding-top:.6rem;width:25%}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-control{margin-left:25%}.admin__data-grid-filters-wrap .admin__action-multiselect,.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text,.admin__data-grid-filters-wrap .admin__form-field-label{font-size:1.3rem}.admin__data-grid-filters-wrap .admin__control-select{padding-top:.5rem;height:3.2rem}.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text.hasDatepicker{width:100%}.admin__data-grid-filters{display:none;margin-left:-2rem;margin-right:-2rem}.admin__filters-legend{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-filters-footer{display:none;font-size:1.4rem}.admin__data-grid-filters-footer .admin__footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-filters-footer .admin__footer-secondary-actions{float:left;width:50%}.admin__data-grid-filters-current{border-bottom:.1rem solid #ccc;border-top:.1rem solid #ccc;display:none;font-size:1.3rem;margin-bottom:.9rem;padding-bottom:.8rem;padding-top:1.1rem;width:100%}.admin__data-grid-filters-current._show{display:table;position:relative;top:-1px;z-index:3}.admin__data-grid-filters-current._show+.admin__data-grid-filters-wrap._show{margin-top:-1rem}.admin__current-filters-actions-wrap,.admin__current-filters-list-wrap,.admin__current-filters-title-wrap{display:table-cell;vertical-align:top}.admin__current-filters-title{margin-right:1em;white-space:nowrap}.admin__current-filters-list-wrap{width:100%}.admin__current-filters-list{margin-bottom:0}.admin__current-filters-list>li{display:inline-block;font-weight:600;margin:0 1rem .5rem;padding-right:2.6rem;position:relative}.admin__current-filters-list .action-remove{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0;line-height:1;position:absolute;right:0;top:1px}.admin__current-filters-list .action-remove:hover{background-color:transparent;border:none;box-shadow:none}.admin__current-filters-list .action-remove:hover:before{color:#949494}.admin__current-filters-list .action-remove:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.admin__current-filters-list .action-remove:before{color:#adadad;content:'\e620';font-size:1.6rem;transition:color .1s linear}.admin__current-filters-list .action-remove>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__current-filters-actions-wrap .action-clear{border:none;padding-bottom:0;padding-top:0;white-space:nowrap}.admin__data-grid-pager-wrap{text-align:right}.admin__data-grid-pager{display:inline-block;margin-left:3rem}.admin__data-grid-pager .admin__control-text::-webkit-inner-spin-button,.admin__data-grid-pager .admin__control-text::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.admin__data-grid-pager .admin__control-text{-moz-appearance:textfield;text-align:center;width:4.4rem}.action-next,.action-previous{width:4.4rem}.action-next:before,.action-previous:before{font-weight:700}.action-next>span,.action-previous>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-previous{margin-right:2.5rem;text-indent:-.25em}.action-previous:before{content:'\e629'}.action-next{margin-left:1.5rem;text-indent:.1em}.action-next:before{content:'\e62a'}.admin__data-grid-action-bookmarks{opacity:.98}.admin__data-grid-action-bookmarks .admin__action-dropdown-text:after{right:-6px;left:0}.admin__data-grid-action-bookmarks._active{z-index:290}.admin__data-grid-action-bookmarks .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:15rem;min-width:4.9rem;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown:before{content:'\e60f'}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu{font-size:1.3rem;left:0;padding:1rem 0;right:auto}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li{padding:0 5rem 0 0;position:relative;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action){transition:background-color .1s linear}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action):hover{background-color:#e3e3e3}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item{max-width:23rem;min-width:18rem;white-space:normal;word-break:break-all}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit{display:none;padding-bottom:1rem;padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit .action-dropdown-menu-item-actions{padding-bottom:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action{padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action+.action-dropdown-menu-item-last{padding-top:.5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a{color:#008bdb;text-decoration:none;display:inline-block;padding-left:1.1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a:hover{color:#0fa7ff;text-decoration:underline}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-last{padding-bottom:0}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item{display:none}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item-edit{display:block}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._active .action-dropdown-menu-link{font-weight:600}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{font-size:1.3rem;min-width:15rem;width:calc(100% - 4rem)}.ie9 .admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{width:15rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-actions{border-left:1px solid #fff;bottom:0;position:absolute;right:0;top:0;width:5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-link{color:#333;display:block;text-decoration:none;padding:1rem 1rem 1rem 2.1rem}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit,.admin__data-grid-action-bookmarks .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;vertical-align:top}.admin__data-grid-action-bookmarks .action-delete:hover,.admin__data-grid-action-bookmarks .action-edit:hover,.admin__data-grid-action-bookmarks .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before{font-size:1.7rem}.admin__data-grid-action-bookmarks .action-delete>span,.admin__data-grid-action-bookmarks .action-edit>span,.admin__data-grid-action-bookmarks .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit{padding:.6rem 1.4rem}.admin__data-grid-action-bookmarks .action-delete:active,.admin__data-grid-action-bookmarks .action-edit:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.admin__data-grid-action-bookmarks .action-submit{padding:.6rem 1rem .6rem .8rem}.admin__data-grid-action-bookmarks .action-submit:active{position:relative;right:-1px}.admin__data-grid-action-bookmarks .action-submit:before{content:'\e625'}.admin__data-grid-action-bookmarks .action-delete:before{content:'\e630'}.admin__data-grid-action-bookmarks .action-edit{padding-top:.8rem}.admin__data-grid-action-bookmarks .action-edit:before{content:'\e631'}.admin__data-grid-action-columns._active{opacity:.98;z-index:290}.admin__data-grid-action-columns .admin__action-dropdown:before{content:'\e60e';font-size:1.8rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-columns-menu{color:#303030;font-size:1.3rem;overflow:hidden;padding:2.2rem 3.5rem 1rem;z-index:1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-header{border-bottom:1px solid #d1d1d1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-content{width:49.2rem}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-footer{border-top:1px solid #d1d1d1;padding-top:2.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content{max-height:22.85rem;overflow-y:auto;padding-top:1.5rem;position:relative;width:47.4rem}.admin__data-grid-action-columns-menu .admin__field-option{height:1.9rem;float:left;margin-bottom:1.5rem;padding:0 1rem 0 0;width:15.8rem}.admin__data-grid-action-columns-menu .admin__field-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-header{padding-bottom:1.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-footer{padding:1rem 0 2rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-secondary-actions{float:left;margin-left:-1em}.admin__data-grid-action-export._active{opacity:.98;z-index:290}.admin__data-grid-action-export .admin__action-dropdown:before{content:'\e635';font-size:1.7rem;left:.3rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-export-menu{padding-left:2rem;padding-right:2rem;padding-top:1rem}.admin__data-grid-action-export-menu .admin__action-dropdown-footer-main-actions{padding-bottom:2rem;padding-top:2.5rem;white-space:nowrap}.sticky-header{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:8.8rem;right:0;margin-top:-1px;padding:.5rem 3rem 0;position:fixed;top:77px;z-index:400}.sticky-header .admin__data-grid-wrap{margin-bottom:0;overflow-x:visible;padding-bottom:0}.sticky-header .admin__data-grid-header-row{position:relative;text-align:right}.sticky-header .admin__data-grid-header-row:last-child{margin:0}.sticky-header .admin__data-grid-actions-wrap,.sticky-header .admin__data-grid-filters-wrap,.sticky-header .admin__data-grid-pager-wrap,.sticky-header .data-grid-filters-actions-wrap,.sticky-header .data-grid-search-control-wrap{display:inline-block;float:none;vertical-align:top}.sticky-header .action-select-wrap{float:left;margin-right:1.5rem;width:16.66666667%}.sticky-header .admin__control-support-text{float:left}.sticky-header .data-grid-search-control-wrap{margin:-.5rem 0 0 1.1rem;width:auto}.sticky-header .data-grid-search-control-wrap .data-grid-search-label{box-sizing:border-box;cursor:pointer;display:block;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;position:relative;text-align:center}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before{color:#333;content:'\e60c';font-size:2rem;transition:color .1s linear}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:hover:before{color:#000}.sticky-header .data-grid-search-control-wrap .data-grid-search-label span{display:none}.sticky-header .data-grid-filters-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-left:0;position:relative}.sticky-header .data-grid-filters-actions-wrap .action-default{background-color:transparent;border:1px solid transparent;box-sizing:border-box;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;text-align:center;transition:all .15s ease}.sticky-header .data-grid-filters-actions-wrap .action-default span{display:none}.sticky-header .data-grid-filters-actions-wrap .action-default:before{margin:0}.sticky-header .data-grid-filters-actions-wrap .action-default._active{background-color:#fff;border-color:#adadad #adadad #fff;box-shadow:1px 1px 5px rgba(0,0,0,.5);z-index:210}.sticky-header .data-grid-filters-actions-wrap .action-default._active:after{background-color:#fff;content:'';height:6px;left:-2px;position:absolute;right:-6px;top:100%}.sticky-header .data-grid-filters-action-wrap{padding:0}.sticky-header .admin__data-grid-filters-wrap{background-color:#fff;border:1px solid #adadad;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:0;padding-left:3.5rem;padding-right:3.5rem;position:absolute;top:100%;width:100%;z-index:209}.sticky-header .admin__data-grid-filters-current+.admin__data-grid-filters-wrap._show{margin-top:-6px}.sticky-header .filters-active{background-color:#e04f00;border-radius:10px;color:#fff;display:block;font-size:1.4rem;font-weight:700;padding:.1rem .7rem;position:absolute;right:-7px;top:0;z-index:211}.sticky-header .filters-active:empty{padding-top:0;padding-bottom:0}.sticky-header .admin__data-grid-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-right:.3rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown{background-color:transparent;box-sizing:border-box;min-width:3.8rem;padding-left:.6rem;padding-right:.6rem;text-align:center}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;min-width:0;max-width:0;overflow:hidden}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:before{margin:0}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap{margin-right:1.1rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after,.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:after{display:none}.sticky-header .admin__data-grid-actions-wrap ._active .admin__action-dropdown{background-color:#fff}.sticky-header .admin__data-grid-action-bookmarks .admin__action-dropdown:before{position:relative;top:-3px}.sticky-header .admin__data-grid-filters-current{border-top:0;border-bottom:0;margin-bottom:0;padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-pager .admin__control-text,.sticky-header .admin__data-grid-pager-wrap .admin__control-support-text,.sticky-header .data-grid-search-control-wrap .action-submit,.sticky-header .data-grid-search-control-wrap .data-grid-search-control{display:none}.sticky-header .action-next{margin:0}.sticky-header .data-grid{margin-bottom:-1px}.data-grid-cap-left,.data-grid-cap-right{background-color:#f8f8f8;bottom:-2px;position:absolute;top:6rem;width:3rem;z-index:201}.data-grid-cap-left{left:0}.data-grid-cap-right{right:0}.admin__data-grid-header{font-size:1.4rem}.admin__data-grid-header-row+.admin__data-grid-header-row{margin-top:1.1rem}.admin__data-grid-header-row:last-child{margin-bottom:0}.admin__data-grid-header-row .action-select-wrap{display:block}.admin__data-grid-header-row .action-select{width:100%}.admin__data-grid-actions-wrap{float:right;margin-left:1.1rem;margin-top:-.5rem;text-align:right}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap{position:relative;text-align:left}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._hide+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:first-child:after{display:none}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown-menu{border-color:#adadad}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after{border-left:1px solid #ccc;content:'';height:3.2rem;left:0;position:absolute;top:.5rem;z-index:3}.admin__data-grid-actions-wrap .admin__action-dropdown{padding-bottom:1.7rem;padding-top:1.2rem}.admin__data-grid-actions-wrap .admin__action-dropdown:after{margin-top:-.4rem}.admin__data-grid-outer-wrap{min-height:8rem;position:relative}.admin__data-grid-wrap{margin-bottom:2rem;max-width:100%;overflow-x:auto;padding-bottom:1rem;padding-top:2rem}.admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:-3rem;position:absolute;right:-3rem;top:0;z-index:401}.admin__data-grid-loading-mask .spinner{font-size:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%}.ie9 .admin__data-grid-loading-mask .spinner{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-cell-content{overflow:hidden;width:100%;display:inline-block}body._in-resize{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:col-resize}body._in-resize *,body._in-resize .data-grid-th,body._in-resize .data-grid-th._draggable,body._in-resize .data-grid-th._sortable{cursor:col-resize!important}._layout-fixed{table-layout:fixed}.data-grid{border:none;font-size:1.3rem;margin-bottom:0;max-width:100%;width:100%}.data-grid:not(._dragging-copy) ._odd-row td._dragging{background-color:#d0d0d0}.data-grid:not(._dragging-copy) ._dragging{background-color:#d9d9d9;color:rgba(48,48,48,.95)}.data-grid:not(._dragging-copy) ._dragging a{color:rgba(0,139,219,.95)}.data-grid:not(._dragging-copy) ._dragging a:hover{color:rgba(15,167,255,.95)}.data-grid thead{background-color:transparent}.data-grid tfoot th{padding:1rem}.data-grid tr._odd-row td{background-color:#f5f5f5}.data-grid tr.data-grid-tr-no-data:hover td{background-color:#fff;cursor:default}.data-grid tr:active td{background-color:#e0f6fe}.data-grid tr:hover td{background-color:#e5f7fe}.data-grid tr:not(.data-grid-editable-row):last-child td{border-bottom:.1rem solid #d6d6d6}.data-grid tr ._clickable,.data-grid tr._clickable{cursor:pointer}.data-grid td,.data-grid th{font-size:1.3rem;line-height:1.36;transition:background-color .1s linear;vertical-align:top}.data-grid td._resizing,.data-grid th._resizing{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid td{background-color:#fff;border-left:.1rem dashed #d6d6d6;border-right:.1rem dashed #d6d6d6;color:#303030;padding:1rem}.data-grid td:first-child{border-left-style:solid}.data-grid td:last-child{border-right-style:solid}.data-grid td .action-select-wrap{position:static}.data-grid td .action-select{background-color:transparent;border:none;font-size:1.3rem;position:relative;color:#008bdb;text-decoration:none;padding:0 3rem 0 0}.data-grid td .action-select:hover{color:#0fa7ff;text-decoration:underline}.data-grid td .action-select:hover:after{border-color:#0fa7ff transparent transparent}.data-grid td .action-select:after{border-color:#008bdb transparent transparent;margin:.6rem 0 0 .7rem;right:auto;top:auto}.data-grid td .action-select:before{display:none}.data-grid td .abs-action-menu .action-submenu,.data-grid td .abs-action-menu .action-submenu .action-submenu,.data-grid td .action-menu,.data-grid td .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:10rem;right:0;text-align:left;top:auto;z-index:1}.data-grid th{background-color:#514943;border:.1rem solid #8a837f;border-left-color:transparent;color:#fff;font-weight:600;padding:0;text-align:left}.data-grid th:first-child{border-left-color:#8a837f}.data-grid th._dragover-left{box-shadow:inset 3px 0 0 0 #fff;z-index:2}.data-grid th._dragover-right{box-shadow:inset -3px 0 0 0 #fff}.data-grid .shadow-div{cursor:col-resize;height:100%;margin-right:-5px;position:absolute;right:0;top:0;width:10px}.data-grid .data-grid-th{background-clip:padding-box;color:#fff;padding:1rem;position:relative;vertical-align:middle}.data-grid .data-grid-th._resize-visible .shadow-div{cursor:auto;display:none}.data-grid .data-grid-th._draggable{cursor:-webkit-grab;cursor:grab}.data-grid .data-grid-th._sortable{cursor:pointer;transition:background-color .1s linear;z-index:1}.data-grid .data-grid-th._sortable:focus,.data-grid .data-grid-th._sortable:hover{background-color:#5f564f}.data-grid .data-grid-th._sortable:active{padding-bottom:.9rem;padding-top:1.1rem}.data-grid .data-grid-th.required>span:after{color:#f38a5e;content:'*';margin-left:.3rem}.data-grid .data-grid-checkbox-cell{padding:0;vertical-align:top;width:5.2rem}.data-grid .data-grid-checkbox-cell:hover{cursor:default}.data-grid .data-grid-thumbnail-cell{text-align:center;width:7rem}.data-grid .data-grid-thumbnail-cell img{border:1px solid #d6d6d6;max-width:5rem}.data-grid .data-grid-multicheck-cell{padding:1rem 1rem .9rem;text-align:center;vertical-align:middle}.data-grid .data-grid-actions-cell{padding-left:2rem;padding-right:2rem;text-align:center;width:1%}.data-grid._hidden{display:none}.data-grid._dragging-copy{box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;opacity:.95;position:fixed;top:0;z-index:1000}.data-grid._dragging-copy .data-grid-th{border:1px solid #007bdb;border-bottom:none}.data-grid._dragging-copy .data-grid-th,.data-grid._dragging-copy .data-grid-th._sortable{cursor:-webkit-grabbing;cursor:grabbing}.data-grid._dragging-copy tr:last-child td{border-bottom:1px solid #007bdb}.data-grid._dragging-copy td{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:rgba(255,251,230,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td,.data-grid._dragging-copy._in-edit .data-grid-editable-row:hover td{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:after,.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{left:0;right:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:only-child{border-left:1px solid #007bdb;border-right:1px solid #007bdb;left:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-select,.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-text{opacity:.5}.data-grid._in-edit tr:hover td{background-color:#e6e6e6}.data-grid._in-edit ._odd-row.data-grid-editable-row td,.data-grid._in-edit ._odd-row.data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit ._odd-row td,.data-grid._in-edit ._odd-row:hover td{background-color:#dcdcdc}.data-grid._in-edit .data-grid-editable-row-actions td,.data-grid._in-edit .data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid._in-edit td{background-color:#e6e6e6;pointer-events:none}.data-grid._in-edit .data-grid-checkbox-cell{pointer-events:auto}.data-grid._in-edit .data-grid-editable-row{border:.1rem solid #adadad;border-bottom-color:#c2c2c2}.data-grid._in-edit .data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit .data-grid-editable-row td{background-color:#fff;border-bottom-color:#fff;border-left-style:hidden;border-right-style:hidden;border-top-color:#fff;pointer-events:auto;vertical-align:middle}.data-grid._in-edit .data-grid-editable-row td:first-child{border-left-color:#adadad;border-left-style:solid}.data-grid._in-edit .data-grid-editable-row td:first-child:after,.data-grid._in-edit .data-grid-editable-row td:first-child:before{left:0}.data-grid._in-edit .data-grid-editable-row td:last-child{border-right-color:#adadad;border-right-style:solid;left:-.1rem}.data-grid._in-edit .data-grid-editable-row td:last-child:after,.data-grid._in-edit .data-grid-editable-row td:last-child:before{right:0}.data-grid._in-edit .data-grid-editable-row .admin__control-select,.data-grid._in-edit .data-grid-editable-row .admin__control-text{width:100%}.data-grid._in-edit .data-grid-bulk-edit-panel td{vertical-align:bottom}.data-grid .data-grid-editable-row td{border-left-color:#fff;border-left-style:solid;position:relative;z-index:1}.data-grid .data-grid-editable-row td:after{bottom:0;box-shadow:0 5px 5px rgba(0,0,0,.25);content:'';height:.9rem;left:0;margin-top:-1rem;position:absolute;right:0}.data-grid .data-grid-editable-row td:before{background-color:#fff;bottom:0;content:'';height:1rem;left:-10px;position:absolute;right:-10px;z-index:1}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td,.data-grid .data-grid-editable-row.data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:first-child{border-left-color:#fff;border-right-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:last-child{left:0}.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:#fffbe6}.data-grid .data-grid-editable-row-actions{left:50%;margin-left:-12.5rem;margin-top:-2px;position:absolute;text-align:center}.data-grid .data-grid-editable-row-actions td{width:25rem}.data-grid .data-grid-editable-row-actions [class*=action-]{min-width:9rem}.data-grid-th._sortable._ascend,.data-grid-th._sortable._descend{padding-right:2.7rem}.data-grid-th._sortable._ascend:before,.data-grid-th._sortable._descend:before{margin-top:-1em;position:absolute;right:1rem;top:50%}.data-grid-th._sortable._ascend:before{content:'\2193'}.data-grid-th._sortable._descend:before{content:'\2191'}.data-grid-checkbox-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:right}.data-grid-checkbox-cell-inner:hover{cursor:pointer}.data-grid-row-parent._active>td .data-grid-checkbox-cell-inner:before{content:'\e62b'}.data-grid-row-parent>td .data-grid-checkbox-cell-inner{padding-left:3.7rem;position:relative}.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before{content:'\e628';font-size:1rem;font-weight:700;left:1.35rem;position:absolute;top:1.6rem}.data-grid-th._col-xs{width:1%}.data-grid-info-panel{box-shadow:0 0 5px rgba(0,0,0,.5);margin:2rem .1rem -2rem;padding:1rem}.data-grid-info-panel .messages{margin-bottom:1rem}.data-grid-info-panel-actions{text-align:right}.data-grid-editable-row .admin__field-control{position:relative}.data-grid-editable-row .admin__field-control._error:after{border-color:transparent #ee7d7d transparent transparent;border-style:solid;border-width:0 12px 12px 0;content:'';position:absolute;right:0;top:0}.data-grid-editable-row .admin__field-control._error .admin__control-text{border-color:#ee7d7d}.data-grid-editable-row .admin__field-control._focus:after{display:none}.data-grid-editable-row .admin__field-error{bottom:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin:0 auto 1.5rem;max-width:32rem;position:absolute;right:0}.data-grid-editable-row .admin__field-error:after,.data-grid-editable-row .admin__field-error:before{border-style:solid;content:'';left:50%;position:absolute;top:100%}.data-grid-editable-row .admin__field-error:after{border-color:#fffbbb transparent transparent;border-width:10px 10px 0;margin-left:-10px;z-index:1}.data-grid-editable-row .admin__field-error:before{border-color:#ee7d7d transparent transparent;border-width:11px 12px 0;margin-left:-12px}.data-grid-bulk-edit-panel .admin__field-label-vertical{display:block;font-size:1.2rem;margin-bottom:.5rem;text-align:left}.data-grid-row-changed{cursor:default;display:block;opacity:.5;position:relative;width:100%;z-index:1}.data-grid-row-changed:after{content:'\e631';display:inline-block}.data-grid-row-changed .data-grid-row-changed-tooltip{background:#f1f1f1;border-radius:1px;border:1px solid #f1f1f1;bottom:100%;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;line-height:1.36;margin-bottom:1.5rem;padding:1rem;position:absolute;right:-1rem;text-transform:none;width:27rem;word-break:normal;z-index:2}.data-grid-row-changed._changed{opacity:1;z-index:3}.data-grid-row-changed._changed:hover .data-grid-row-changed-tooltip{display:block}.data-grid-row-changed._changed:hover:before{background:#f1f1f1;border:1px solid #f1f1f1;bottom:100%;box-shadow:4px 4px 3px -1px rgba(0,0,0,.15);content:'';display:block;height:1.6rem;left:50%;margin:0 0 .7rem -.8rem;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:1.6rem;z-index:3}.ie9 .data-grid-row-changed._changed:hover:before{display:none}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]:before,.admin__control-file-label :before,.admin__control-multiselect,.admin__control-select,.admin__control-text,.admin__control-textarea,.selectmenu{background-color:#fff;border-radius:1px;border:1px solid #adadad;color:#303030;font-size:1.4rem;font-weight:400;line-height:1.36;height:auto;width:auto;padding:.6rem 1rem;transition:border-color .1s linear;vertical-align:baseline}.admin__control-multiselect:hover,.admin__control-select:hover,.admin__control-text:hover,.admin__control-textarea:hover,.selectmenu:hover,.selectmenu:hover .selectmenu-toggle:before{border-color:#878787}.admin__control-addon [class*=admin__control-][type]:focus+[class*=admin__addon-]:before,.admin__control-file:active+.admin__control-file-label :before,.admin__control-file:focus+.admin__control-file-label :before,.admin__control-multiselect:focus,.admin__control-select:focus,.admin__control-text:focus,.admin__control-textarea:focus,.selectmenu._focus,.selectmenu._focus .selectmenu-toggle:before{border-color:#007bdb;box-shadow:none;outline:0}.admin__control-addon [class*=admin__control-][type][disabled]+[class*=admin__addon-]:before,.admin__control-file[disabled]+.admin__control-file-label :before,.admin__control-multiselect[disabled],.admin__control-select[disabled],.admin__control-text[disabled],.admin__control-textarea[disabled]{background-color:#e9e9e9;border-color:#adadad;color:#303030;opacity:.5;cursor:not-allowed}.admin__fieldset>.admin__field.admin__field-wide[class]>.admin__field-control{float:none;clear:left;text-align:left;width:auto}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label{display:block;line-height:1.4rem;margin-bottom:.86rem;margin-top:-.14rem;text-align:left;width:auto}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label:before{display:none}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span{padding-left:1.5rem}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span:after{left:0;margin-left:30px;top:.2rem}.admin__legend{font-size:1.8rem;font-weight:600;margin-bottom:3rem}.admin__control-checkbox,.admin__control-radio{cursor:pointer;opacity:.01;overflow:hidden;position:absolute;vertical-align:top}.admin__control-checkbox:after,.admin__control-radio:after{display:none}.admin__control-checkbox+label,.admin__control-radio+label{cursor:pointer;display:inline-block}.admin__control-checkbox+label:before,.admin__control-radio+label:before{background-color:#fff;border:1px solid #adadad;color:transparent;float:left;height:1.6rem;text-align:center;vertical-align:top;width:1.6rem}.admin__control-checkbox+.admin__field-label,.admin__control-radio+.admin__field-label{padding-left:2.6rem}.admin__control-checkbox+.admin__field-label:before,.admin__control-radio+.admin__field-label:before{margin:1px 1rem 0 -2.6rem}.admin__control-checkbox:checked+label:before,.admin__control-radio:checked+label:before{color:#514943}.admin__control-checkbox.disabled+label,.admin__control-checkbox[disabled]+label,.admin__control-radio.disabled+label,.admin__control-radio[disabled]+label{cursor:default;color:#303030;opacity:.5}.admin__control-checkbox.disabled+label:before,.admin__control-checkbox[disabled]+label:before,.admin__control-radio.disabled+label:before,.admin__control-radio[disabled]+label:before{background-color:#e9e9e9;border-color:#adadad;cursor:default}._keyfocus .admin__control-checkbox:not(.disabled):focus+label:before,._keyfocus .admin__control-checkbox:not([disabled]):focus+label:before,._keyfocus .admin__control-radio:not(.disabled):focus+label:before,._keyfocus .admin__control-radio:not([disabled]):focus+label:before{border-color:#007bdb}.admin__control-checkbox:not(.disabled):hover+label:before,.admin__control-checkbox:not([disabled]):hover+label:before,.admin__control-radio:not(.disabled):hover+label:before,.admin__control-radio:not([disabled]):hover+label:before{border-color:#878787}.admin__control-radio+label:before{border-radius:1.6rem;content:'\e637';font-size:1rem;transition:border-color .1s linear,color .1s ease-in}.admin__control-radio.admin__control-radio+label:before{line-height:140%}.admin__control-radio:checked:not(.disabled):hover,.admin__control-radio:checked:not(.disabled):hover+label,.admin__control-radio:checked:not([disabled]):hover,.admin__control-radio:checked:not([disabled]):hover+label{cursor:default}.admin__control-radio:checked:not(.disabled):hover+label:before,.admin__control-radio:checked:not([disabled]):hover+label:before{border-color:#adadad}.admin__control-checkbox+label:before{border-radius:1px;content:'';font-size:0;transition:font-size .1s ease-out,color .1s ease-out,border-color .1s linear}.admin__control-checkbox:checked+label:before{content:'\e62d';font-size:1.1rem;line-height:125%}.admin__control-checkbox:not(:checked)._indeterminate+label:before,.admin__control-checkbox:not(:checked):indeterminate+label:before{color:#514943;content:'-';font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700}input[type=checkbox].admin__control-checkbox,input[type=radio].admin__control-checkbox{position:absolute;margin:0}.admin__control-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-repeat:no-repeat;background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#adadad,#adadad);background-position:calc(100% - 12px) -34px,100%,calc(100% - 3.2rem) 0;background-size:auto,3.2rem 100%,1px 100%;padding-bottom:.5rem;padding-right:4.4rem;padding-top:.5rem;transition:border-color .1s linear}.admin__control-select:hover{border-color:#878787;cursor:pointer}.admin__control-select:focus{background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#007bdb,#007bdb);background-position:calc(100% - 12px) 13px,100%,calc(100% - 3.2rem) 0;border-color:#007bdb}.admin__control-select::-ms-expand{display:none}.ie9 .admin__control-select{background-image:none;padding-right:1rem}option:empty{display:none}.admin__control-multiselect{height:auto;padding:.6rem 1rem}.admin__control-file-wrapper{display:inline-block;padding:.5rem 1rem;position:relative;z-index:1}.admin__control-file-label :before{content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__control-file{position:relative;z-index:1;background:0 0;border:0;width:auto}.admin__control-support-text{border:1px solid transparent;display:inline-block;font-size:1.4rem;line-height:1.36;padding-top:.6rem;padding-bottom:.6rem}.admin__control-support-text+[class*=admin__control-],[class*=admin__control-]+.admin__control-support-text{margin-left:.7rem}.admin__control-textarea{height:8.48rem;line-height:1.18;padding-top:.8rem;resize:vertical}.admin__control-addon{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;display:inline-flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;position:relative;width:100%;z-index:1}.admin__control-addon>[class*=admin__addon-],.admin__control-addon>[class*=admin__control-]{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative;z-index:1}.admin__control-addon [class*=admin__control-][type]{appearence:none;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;box-shadow:none;background-color:transparent;border-color:transparent;-webkit-order:1;-ms-flex-order:1;order:1;vertical-align:top;width:auto}.admin__control-addon [class*=admin__control-][type] :focus{box-shadow:0}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]{padding-left:1rem;position:static!important;z-index:0}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]>*{position:relative;vertical-align:top;z-index:2}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]:before{bottom:0;box-sizing:border-box;content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__addon-prefix,.admin__addon-suffix{border:0;box-sizing:border-box;color:#858585;display:inline-block;font-size:1.4rem;font-weight:400;height:3.2rem;line-height:3.2rem;padding:0}.admin__addon-suffix{-webkit-order:3;-ms-flex-order:3;order:3}.admin__addon-suffix:last-child{padding-right:1rem}.admin__addon-prefix{-webkit-order:0;-ms-flex-order:0;order:0}.ie9 .admin__control-addon:after{clear:both;content:'';display:block;height:0;overflow:hidden}.ie9 .admin__addon{min-width:0;overflow:hidden;text-align:right;white-space:nowrap;width:auto}.ie9 .admin__addon [class*=admin__control-]{display:inline}.ie9 .admin__addon-prefix{float:left}.ie9 .admin__addon-suffix{float:right}.admin__control-table-wrapper{max-width:100%;overflow-x:auto;overflow-y:hidden}.admin__control-table{width:100%}.admin__control-table thead{background-color:transparent}.admin__control-table tbody td{vertical-align:middle}.admin__control-table tfoot th{padding-bottom:1.3rem}.admin__control-table tr:last-child td,.admin__control-table tr:last-child th{border-bottom:none}.admin__control-table td,.admin__control-table th{background-color:#efefef;border:0;border-bottom:1px solid #fff;padding:1.3rem 2.5rem 1.3rem 0;text-align:left;vertical-align:top}.admin__control-table td:first-child,.admin__control-table th:first-child{padding-left:1.5rem}.admin__control-table th{border:0;vertical-align:bottom;color:#303030;font-size:1.4rem;font-weight:600;padding-bottom:0}.admin__control-table th._required span:after{color:#eb5202;content:'*'}.admin__control-table .control-table-actions-th{white-space:nowrap}.admin__control-table .control-table-actions-cell{padding-top:1.8rem;text-align:center;width:1%}.admin__control-table .col-draggable{padding-top:2.2rem;width:1%}.admin__control-table .action-delete,.admin__control-table .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-table .action-delete:before{content:'\e630'}.admin__control-table .action-delete>span{display:none}.admin__field-tooltip{display:inline-block;margin-top:5px;overflow:visible;vertical-align:top;width:0}.admin__field-tooltip:hover{position:relative;z-index:500}.admin__field-option .admin__field-tooltip{margin-top:10px}.admin__field-tooltip .admin__field-tooltip-action{margin-left:20px;display:inline-block;text-decoration:none}.admin__field-tooltip .admin__field-tooltip-action:before{-webkit-font-smoothing:antialiased;font-size:2.2rem;line-height:1;color:#514943;content:'\e633';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.admin__field-tooltip .admin__control-text:focus+.admin__field-tooltip-content,.admin__field-tooltip:hover .admin__field-tooltip-content{display:block}.admin__field-tooltip .admin__field-tooltip-content{bottom:42px;display:none;right:-70px}.admin__field-tooltip .admin__field-tooltip-content:after,.admin__field-tooltip .admin__field-tooltip-content:before{border:16px solid transparent;height:0;width:0;border-top-color:#afadac;content:"";display:block;position:absolute;right:20px;top:100%;z-index:3}.admin__field-tooltip .admin__field-tooltip-content:after{border-top-color:#fffbbb;margin-top:-1px;z-index:4}.abs-admin__field-tooltip-content,.admin__field-tooltip .admin__field-tooltip-content{box-shadow:0 2px 8px 0 rgba(0,0,0,.3);background:#fffbbb;border-radius:1px;border:1px solid #afadac;padding:15px 25px;position:absolute;width:320px;z-index:1}.admin__fieldset{border:0;margin:0;min-width:0;padding:0}.admin__fieldset>.admin__field{border:0;margin:0 0 0 -30px;padding:0}.admin__fieldset>.admin__field:after{clear:both;content:'';display:table}.admin__fieldset>.admin__field>.admin__field-control{width:calc((100%) * .4444444444444444 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field>.admin__field-label{width:calc((100%) * .3333333333333333 - 30px);float:left;margin-left:30px}.admin__form-field{border:0;margin:0;padding:0}.admin__field-control .admin__control-text,.admin__field-control .admin__control-textarea,.admin__form-field-control .admin__control-text,.admin__form-field-control .admin__control-textarea{width:100%}.admin__field-label{color:#303030;margin:0;text-align:right}.admin__field-label+br{display:none}.admin__field:not(.admin__field-option)>.admin__field-label{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:3.2rem;padding:0;white-space:nowrap;word-wrap:break-word}.admin__field:not(.admin__field-option)>.admin__field-label:before{opacity:0;visibility:hidden;content:'.';margin-left:-7px;overflow:hidden}.admin__field:not(.admin__field-option)>.admin__field-label span{display:inline-block;line-height:1.2;vertical-align:middle;white-space:normal}._required>.admin__field-label span:after{color:#eb5202;content:'*';display:inline-block;font-size:1.6rem;font-weight:500;line-height:1;margin-left:10px;position:absolute;top:1.2rem;z-index:1}._disabled>.admin__field-label{color:#999}.admin__field{margin-bottom:0}.admin__field+.admin__field{margin-top:1.5rem}.admin__field:not(.admin__field-option)~.admin__field-option{margin-top:.5rem}.admin__field.admin__field-option~.admin__field-option{margin-top:.9rem}.admin__field~.admin__field-option:last-child{margin-bottom:.8rem}.admin__fieldset>.admin__field{margin-bottom:3rem;position:relative}.admin__field[data-config-scope]:before{color:gray;content:attr(data-config-scope);display:inline-block;font-size:1.2rem;left:calc((100%) * .7777777777777778 - 30px);line-height:3.2rem;margin-left:60px;position:absolute;width:calc((100%) * .2222222222222222 - 30px)}.admin__field-control .admin__field[data-config-scope]:nth-child(n+2):before{content:''}.admin__field._error .admin__field-control [class*=admin__addon-]:before,.admin__field._error .admin__field-control>[class*=admin__control-]{border-color:#e22626}.admin__field-control+.admin__field-control{margin-top:1.5rem}.admin__field-error{background:#fffbbb;border:1px solid #ee7d7d;box-sizing:border-box;color:#555;display:block;font-size:1.2rem;font-weight:400;line-height:1.2;margin:.2rem 0 0;padding:.8rem 1rem .9rem}.admin__field-note{color:#303030;font-size:1.2rem;margin:10px 0 0;padding:0}.admin__field-option{padding-top:.8rem}.admin__field-option .admin__field-label{text-align:left}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2),.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1){display:inline-block}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option{display:inline-block;margin-left:41px;margin-top:0}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option:before,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option:before{background:#cacaca;content:'';display:inline-block;height:20px;margin-left:-20px;position:absolute;width:1px}.admin__field-value{padding-top:.8rem}.admin__control-fields>.admin__field:first-child,[class*=admin__control-grouped]>.admin__field:first-child{position:static}.admin__control-fields>.admin__field:first-child>.admin__field-label,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label{width:calc((100%) * .3333333333333333 - 30px);float:left;margin-left:30px;cursor:pointer;left:0;opacity:0;position:absolute;top:0}.admin__control-fields .admin__field-label~.admin__field-control{width:100%}[class*=admin__control-grouped]{box-sizing:border-box;display:table;table-layout:fixed;width:100%}[class*=admin__control-grouped]>.admin__field{display:table-cell;vertical-align:top;width:50%}[class*=admin__control-grouped]>.admin__field>.admin__field-control{float:none;width:100%}[class*=admin__control-grouped]>.admin__field:nth-child(n+2){padding-left:20px}[class*=admin__control-grouped]>.admin__field:nth-child(n+2):not(.admin__field-option) .admin__field-label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.admin__field-control-group{margin-top:.8rem}.admin__field-control-group>.admin__field{padding:0}.admin__legend{float:left;position:static;width:100%}.admin__legend+br{display:block;height:0;overflow:hidden;clear:left}.message{margin-bottom:3rem}.message-icon-top:before{margin-top:0;top:1.8rem}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;margin-bottom:3rem;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav .btn-group .btn-wrap .btn,.nav-bar-outer-actions .btn-wrap .btn{padding-left:.5rem;padding-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:1rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before,.nav-bar>li.ui-state-disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after,.nav-bar>li.ui-state-active~li:after{display:none}.nav-bar>li.active~li a:after,.nav-bar>li.ui-state-active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a,.nav-bar>li.ui-state-active a{color:#000}.nav-bar>li.active a:hover,.nav-bar>li.ui-state-active a:hover{cursor:default}.nav-bar>li.active a:after,.nav-bar>li.ui-state-active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:1.5rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:1.5rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.3rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.3rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip p:last-child{margin-bottom:0}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:20rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@-webkit-keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;clear:left;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-text-description{margin-bottom:1.6rem}.progress-bar-text-progress{text-align:right}.page-columns .page-inner-sidebar{margin:0 0 3rem}.page-header{margin-bottom:2.7rem;padding-bottom:2.9rem;position:relative}.page-header:before{border-bottom:1px solid #e3e3e3;bottom:0;content:'';display:block;height:1px;left:3rem;position:absolute;right:3rem}.container .page-header:before{content:normal}.page-header .message{margin-bottom:1.8rem}.page-header .message+.message{margin-top:-1.5rem}.page-header .admin__action-dropdown,.page-header .search-global-input{transition:none}.container .page-header{margin-bottom:0}.page-title-wrapper{margin-top:1.1rem}.container .page-title-wrapper{background:url(../../pub/images/logo.svg) no-repeat;min-height:41px;padding:4px 0 0 45px}.admin__menu .level-0:first-child>a{margin-top:1.6rem}.admin__menu .level-0:first-child>a:after{top:-1.6rem}.admin__menu .level-0>a{padding-top:1.3rem;padding-bottom:1.3rem}.admin__menu .level-0>a:before{margin-bottom:.7rem}.admin__menu .item-home>a:before{content:'\e611';font-size:2.3rem;padding-top:-.1rem}.admin__menu .item-component>a:before{content:'\e612'}.admin__menu .item-upgrade>a:before{content:'\e614'}.admin__menu .item-system-config>a:before{content:'\e610'}.admin__menu .item-tools>a:before{content:'\e613'}.modal-sub-title{font-size:1.7rem;font-weight:600}.modal-connect-signin .modal-inner-wrap{max-width:80rem}@-webkit-keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{-webkit-overflow-scrolling:touch;bottom:0;box-sizing:border-box;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:999}.ngdialog *,.ngdialog:after,.ngdialog:before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation *{-webkit-animation:none!important;animation:none!important}.ngdialog.ngdialog-closing .ngdialog-content,.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadeout .5s;animation:ngdialog-fadeout .5s}.ngdialog-overlay{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s;background:rgba(0,0,0,.4);bottom:0;left:0;position:fixed;right:0;top:0}.ngdialog-content{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s}body.ngdialog-open{overflow:hidden}.component-indicator{border-radius:50%;cursor:help;display:inline-block;height:20px;text-align:center;width:20px}.component-indicator::after,.component-indicator::before{background:#fff;display:block;opacity:0;position:absolute;transition:opacity .2s linear .1s;visibility:hidden}.component-indicator::before{border-radius:1px;border:1px solid #adadad;box-shadow:0 0 2px rgba(0,0,0,.4);content:attr(data-label);font-size:1.2rem;margin:34px 0 0 -10px;min-width:50px;padding:4px 5px}.component-indicator::after{border:1px solid #999;border-width:1px 0 0 1px;box-shadow:-1px -1px 1px rgba(0,0,0,.1);content:'';height:10px;margin:9px 0 0 5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.component-indicator:hover::after,.component-indicator:hover::before{opacity:1;transition:opacity .2s linear;visibility:visible}.component-indicator span{display:block;height:20px;overflow:hidden;width:20px}.component-indicator span:before{content:'';display:block;font-family:Icons;font-size:20px;height:100%;line-height:20px;width:100%}.component-indicator._on{background:#79a22e}.component-indicator._off{background:#e22626}.component-indicator._off span:before{background:#fff;height:4px;margin:8px auto 20px;width:12px}.component-indicator._info{background:0 0}.component-indicator._info span{width:21px}.component-indicator._info span:before{color:#008bdb;content:'\e61a';font-family:Icons;font-size:21px}.app-updater .nav{display:block;margin-bottom:3.1rem;margin-top:-2.8rem}.app-updater .nav-bar-outer-actions{margin-top:1rem;padding-right:0}.app-updater .nav-bar-outer-actions .btn-wrap-cancel{margin-right:2.6rem}.main{padding-bottom:2rem;padding-top:3rem}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;line-height:1.4;margin:2.5rem 0 3.5rem 5rem}.page-sub-title{font-size:2rem}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit,.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.readiness-check-item{margin-bottom:4rem;min-height:2.5rem}.readiness-check-item .spinner{font-size:2.5rem;float:left;margin:-.4rem 0 0 1.7rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:5.7rem}.readiness-check-content{margin-left:5.7rem;margin-right:22rem}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.readiness-check-side{float:right;padding-left:2.4rem;width:22rem}.readiness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:1.7rem;margin-top:.7rem}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .customize-your-store-default .legend{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.customize-your-store .customize-database-clean p{margin-top:2.5rem}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;height:20rem;margin:1rem 0 2rem;overflow-y:auto;padding:1.5rem 2rem 2rem;resize:vertical}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}.install-database-clean{margin-top:4rem}.install-database-clean .btn{margin-right:1rem}.page-sub-title{margin-bottom:2.1rem}.multiselect-custom{max-width:71.1rem}.content-install{margin-top:3.7rem}.home-page-inner-wrap{margin:0 auto;max-width:91rem}.setup-home-title{margin-bottom:3.9rem;padding-top:1.8rem;text-align:center}.setup-home-item{background-color:#fafafa;border:1px solid #ccc;color:#333;display:block;margin-bottom:2rem;margin-left:1.3rem;margin-right:1.3rem;min-height:30rem;padding:2rem;text-align:center}.setup-home-item:hover{border-color:#8c8c8c;color:#333;text-decoration:none;transition:border-color .1s linear}.setup-home-item:active{-webkit-transform:scale(0.99);-ms-transform:scale(0.99);transform:scale(0.99)}.setup-home-item:before{display:block;font-size:7rem;margin-bottom:3.3rem;margin-top:4rem}.setup-home-item-component:before{content:'\e612'}.setup-home-item-upgrade:before{content:'\e614'}.setup-home-item-configuration:before{content:'\e610'}.setup-home-item-title{display:block;font-size:1.8rem;letter-spacing:.025em;margin-bottom:1rem}.setup-home-item-description{display:block}.componenet-manager-wrap{border:1px solid #bbb;margin:0 0 4rem}.componenet-manager-wrap .componenet-manager-account{font-size:1.4rem;float:right;padding:.6rem 0 0}.componenet-manager-wrap .componenet-manager-account .sign-in-out{margin-left:2rem}.component-manager-title{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;color:#41362f;font-size:2rem;line-height:1.2;padding:2rem}.component-manager-content{padding:2.5rem 2rem 2rem}.componenet-manager-items{list-style:none;margin:0;text-align:center}.componenet-manager-items .btn{border:1px solid #adadad}.componenet-manager-items .item-title{margin:0 0 1.5rem}.componenet-manager-items .item-number{font-size:6rem;line-height:.8;margin:0 0 1.5rem}.componenet-manager-items .item-date{margin:0 0 3.7rem}.componenet-manager-items .item-install{margin:0 0 2rem}.componenet-manager-items .item-install .btn{line-height:1.36;margin:0;padding:0;color:#008bdb;text-decoration:none;background:0 0;border:0;display:inline;font-size:1.4rem;font-weight:400}.componenet-manager-items .item-install .btn:visited{color:#008bdb;text-decoration:none}.componenet-manager-items .item-install .btn:hover{text-decoration:underline}.componenet-manager-items .item-install .btn:active{color:#ff5501;text-decoration:underline}.componenet-manager-items .item-install .btn:hover{color:#0fa7ff}.componenet-manager-items .item-install .btn:active,.componenet-manager-items .item-install .btn:focus,.componenet-manager-items .item-install .btn:hover{background:0 0;border:0}.componenet-manager-items .item-install .btn.disabled,.componenet-manager-items .item-install .btn[disabled],fieldset[disabled] .componenet-manager-items .item-install .btn{color:#008bdb;opacity:.5;cursor:default;pointer-events:none;text-decoration:underline}.componenet-manager-items .item-install .btn.disabled{text-decoration:none}.sync-login-wrap{margin:-2.5rem 0 0;padding:0 10% 4rem}.sync-login-wrap .legend{font-size:2.6rem;color:#eb5202;float:left;font-weight:300;line-height:1.2;margin:-1rem 0 2.5rem;position:static;width:100%}.sync-login-wrap .legend._hidden{display:none}.sync-login-wrap .login-header{font-size:3.4rem;font-weight:300;margin:0 0 2rem}.sync-login-wrap .login-header span{display:inline-block;padding:.9rem 0 0;vertical-align:top}.sync-login-wrap .form-row .form-label{display:inline-block}.sync-login-wrap .form-row .form-label.required{padding-left:1.5rem}.sync-login-wrap .form-row .form-label.required:after{left:0;position:absolute;right:auto}.sync-login-wrap .form-row{max-width:28rem}.sync-login-wrap .form-actions{display:table;margin-top:-1.3rem}.sync-login-wrap .form-actions .links{display:table-header-group}.sync-login-wrap .form-actions .actions{padding:3rem 0 0}@media all and (max-width:1047px){.admin__menu .submenu li{min-width:19.8rem}.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}.app-updater .nav{padding-bottom:1.7rem}.app-updater .nav-bar-outer-actions{margin-top:2rem}}@media all and (min-width:768px){.page-layout-admin-2columns-left .page-columns{margin-left:-30px}.page-layout-admin-2columns-left .page-columns:after{clear:both;content:'';display:table}.page-layout-admin-2columns-left .page-columns .main-col{width:calc((100%) * .75 - 30px);float:right}.page-layout-admin-2columns-left .page-columns .side-col{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}.page-columns{margin-left:-30px}.page-columns:after{clear:both;content:'';display:table}.page-columns .page-inner-content{width:calc((100%) * .75 - 30px);float:right}.page-columns .page-inner-sidebar{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}} \ No newline at end of file +.abs-action-delete,.abs-icon,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-radio+label:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__menu .level-0>a:before,.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;line-height:1;font-style:normal;font-weight:400;speak:none}.validation-symbol:after{content:'*';color:#e22626;font-weight:400;margin-left:3px}.abs-modal-overlay,.modals-overlay{background:rgba(0,0,0,.35);bottom:0;left:0;position:fixed;right:0;top:0}.abs-action-delete>span,.abs-visually-hidden,.admin__control-fields .admin__field:nth-child(n+2):not(.admin__field-option)>.admin__field-label,.admin__field-tooltip .admin__field-tooltip-action span,.selectmenu .action-delete>span,.selectmenu .action-edit>span,.selectmenu .action-save>span,.selectmenu-toggle span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.abs-visually-hidden-reset{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.abs-clearfix:after,.abs-clearfix:before,.action-multicheck-wrap:after,.action-multicheck-wrap:before,.actions-split:after,.actions-split:before,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:before,.admin__data-grid-filters-footer:after,.admin__data-grid-filters-footer:before,.admin__data-grid-filters:after,.admin__data-grid-filters:before,.admin__data-grid-header-row:after,.admin__data-grid-header-row:before,.page-actions._fixed:after,.page-actions._fixed:before,.page-content:after,.page-content:before,.page-header-actions:after,.page-header-actions:before,.page-main-actions:not(._hidden):after,.page-main-actions:not(._hidden):before{content:'';display:table}.abs-clearfix:after,.action-multicheck-wrap:after,.actions-split:after,.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content:after,.admin__data-grid-filters-footer:after,.admin__data-grid-filters:after,.admin__data-grid-header-row:after,.page-actions._fixed:after,.page-content:after,.page-header-actions:after,.page-main-actions:not(._hidden):after{clear:both}.abs-list-reset-styles{margin:0;padding:0;list-style:none}.abs-draggable-handle{cursor:-webkit-grab;cursor:move;font-size:0;margin-top:-4px;padding:0 1rem 0 0;vertical-align:middle;display:inline-block;text-decoration:none}.abs-draggable-handle:before{-webkit-font-smoothing:antialiased;font-size:1.8rem;line-height:inherit;color:#9e9e9e;content:'\e617';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.abs-draggable-handle:hover:before{color:#858585}html{box-sizing:border-box;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}:focus{box-shadow:none;outline:0}._keyfocus :focus{box-shadow:0 0 0 1px #008bdb}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}embed,img,object,video{max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/light/opensans-300.eot);src:url(../fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../fonts/opensans/light/opensans-300.woff) format('woff'),url(../fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/regular/opensans-400.eot);src:url(../fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../fonts/opensans/regular/opensans-400.woff) format('woff'),url(../fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/semibold/opensans-600.eot);src:url(../fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../fonts/opensans/bold/opensans-700.eot);src:url(../fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../fonts/opensans/bold/opensans-700.woff) format('woff'),url(../fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#333;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.36;font-size:1.4rem}h1{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2.8rem}h2{margin:0 0 2rem;color:#41362f;font-weight:400;line-height:1.2;font-size:2rem}h3{margin:0 0 2rem;color:#41362f;font-weight:600;line-height:1.2;font-size:1.7rem}h4,h5,h6{font-weight:600;margin-top:0}p{margin:0 0 1em}small{font-size:1.2rem}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}dl,ol,ul{padding-left:0}nav ol,nav ul{list-style:none;margin:0;padding:0}html{height:100%}body{background-color:#fff;min-height:100%;min-width:102.4rem}.page-wrapper{background-color:#fff;display:inline-block;margin-left:-4px;vertical-align:top;width:calc(100% - 8.8rem)}.page-content{padding-bottom:3rem;padding-left:3rem;padding-right:3rem}.notices-wrapper{margin:0 3rem}.notices-wrapper .messages{margin-bottom:0}@media (min-width:1024px){html{width:100vw}body{overflow-x:hidden}}.row{margin-left:0;margin-right:0}.row:after{clear:both;content:'';display:table}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:0;padding-right:0}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.row-gutter{margin-left:-1.5rem;margin-right:-1.5rem}.row-gutter>[class*=col-]{padding-left:1.5rem;padding-right:1.5rem}.abs-clearer:after,.component-manager-content:after,.component-manager-title:after,.form-row:after,.header:after,.nav:after,body:after{clear:both;content:'';display:table}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:Icons;src:url(../fonts/icons/icons.eot);src:url(../fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../fonts/icons/icons.woff2) format('woff2'),url(../fonts/icons/icons.woff) format('woff'),url(../fonts/icons/icons.ttf) format('truetype'),url(../fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}.icon-failed:before,.icon-success:before,[class*=icon-]:after{font-family:Icons}.icon-success{color:#79a22e}.icon-success:before{content:'\e62d'}.icon-failed{color:#e22626}.icon-failed:before{content:'\e632'}.icon-success-thick:after{content:'\e62d'}.icon-collapse:after{content:'\e615'}.icon-failed-thick:after{content:'\e632'}.icon-expand:after{content:'\e616'}.icon-warning:after{content:'\e623'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.5em;left:0;position:absolute;right:0;top:.45em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e62d'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e632'}dl,ol,ul{margin-top:0}.list{padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success,.list-item-warning{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{left:-.1em;position:absolute}.list-item-success:before{color:#79a22e}.list-item-failed:before{color:#e22626}.list-item-warning:before{color:#ef672f}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .9em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-medium{font-size:1.4rem;padding:.5em 1.5em .6em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:active,.btn-link:focus,.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:focus,.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1);color:#fff}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active,.btn-secondary:focus{background-color:#574e48;color:#fff}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary[disabled]:active{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:focus:after,.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:focus:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:focus:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:focus:after,.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:focus:after,.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:focus:after,.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}.form-row.form-row-text{padding-top:.6rem}.form-row.form-row-text .action-sign-out{font-size:1.2rem;margin-left:1rem}.form-note{font-size:1.2rem;font-weight:600;margin-top:1rem}.form-el-dummy{display:none}.fieldset{border:0;margin:0;min-width:0;padding:0}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-el-input:required{box-shadow:none}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;vertical-align:top;padding:.43em .55em .5em 0}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{margin-bottom:2.5em;padding-top:1.5em;font-weight:600;font-size:1.25em}.form-legend{width:100%;border-top:1px solid #ccc}.form-legend-light{margin-bottom:1.5em;font-size:1em}.form-legend-expand{cursor:pointer;transition:opacity .2s linear}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e615'}.form-legend-expand:after{margin-left:.5em;font-weight:400;font-size:1.15em;font-family:Icons;content:'\e616';vertical-align:sub}.form-el-checkbox,.form-el-radio{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{background-color:#fff;border-color:#adadad;border-radius:2px;height:1.6rem;line-height:1.2;width:1.6rem;font-size:1.2rem}.form-el-checkbox:checked+.form-label::before{content:'\e62d';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.8rem;width:1.8rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative;z-index:0}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{position:relative;height:45.2rem;border:1px solid #adadad;overflow:auto;margin:0 0 1.5rem}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fffbbb;border:1px solid #ee7d7d;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.8rem 1rem .9rem}.check-result-message{margin-left:.5em;min-height:3.68rem;-webkit-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}body:not([class]){min-width:0}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0}.abs-action-delete,.action-close:before,.action-next:before,.action-previous:before,.admin-user .admin__action-dropdown:before,.admin__action-multiselect-search-label:before,.admin__control-checkbox+label:before,.admin__control-radio+label:before,.admin__control-table .action-delete:before,.admin__current-filters-list .action-remove:before,.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before,.admin__data-grid-action-bookmarks .admin__action-dropdown:before,.admin__data-grid-action-columns .admin__action-dropdown:before,.admin__data-grid-action-export .admin__action-dropdown:before,.admin__menu .level-0>a:before,.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon,.admin__page-nav-title._collapsible:after,.data-grid-filters-action-wrap .action-default:before,.data-grid-row-changed:after,.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before,.data-grid-search-control-wrap .action-submit:before,.icon-failed:before,.icon-success:before,.notifications-action:before,.notifications-close:before,.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before,.page-title-jumbo-success:before,.search-global-label:before,.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before,.setup-home-item:before,.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before,.store-switcher .dropdown-menu .dropdown-toolbar a:before,.tooltip .help a:before,.tooltip .help span:before{-webkit-font-smoothing:antialiased;font-family:Icons;line-height:1;font-style:normal;font-weight:400;speak:none}.text-stretch{margin-bottom:1.5em}.page-title-jumbo{font-size:4rem;font-weight:300;letter-spacing:-.05em;margin-bottom:2.9rem}.page-title-jumbo-success:before{color:#79a22e;content:'\e62d';font-size:3.9rem;margin-left:-.3rem;margin-right:2.4rem}.list{margin-bottom:3rem}.list-dot .list-item{display:list-item;list-style-position:inside;margin-bottom:1.2rem}.list-title{color:#333;font-size:1.4rem;font-weight:700;letter-spacing:.025em;margin-bottom:1.2rem}.list-item-failed:before,.list-item-success:before,.list-item-warning:before{font-family:Icons;font-size:1.6rem;top:0}.list-item-success:before{content:'\e62d';font-size:1.6rem}.list-item-failed:before{content:'\e632';font-size:1.4rem;left:.1rem;top:.2rem}.list-item-warning:before{content:'\e623';font-size:1.3rem;left:.2rem}.form-wrap{padding-top:2.1rem;margin-bottom:3.6rem}.form-el-label-horizontal{display:inline-block;font-size:1.3rem;font-weight:600;letter-spacing:.025em;margin-left:.4rem;margin-bottom:.4rem}.app-updater{min-width:768px}body._has-modal{height:100%;overflow:hidden;width:100%}.modals-overlay{z-index:899}.modal-popup,.modal-slide{bottom:0;min-width:0;pointer-events:none;position:fixed;right:0;top:0;visibility:hidden}.modal-popup._show,.modal-slide._show{visibility:visible}.modal-popup._show .modal-inner-wrap,.modal-slide._show .modal-inner-wrap{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-popup .modal-inner-wrap,.modal-slide .modal-inner-wrap{background-color:#fff;box-shadow:0 0 12px 2px rgba(0,0,0,.35);opacity:1;pointer-events:auto}.modal-slide{left:14.8rem;z-index:900}.modal-slide._show .modal-inner-wrap{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto}.modal-slide._inner-scroll .modal-inner-wrap{overflow-y:visible;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.modal-slide._inner-scroll .modal-footer,.modal-slide._inner-scroll .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.modal-slide._inner-scroll .modal-content{overflow-y:auto}.modal-slide._inner-scroll .modal-footer{margin-top:auto}.modal-slide .modal-content,.modal-slide .modal-footer,.modal-slide .modal-header{padding:0 2.6rem 2.6rem}.modal-slide .modal-header{padding-bottom:2.1rem;padding-top:2.1rem}.modal-popup{left:0;overflow-y:auto;z-index:900}.modal-popup._show .modal-inner-wrap{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.modal-popup .modal-inner-wrap{box-sizing:border-box;height:auto;left:0;margin:5rem auto;position:absolute;right:0;-webkit-transform:translateY(-200%);-ms-transform:translateY(-200%);transform:translateY(-200%);transition-duration:.2s;transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-timing-function:ease;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:75%}.modal-popup._inner-scroll{overflow-y:visible}.ie10 .modal-popup._inner-scroll,.ie9 .modal-popup._inner-scroll{overflow-y:auto}.modal-popup._inner-scroll .modal-inner-wrap{max-height:90%}.ie10 .modal-popup._inner-scroll .modal-inner-wrap,.ie9 .modal-popup._inner-scroll .modal-inner-wrap{max-height:none}.modal-popup._inner-scroll .modal-content{overflow-y:auto}.modal-popup .modal-content,.modal-popup .modal-footer,.modal-popup .modal-header{padding-left:3rem;padding-right:3rem}.modal-popup .modal-footer,.modal-popup .modal-header{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.modal-popup .modal-header{padding-bottom:3rem;padding-top:3rem}.modal-popup .modal-footer{margin-top:auto;padding-bottom:3rem;padding-top:3rem}.modal-popup .modal-footer-actions{text-align:right}.modal-popup.confirm .modal-inner-wrap{left:50%;margin-left:-25rem;width:50rem}.modal-popup.confirm .modal-footer{text-align:right}.modal-popup._image-box .modal-inner-wrap{margin:5rem auto;max-width:78rem;position:static}.modal-popup._image-box .thumbnail-preview{padding-bottom:3rem;text-align:center}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image-block{border:1px solid #ccc;margin:0 auto 2rem;max-width:58rem;padding:2rem}.modal-popup._image-box .thumbnail-preview .thumbnail-preview-image{max-height:54rem}@media (max-width:768px){.modal-popup.modal-slide{left:14.8rem;z-index:900}.modal-popup.modal-slide._show .modal-inner-wrap{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.modal-popup.modal-slide .modal-inner-wrap{height:100%;overflow-y:auto;position:static;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);transition-duration:.3s;transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-timing-function:ease-in-out;width:auto;margin:0;max-height:none}}.admin__action-dropdown-wrap{display:inline-block;position:relative}.admin__action-dropdown-wrap .admin__action-dropdown-text:after{left:-6px;right:0}.admin__action-dropdown-wrap .admin__action-dropdown-menu{left:auto;right:0}.admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__action-dropdown-wrap.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin__action-dropdown-wrap._active .admin__action-dropdown-text:after,.admin__action-dropdown-wrap.active .admin__action-dropdown-text:after{background-color:#fff;content:'';height:6px;position:absolute;top:100%}.admin__action-dropdown-wrap._active .admin__action-dropdown-menu,.admin__action-dropdown-wrap.active .admin__action-dropdown-menu{display:block}.admin__action-dropdown-wrap._disabled .admin__action-dropdown{cursor:default}.admin__action-dropdown-wrap._disabled:hover .admin__action-dropdown{color:#333}.admin__action-dropdown{background-color:#fff;border:1px solid transparent;border-bottom:none;border-radius:0;box-shadow:none;color:#333;display:inline-block;font-size:1.3rem;font-weight:400;letter-spacing:-.025em;padding:.7rem 3.3rem .8rem 1.5rem;position:relative;vertical-align:baseline;z-index:2}.admin__action-dropdown._active:after,.admin__action-dropdown.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .admin__action-dropdown:after,.active .admin__action-dropdown:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin__action-dropdown:focus,.admin__action-dropdown:hover{background-color:#fff;color:#000;text-decoration:none}.admin__action-dropdown:after{right:1.5rem}.admin__action-dropdown:before{margin-right:1rem}.admin__action-dropdown-menu{background-color:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;line-height:1.36;margin-top:-1px;min-width:120%;padding:.5rem 1rem;position:absolute;top:100%;transition:all .15s ease;z-index:1}.admin__action-dropdown-menu>li{display:block}.admin__action-dropdown-menu>li>a{color:#333;display:block;text-decoration:none;padding:.6rem .5rem}.selectmenu{display:inline-block;position:relative;text-align:left;z-index:1}.selectmenu._active{z-index:500;border-color:#007bdb}.selectmenu .action-delete,.selectmenu .action-edit,.selectmenu .action-save{background-color:transparent;border-color:transparent;box-shadow:none;padding:0 1rem}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover,.selectmenu .action-save:hover{background-color:transparent;border-color:transparent;box-shadow:none}.selectmenu .action-delete:before,.selectmenu .action-edit:before,.selectmenu .action-save:before{content:'\e630'}.selectmenu .action-delete,.selectmenu .action-edit{border:0 solid #fff;border-left-width:1px;bottom:0;position:absolute;right:0;top:0;z-index:1}.selectmenu .action-delete:hover,.selectmenu .action-edit:hover{border:0 solid #fff;border-left-width:1px}.selectmenu .action-save:before{content:'\e625'}.selectmenu .action-edit:before{content:'\e631'}.selectmenu-value{display:inline-block}.selectmenu-value input[type=text]{-moz-appearance:none;-webkit-appearance:none;appearance:none;border:0;display:inline;margin:0;width:6rem}body._keyfocus .selectmenu-value input[type=text]:focus{box-shadow:none}.selectmenu-toggle{padding-right:3rem;background:0 0;border-width:0;bottom:0;float:right;position:absolute;right:0;top:0;width:0}.selectmenu-toggle._active:after,.selectmenu-toggle.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.1rem;top:50%;transition:all .2s linear;width:0}._active .selectmenu-toggle:after,.active .selectmenu-toggle:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectmenu-toggle:hover:after{border-color:#000 transparent transparent}.selectmenu-toggle:active,.selectmenu-toggle:focus,.selectmenu-toggle:hover{background:0 0}.selectmenu._active .selectmenu-toggle:before{border-color:#007bdb}body._keyfocus .selectmenu-toggle:focus{box-shadow:none}.selectmenu-toggle:before{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';display:block;position:absolute;right:0;top:0;width:3.2rem}.selectmenu-items{background:#fff;border:1px solid #007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);display:none;float:left;left:-1px;margin-top:3px;max-width:20rem;min-width:calc(100% + 2px);position:absolute;top:100%}.selectmenu-items._active{display:block}.selectmenu-items ul{float:left;list-style-type:none;margin:0;min-width:100%;padding:0}.selectmenu-items li{display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;transition:background .2s linear}.selectmenu-items li:hover{background:#e3e3e3}.selectmenu-items li:last-child .selectmenu-item-action,.selectmenu-items li:last-child .selectmenu-item-action:visited{color:#008bdb;text-decoration:none}.selectmenu-items li:last-child .selectmenu-item-action:hover{color:#0fa7ff;text-decoration:underline}.selectmenu-items li:last-child .selectmenu-item-action:active{color:#ff5501;text-decoration:underline}.selectmenu-item{position:relative;width:100%;z-index:1}li._edit>.selectmenu-item{display:none}.selectmenu-item-edit{display:none;padding:.3rem 4rem .3rem .4rem;position:relative;white-space:nowrap;z-index:1}li:last-child .selectmenu-item-edit{padding-right:.4rem}.selectmenu-item-edit .admin__control-text{width:5.4rem;margin:0}li._edit .selectmenu-item-edit{display:block}.selectmenu-item-action{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:0;color:#333;display:block;font-size:1.4rem;font-weight:400;min-width:100%;padding:1rem 6rem 1rem 1.5rem;text-align:left;transition:background .2s linear;width:5rem}.selectmenu-item-action:focus,.selectmenu-item-action:hover{background:#e3e3e3}.abs-actions-split-xl .action-default,.page-actions .actions-split .action-default{margin-right:4rem}.abs-actions-split-xl .action-toggle,.page-actions .actions-split .action-toggle{padding-right:4rem}.abs-actions-split-xl .action-toggle:after,.page-actions .actions-split .action-toggle:after{border-width:.9rem .6rem 0;margin-top:-.3rem;right:1.4rem}.actions-split{position:relative;z-index:200}.actions-split._active,.actions-split.active,.actions-split:hover{box-shadow:0 0 0 1px #007bdb}.actions-split._active .action-toggle.action-primary,.actions-split._active .action-toggle.primary,.actions-split.active .action-toggle.action-primary,.actions-split.active .action-toggle.primary{background-color:#ba4000;border-color:#ba4000}.actions-split._active .dropdown-menu,.actions-split.active .dropdown-menu{opacity:1;visibility:visible;display:block}.actions-split .action-default,.actions-split .action-toggle{float:left;margin:0}.actions-split .action-default._active,.actions-split .action-default.active,.actions-split .action-default:hover,.actions-split .action-toggle._active,.actions-split .action-toggle.active,.actions-split .action-toggle:hover{box-shadow:none}.actions-split .action-default{margin-right:3.2rem;min-width:9.3rem}.actions-split .action-toggle{padding-right:3.2rem;border-left-color:rgba(0,0,0,.2);bottom:0;padding-left:0;position:absolute;right:0;top:0}.actions-split .action-toggle._active:after,.actions-split .action-toggle.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .actions-split .action-toggle:after,.active .actions-split .action-toggle:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.actions-split .action-toggle:hover:after{border-color:#000 transparent transparent}.actions-split .action-toggle.action-primary:after,.actions-split .action-toggle.action-secondary:after,.actions-split .action-toggle.primary:after,.actions-split .action-toggle.secondary:after{border-color:#fff transparent transparent}.actions-split .action-toggle>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-select-wrap{display:inline-block;position:relative}.action-select-wrap .action-select{padding-right:3.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#fff;font-weight:400;text-align:left}.action-select-wrap .action-select._active:after,.action-select-wrap .action-select.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.2rem;top:50%;transition:all .2s linear;width:0}._active .action-select-wrap .action-select:after,.active .action-select-wrap .action-select:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .action-select:hover:after{border-color:#000 transparent transparent}.action-select-wrap .action-select:hover,.action-select-wrap .action-select:hover:before{border-color:#878787}.action-select-wrap .action-select:before{background-color:#e3e3e3;border:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:3.2rem}.action-select-wrap .action-select._active{border-color:#007bdb}.action-select-wrap .action-select._active:before{border-color:#007bdb #007bdb #007bdb #adadad}.action-select-wrap .action-select[disabled]{color:#333}.action-select-wrap .action-select[disabled]:after{border-color:#333 transparent transparent}.action-select-wrap._active{z-index:500}.action-select-wrap._active .action-select,.action-select-wrap._active .action-select:before{border-color:#007bdb}.action-select-wrap._active .action-select:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-select-wrap .abs-action-menu .action-submenu,.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu,.action-select-wrap .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu,.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu,.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:45rem;overflow-y:auto}.action-select-wrap .action-menu-items{left:0;position:absolute;right:0;top:100%}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu{min-width:100%;position:static}.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.abs-action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu,.action-select-wrap .action-menu-items>.action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .action-menu .action-submenu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu,.action-select-wrap .action-menu-items>.actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{position:absolute}.action-multicheck-wrap{display:inline-block;height:1.6rem;padding-top:1px;position:relative;width:3.1rem;z-index:200}.action-multicheck-wrap:hover .action-multicheck-toggle,.action-multicheck-wrap:hover .admin__control-checkbox+label:before{border-color:#878787}.action-multicheck-wrap._active .action-multicheck-toggle,.action-multicheck-wrap._active .admin__control-checkbox+label:before{border-color:#007bdb}.action-multicheck-wrap._active .abs-action-menu .action-submenu,.action-multicheck-wrap._active .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .action-menu,.action-multicheck-wrap._active .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu,.action-multicheck-wrap._active .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap._active .actions-split .dropdown-menu .action-submenu .action-submenu{opacity:1;visibility:visible;display:block}.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{background-color:#fff}.action-multicheck-wrap._disabled .action-multicheck-toggle,.action-multicheck-wrap._disabled .admin__control-checkbox+label:before{border-color:#adadad;opacity:1}.action-multicheck-wrap .action-multicheck-toggle,.action-multicheck-wrap .admin__control-checkbox,.action-multicheck-wrap .admin__control-checkbox+label{float:left}.action-multicheck-wrap .action-multicheck-toggle{border-radius:0 1px 1px 0;height:1.6rem;margin-left:-1px;padding:0;position:relative;transition:border-color .1s linear;width:1.6rem}.action-multicheck-wrap .action-multicheck-toggle._active:after,.action-multicheck-wrap .action-multicheck-toggle.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:after{border-color:#000 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;top:50%;transition:all .2s linear;width:0}._active .action-multicheck-wrap .action-multicheck-toggle:after,.active .action-multicheck-wrap .action-multicheck-toggle:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.action-multicheck-wrap .action-multicheck-toggle:hover:after{border-color:#000 transparent transparent}.action-multicheck-wrap .action-multicheck-toggle:focus{border-color:#007bdb}.action-multicheck-wrap .action-multicheck-toggle:after{right:.3rem}.action-multicheck-wrap .action-multicheck-toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.action-multicheck-wrap .abs-action-menu .action-submenu,.action-multicheck-wrap .abs-action-menu .action-submenu .action-submenu,.action-multicheck-wrap .action-menu,.action-multicheck-wrap .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu,.action-multicheck-wrap .actions-split .action-menu .action-submenu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu,.action-multicheck-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{left:-1.2rem;margin-top:1px;right:auto;text-align:left}.action-multicheck-wrap .action-menu-item{white-space:nowrap}.admin__action-multiselect-wrap{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.admin__action-multiselect-wrap.action-select-wrap:focus{box-shadow:none}.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .abs-action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .action-menu,.admin__action-multiselect-wrap.action-select-wrap .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .action-menu .action-submenu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu,.admin__action-multiselect-wrap.action-select-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{max-height:none;overflow-y:inherit}.admin__action-multiselect-wrap .action-menu-item{transition:background-color .1s linear}.admin__action-multiselect-wrap .action-menu-item._selected{background-color:#e3e3e3}.admin__action-multiselect-wrap .action-menu-item._hover{background-color:#e0f6fe}.admin__action-multiselect-wrap .admin__action-multiselect{border:1px solid #adadad;cursor:pointer;min-height:3.2rem;padding:.7rem 3.6rem .6rem 1em;white-space:normal}.admin__action-multiselect-wrap .admin__action-multiselect:after{bottom:1.25rem;top:auto}.admin__action-multiselect-wrap .admin__action-multiselect:before{height:3.2rem;top:auto;width:3.2rem}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{text-align:left}.admin__action-multiselect-label{position:relative;z-index:1}.admin__action-multiselect-label:before{margin-right:.5rem}.admin__action-multiselect-search-wrap{margin-bottom:1rem;padding:1rem;position:relative}.admin__action-multiselect-search-wrap+.admin__action-multiselect-menu-inner{border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;margin-bottom:1rem}.admin__action-multiselect-menu-inner{margin-bottom:0;max-height:17.2rem;overflow-y:auto}.admin__action-multiselect-search{padding-right:3rem;width:100%}.admin__action-multiselect-search-label{display:block;font-size:1.5rem;height:1em;overflow:hidden;position:absolute;right:2.2rem;top:1.7rem;width:1em}.admin__action-multiselect-search-label:before{content:'\e60c'}.admin__action-multiselect-actions-wrap{text-align:center}.admin__action-multiselect-actions-wrap .action-default{font-size:1.3rem;min-width:13rem}.admin__action-multiselect-crumb{background-color:#f5f5f5;border:1px solid #a79d95;border-radius:1px;display:inline-block;font-size:1.2rem;margin:-.3rem .9rem .5rem -1.1rem;padding:.3rem 2.4rem .4rem 1rem;position:relative;transition:border-color .1s linear}.admin__action-multiselect-crumb:hover{border-color:#908379}.admin__action-multiselect-crumb .action-close{bottom:0;font-size:.5em;position:absolute;right:0;top:0;width:2rem}.admin__action-multiselect-crumb .action-close:hover{color:#000}.admin__action-multiselect-crumb .action-close:active,.admin__action-multiselect-crumb .action-close:focus{background-color:transparent}.admin__action-multiselect-crumb .action-close:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.abs-action-delete,.abs-action-reset,.action-close,.notifications-close,.search-global-field._active .search-global-action{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0}.abs-action-delete:hover,.abs-action-reset:hover,.action-close:hover,.notifications-close:hover,.search-global-field._active .search-global-action:hover{background-color:transparent;border:none;box-shadow:none}.abs-action-default,.abs-action-pattern,.abs-action-primary,.abs-action-quaternary,.abs-action-secondary,.abs-action-tertiary,.action-default,.action-primary,.action-quaternary,.action-secondary,.action-tertiary,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button,.page-actions>button.action-primary,.page-actions>button.primary,button,button.primary,button.secondary,button.tertiary{border:1px solid;border-radius:0;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:1.36;padding:.6rem 1em;text-align:center;vertical-align:baseline}.abs-action-default.disabled,.abs-action-default[disabled],.abs-action-pattern.disabled,.abs-action-pattern[disabled],.abs-action-primary.disabled,.abs-action-primary[disabled],.abs-action-quaternary.disabled,.abs-action-quaternary[disabled],.abs-action-secondary.disabled,.abs-action-secondary[disabled],.abs-action-tertiary.disabled,.abs-action-tertiary[disabled],.action-default.disabled,.action-default[disabled],.action-primary.disabled,.action-primary[disabled],.action-quaternary.disabled,.action-quaternary[disabled],.action-secondary.disabled,.action-secondary[disabled],.action-tertiary.disabled,.action-tertiary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.disabled,.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions .page-actions-buttons>button[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.disabled,.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],.page-actions>button[disabled],button.disabled,button.primary.disabled,button.primary[disabled],button.secondary.disabled,button.secondary[disabled],button.tertiary.disabled,button.tertiary[disabled],button[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-l,.page-actions .page-actions-buttons>button,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions button,.page-actions>button.action-primary,.page-actions>button.primary{font-size:1.6rem;letter-spacing:.025em;padding-bottom:.6875em;padding-top:.6875em}.abs-action-delete{display:inline-block;font-size:1.6rem;margin-left:1.2rem;padding-top:.7rem;text-decoration:none;vertical-align:middle}.abs-action-delete:after{color:#666;content:'\e630'}.abs-action-delete:hover:after{color:#35302c}.abs-action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.abs-action-default:active,.abs-action-default:focus,.abs-action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.abs-action-primary,.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary,button.primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.abs-action-primary:active,.abs-action-primary:focus,.abs-action-primary:hover,.page-actions .page-actions-buttons>button.action-primary:active,.page-actions .page-actions-buttons>button.action-primary:focus,.page-actions .page-actions-buttons>button.action-primary:hover,.page-actions .page-actions-buttons>button.primary:active,.page-actions .page-actions-buttons>button.primary:focus,.page-actions .page-actions-buttons>button.primary:hover,.page-actions>button.action-primary:active,.page-actions>button.action-primary:focus,.page-actions>button.action-primary:hover,.page-actions>button.primary:active,.page-actions>button.primary:focus,.page-actions>button.primary:hover,button.primary:active,button.primary:focus,button.primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-primary.disabled,.abs-action-primary[disabled],.page-actions .page-actions-buttons>button.action-primary.disabled,.page-actions .page-actions-buttons>button.action-primary[disabled],.page-actions .page-actions-buttons>button.primary.disabled,.page-actions .page-actions-buttons>button.primary[disabled],.page-actions>button.action-primary.disabled,.page-actions>button.action-primary[disabled],.page-actions>button.primary.disabled,.page-actions>button.primary[disabled],button.primary.disabled,button.primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.abs-action-secondary,button.secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.abs-action-secondary:active,.abs-action-secondary:focus,.abs-action-secondary:hover,button.secondary:active,button.secondary:focus,button.secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.abs-action-secondary:active,button.secondary:active{background-color:#35302c}.abs-action-tertiary,button.tertiary{background-color:transparent;border-color:transparent;text-shadow:none;color:#008bdb}.abs-action-tertiary:active,.abs-action-tertiary:focus,.abs-action-tertiary:hover,button.tertiary:active,button.tertiary:focus,button.tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#0fa7ff;text-decoration:underline}.abs-action-quaternary,.page-actions .page-actions-buttons>button,.page-actions>button{background-color:transparent;border-color:transparent;text-shadow:none;color:#333}.abs-action-quaternary:active,.abs-action-quaternary:focus,.abs-action-quaternary:hover,.page-actions .page-actions-buttons>button:active,.page-actions .page-actions-buttons>button:focus,.page-actions .page-actions-buttons>button:hover,.page-actions>button:active,.page-actions>button:focus,.page-actions>button:hover{background-color:transparent;border-color:transparent;box-shadow:none;color:#1a1a1a}.abs-action-menu,.actions-split .abs-action-menu .action-submenu,.actions-split .abs-action-menu .action-submenu .action-submenu,.actions-split .action-menu,.actions-split .action-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.actions-split .dropdown-menu{text-align:left;background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu._active,.actions-split .abs-action-menu .action-submenu .action-submenu._active,.actions-split .abs-action-menu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .action-menu._active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .actions-split .dropdown-menu .action-submenu._active,.actions-split .dropdown-menu._active{display:block}.abs-action-menu>li,.actions-split .abs-action-menu .action-submenu .action-submenu>li,.actions-split .abs-action-menu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .action-menu>li,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .actions-split .dropdown-menu .action-submenu>li,.actions-split .dropdown-menu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu>li>a:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .abs-action-menu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .action-menu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu>li>a:hover{text-decoration:none}.abs-action-menu>li._visible,.abs-action-menu>li:hover,.actions-split .abs-action-menu .action-submenu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu .action-submenu>li:hover,.actions-split .abs-action-menu .action-submenu>li._visible,.actions-split .abs-action-menu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .action-menu>li._visible,.actions-split .action-menu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .actions-split .dropdown-menu .action-submenu>li:hover,.actions-split .dropdown-menu>li._visible,.actions-split .dropdown-menu>li:hover{background-color:#e3e3e3}.abs-action-menu>li:active,.actions-split .abs-action-menu .action-submenu .action-submenu>li:active,.actions-split .abs-action-menu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .action-menu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .actions-split .dropdown-menu .action-submenu>li:active,.actions-split .dropdown-menu>li:active{background-color:#cacaca}.abs-action-menu>li._parent,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent,.actions-split .abs-action-menu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .action-menu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent,.actions-split .dropdown-menu>li._parent{display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.abs-action-menu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .abs-action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-menu-item,.abs-action-menu .item,.actions-split .abs-action-menu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu .item,.actions-split .abs-action-menu .action-submenu .item,.actions-split .action-menu .action-menu-item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .item,.actions-split .action-menu .item,.actions-split .actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .actions-split .dropdown-menu .action-submenu .item,.actions-split .dropdown-menu .action-menu-item,.actions-split .dropdown-menu .item{display:block;padding:.6875em 1em;cursor:pointer}.abs-action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu,.ie9 .actions-split .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu a.action-menu-item,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .abs-action-menu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .action-menu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu a.action-menu-item{color:#333}.abs-action-menu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .abs-action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .action-menu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .actions-split .dropdown-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.abs-action-wrap-triangle{position:relative}.abs-action-wrap-triangle .action-default{width:100%}.abs-action-wrap-triangle .action-default:after,.abs-action-wrap-triangle .action-default:before{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.abs-action-wrap-triangle .action-default:active,.abs-action-wrap-triangle .action-default:focus,.abs-action-wrap-triangle .action-default:hover{box-shadow:none}._keyfocus .abs-action-wrap-triangle .action-default:focus{box-shadow:0 0 0 1px #007bdb}.ie10 .abs-action-wrap-triangle .action-default.disabled,.ie10 .abs-action-wrap-triangle .action-default[disabled],.ie9 .abs-action-wrap-triangle .action-default.disabled,.ie9 .abs-action-wrap-triangle .action-default[disabled]{background-color:#fcfcfc;opacity:1;text-shadow:none}.abs-action-wrap-triangle-right{display:inline-block;padding-right:1.6rem;position:relative}.abs-action-wrap-triangle-right .action-default:after,.abs-action-wrap-triangle-right .action-default:before{border-color:transparent transparent transparent #e3e3e3;border-width:1.7rem 0 1.6rem 1.7rem;left:100%;margin-left:-1.7rem}.abs-action-wrap-triangle-right .action-default:before{border-left-color:#949494;right:-1px}.abs-action-wrap-triangle-right .action-default:active:after,.abs-action-wrap-triangle-right .action-default:focus:after,.abs-action-wrap-triangle-right .action-default:hover:after{border-left-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-right .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-right .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-right .action-default[disabled]:after{border-color:transparent transparent transparent #fcfcfc}.abs-action-wrap-triangle-right .action-primary:after{border-color:transparent transparent transparent #eb5202}.abs-action-wrap-triangle-right .action-primary:active:after,.abs-action-wrap-triangle-right .action-primary:focus:after,.abs-action-wrap-triangle-right .action-primary:hover:after{border-left-color:#ba4000}.abs-action-wrap-triangle-left{display:inline-block;padding-left:1.6rem}.abs-action-wrap-triangle-left .action-default{text-indent:-.85rem}.abs-action-wrap-triangle-left .action-default:after,.abs-action-wrap-triangle-left .action-default:before{border-color:transparent #e3e3e3 transparent transparent;border-width:1.7rem 1.7rem 1.6rem 0;margin-right:-1.7rem;right:100%}.abs-action-wrap-triangle-left .action-default:before{border-right-color:#949494;left:-1px}.abs-action-wrap-triangle-left .action-default:active:after,.abs-action-wrap-triangle-left .action-default:focus:after,.abs-action-wrap-triangle-left .action-default:hover:after{border-right-color:#dbdbdb}.ie10 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie10 .abs-action-wrap-triangle-left .action-default[disabled]:after,.ie9 .abs-action-wrap-triangle-left .action-default.disabled:after,.ie9 .abs-action-wrap-triangle-left .action-default[disabled]:after{border-color:transparent #fcfcfc transparent transparent}.abs-action-wrap-triangle-left .action-primary:after{border-color:transparent #eb5202 transparent transparent}.abs-action-wrap-triangle-left .action-primary:active:after,.abs-action-wrap-triangle-left .action-primary:focus:after,.abs-action-wrap-triangle-left .action-primary:hover:after{border-right-color:#ba4000}.action-default,button{background:#e3e3e3;border-color:#adadad;color:#514943}.action-default:active,.action-default:focus,.action-default:hover,button:active,button:focus,button:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.action-primary{background-color:#eb5202;border-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.action-primary:active,.action-primary:focus,.action-primary:hover{background-color:#ba4000;border-color:#b84002;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-primary.disabled,.action-primary[disabled]{cursor:default;opacity:.5;pointer-events:none}.action-secondary{background-color:#514943;border-color:#514943;color:#fff;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.action-secondary:active,.action-secondary:focus,.action-secondary:hover{background-color:#35302c;border-color:#35302c;box-shadow:0 0 0 1px #007bdb;color:#fff;text-decoration:none}.action-secondary:active{background-color:#35302c}.action-quaternary,.action-tertiary{background-color:transparent;border-color:transparent;text-shadow:none}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover,.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{background-color:transparent;border-color:transparent;box-shadow:none}.action-tertiary{color:#008bdb}.action-tertiary:active,.action-tertiary:focus,.action-tertiary:hover{color:#0fa7ff;text-decoration:underline}.action-quaternary{color:#333}.action-quaternary:active,.action-quaternary:focus,.action-quaternary:hover{color:#1a1a1a}.action-close>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-close:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.action-close:before{content:'\e62f';transition:color .1s linear}.action-close:hover{cursor:pointer;text-decoration:none}.abs-action-menu .action-submenu,.abs-action-menu .action-submenu .action-submenu,.action-menu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{background-color:#fff;border:1px solid #007bdb;border-radius:1px;box-shadow:1px 1px 5px rgba(0,0,0,.5);color:#333;display:none;font-weight:400;left:0;list-style:none;margin:2px 0 0;min-width:0;padding:0;position:absolute;right:0;top:100%}.abs-action-menu .action-submenu .action-submenu._active,.abs-action-menu .action-submenu._active,.action-menu .action-submenu._active,.action-menu._active,.actions-split .action-menu .action-submenu .action-submenu._active,.actions-split .action-menu .action-submenu._active,.actions-split .dropdown-menu .action-submenu .action-submenu._active,.actions-split .dropdown-menu .action-submenu._active{display:block}.abs-action-menu .action-submenu .action-submenu>li,.abs-action-menu .action-submenu>li,.action-menu .action-submenu>li,.action-menu>li,.actions-split .action-menu .action-submenu .action-submenu>li,.actions-split .action-menu .action-submenu>li,.actions-split .dropdown-menu .action-submenu .action-submenu>li,.actions-split .dropdown-menu .action-submenu>li{border:none;display:block;padding:0;transition:background-color .1s linear}.abs-action-menu .action-submenu .action-submenu>li>a:hover,.abs-action-menu .action-submenu>li>a:hover,.action-menu .action-submenu>li>a:hover,.action-menu>li>a:hover,.actions-split .action-menu .action-submenu .action-submenu>li>a:hover,.actions-split .action-menu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li>a:hover,.actions-split .dropdown-menu .action-submenu>li>a:hover{text-decoration:none}.abs-action-menu .action-submenu .action-submenu>li._visible,.abs-action-menu .action-submenu .action-submenu>li:hover,.abs-action-menu .action-submenu>li._visible,.abs-action-menu .action-submenu>li:hover,.action-menu .action-submenu>li._visible,.action-menu .action-submenu>li:hover,.action-menu>li._visible,.action-menu>li:hover,.actions-split .action-menu .action-submenu .action-submenu>li._visible,.actions-split .action-menu .action-submenu .action-submenu>li:hover,.actions-split .action-menu .action-submenu>li._visible,.actions-split .action-menu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu .action-submenu>li:hover,.actions-split .dropdown-menu .action-submenu>li._visible,.actions-split .dropdown-menu .action-submenu>li:hover{background-color:#e3e3e3}.abs-action-menu .action-submenu .action-submenu>li:active,.abs-action-menu .action-submenu>li:active,.action-menu .action-submenu>li:active,.action-menu>li:active,.actions-split .action-menu .action-submenu .action-submenu>li:active,.actions-split .action-menu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu .action-submenu>li:active,.actions-split .dropdown-menu .action-submenu>li:active{background-color:#cacaca}.abs-action-menu .action-submenu .action-submenu>li._parent,.abs-action-menu .action-submenu>li._parent,.action-menu .action-submenu>li._parent,.action-menu>li._parent,.actions-split .action-menu .action-submenu .action-submenu>li._parent,.actions-split .action-menu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent,.actions-split .dropdown-menu .action-submenu>li._parent{display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.abs-action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.abs-action-menu .action-submenu>li._parent>.action-menu-item,.action-menu .action-submenu>li._parent>.action-menu-item,.action-menu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .action-menu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu>li._parent>.action-menu-item,.actions-split .dropdown-menu .action-submenu>li._parent>.action-menu-item{min-width:100%}.abs-action-menu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .action-menu-item,.abs-action-menu .action-submenu .action-submenu .item,.abs-action-menu .action-submenu .item,.action-menu .action-menu-item,.action-menu .action-submenu .action-menu-item,.action-menu .action-submenu .item,.action-menu .item,.actions-split .action-menu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .action-menu-item,.actions-split .action-menu .action-submenu .action-submenu .item,.actions-split .action-menu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu .item,.actions-split .dropdown-menu .action-submenu .item{display:block;padding:.6875em 1em;cursor:pointer}.abs-action-menu .action-submenu .action-submenu,.action-menu .action-submenu,.actions-split .action-menu .action-submenu .action-submenu,.actions-split .dropdown-menu .action-submenu .action-submenu{bottom:auto;left:auto;margin-left:0;margin-top:-1px;position:absolute;right:auto;top:auto}.ie9 .abs-action-menu .action-submenu .action-submenu,.ie9 .abs-action-menu .action-submenu .action-submenu .action-submenu,.ie9 .action-menu .action-submenu,.ie9 .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu,.ie9 .actions-split .action-menu .action-submenu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu,.ie9 .actions-split .dropdown-menu .action-submenu .action-submenu .action-submenu{margin-left:99%;margin-top:-3.5rem}.abs-action-menu .action-submenu .action-submenu a.action-menu-item,.abs-action-menu .action-submenu a.action-menu-item,.action-menu .action-submenu a.action-menu-item,.action-menu a.action-menu-item,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .action-menu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item,.actions-split .dropdown-menu .action-submenu a.action-menu-item{color:#333}.abs-action-menu .action-submenu .action-submenu a.action-menu-item:focus,.abs-action-menu .action-submenu a.action-menu-item:focus,.action-menu .action-submenu a.action-menu-item:focus,.action-menu a.action-menu-item:focus,.actions-split .action-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .action-menu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu .action-submenu a.action-menu-item:focus,.actions-split .dropdown-menu .action-submenu a.action-menu-item:focus{background-color:#e3e3e3;box-shadow:none}.actions-switch{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;height:20px;margin-right:30px;position:relative;width:37px}.actions-switch-label{background:#e3e3e3;border-radius:12px;border:1px solid #aaa6a0;cursor:pointer;display:block;overflow:hidden}.actions-switch-inner{display:block;width:200%;margin-left:-100%;transition:margin .3s ease-in 0s}.actions-switch-inner:after,.actions-switch-inner:before{color:#fff;border-radius:12px;display:block;float:left;height:20px;line-height:22px;padding:0;width:50%}.actions-switch-inner:before{background-color:#79a22e;content:""}.actions-switch-inner:after{content:"";text-align:right}.actions-switch-indicator{background:#fff;border-radius:12px;border:1px solid #aaa6a0;bottom:-2px;display:block;position:absolute;right:15px;top:0;transition:all .3s ease-in 0s;width:22px}.actions-switch-text:after{content:attr(data-label-no);display:block;left:32px;margin-left:12px;position:absolute}.actions-switch-checkbox{display:none}.actions-switch-checkbox:checked+.actions-switch-label .actions-switch-inner{margin-left:0}.actions-switch-checkbox:checked+.actions-switch-label .actions-switch-indicator{right:0}.actions-switch-checkbox:checked+.actions-switch-label .actions-switch-text:after{content:attr(data-label-yes)}.messages .message:last-child{margin:0 0 2rem}.message{background:#fffbbb;border:none;border-radius:0;color:#333;font-size:1.4rem;margin:0 0 1px;padding:1.8rem 4rem 1.8rem 5.5rem;position:relative;text-shadow:none}.message:before{background:0 0;border:0;color:#007bdb;content:'\e61a';font-family:Icons;font-size:1.9rem;font-style:normal;font-weight:400;height:auto;left:1.9rem;line-height:inherit;margin-top:-1.3rem;position:absolute;speak:none;text-shadow:none;top:50%;width:auto}.message-notice:before{color:#007bdb;content:'\e61a'}.message-warning:before{color:#eb5202;content:'\e623'}.message-error{background:#fcc}.message-error:before{color:#e22626;content:'\e632';font-size:1.5rem;left:2.2rem;margin-top:-1rem}.message-success:before{color:#79a22e;content:'\e62d'}.message-spinner:before{display:none}.message-spinner .spinner{font-size:2.5rem;left:1.5rem;position:absolute;top:1.5rem}.message-in-rating-edit{margin-left:1.8rem;margin-right:1.8rem}.modal-popup .action-close,.modal-slide .action-close{color:#736963;position:absolute;right:0;top:0}.modal-popup .action-close:active,.modal-slide .action-close:active{-webkit-transform:none;-ms-transform:none;transform:none}.modal-popup .action-close:active:before,.modal-slide .action-close:active:before{font-size:1.8rem}.modal-popup .action-close:hover:before,.modal-slide .action-close:hover:before{color:#58504b}.modal-popup .action-close:before,.modal-slide .action-close:before{font-size:2rem}.modal-popup .modal-title{font-size:2.4rem;margin-right:6.4rem}.modal-popup .action-close{padding:3rem}.modal-popup .action-close:active,.modal-popup .action-close:focus{background:0 0;padding-right:3.1rem;padding-top:3.1rem}.modal-slide .modal-title{font-size:2.1rem;margin-right:5.7rem}.modal-slide .action-close{padding:2.1rem 2.6rem}.modal-slide .action-close:active{padding-right:2.7rem;padding-top:2.2rem}.modal-slide .page-main-actions{margin-bottom:.6rem;margin-top:2.1rem}.modal-title{font-weight:400;margin-bottom:0;min-height:1em}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}.spinner>span:nth-child(1){-webkit-animation-delay:.27s;animation-delay:.27s;-webkit-transform:rotate(-315deg);-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){-webkit-animation-delay:.36s;animation-delay:.36s;-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){-webkit-animation-delay:.45s;animation-delay:.45s;-webkit-transform:rotate(-225deg);-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){-webkit-animation-delay:.54s;animation-delay:.54s;-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){-webkit-animation-delay:.63s;animation-delay:.63s;-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){-webkit-animation-delay:.72s;animation-delay:.72s;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){-webkit-animation-delay:.81s;animation-delay:.81s;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){-webkit-animation-delay:.9;animation-delay:.9;-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}@-webkit-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span{-webkit-transform:scale(0.4);-ms-transform:scale(0.4);transform:scale(0.4);-webkit-animation-name:fade;animation-name:fade;-webkit-animation-duration:.72s;animation-duration:.72s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-direction:linear;animation-direction:linear;background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.popup-loading{background:rgba(255,255,255,.8);border-color:#ef672f;color:#ef672f;font-size:14px;font-weight:700;left:50%;margin-left:-100px;padding:100px 0 10px;position:fixed;text-align:center;top:40%;width:200px;z-index:1003}.popup-loading:after{background-image:url(../images/loader-1.gif);content:'';height:64px;left:50%;margin:-32px 0 0 -32px;position:absolute;top:40%;width:64px;z-index:2}.loading-mask,.loading-old{background:rgba(255,255,255,.4);bottom:0;left:0;position:fixed;right:0;top:0;z-index:2003}.loading-mask img,.loading-old img{display:none}.loading-mask p,.loading-old p{margin-top:118px}.loading-mask .loader,.loading-old .loader{background:url(../images/loader-1.gif) 50% 30% no-repeat #e5e2dd;border-radius:5px;bottom:0;color:#5e5b56;font-size:14px;font-weight:700;height:160px;left:0;margin:auto;opacity:.95;position:absolute;right:0;text-align:center;top:0;width:160px}.admin-user{float:right;line-height:1.36;margin-left:.3rem;z-index:390}.admin-user._active .admin__action-dropdown,.admin-user.active .admin__action-dropdown{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.admin-user .admin__action-dropdown{height:3.3rem;padding:.7rem 2.8rem .4rem 4rem}.admin-user .admin__action-dropdown._active:after,.admin-user .admin__action-dropdown.active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:after{border-color:#777 transparent transparent;border-style:solid;border-width:.5rem .4rem 0;content:'';height:0;margin-top:-.2rem;position:absolute;right:1.3rem;top:50%;transition:all .2s linear;width:0}._active .admin-user .admin__action-dropdown:after,.active .admin-user .admin__action-dropdown:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.admin-user .admin__action-dropdown:hover:after{border-color:#000 transparent transparent}.admin-user .admin__action-dropdown:before{color:#777;content:'\e600';font-size:2rem;left:1.1rem;margin-top:-1.1rem;position:absolute;top:50%}.admin-user .admin__action-dropdown:hover:before{color:#333}.admin-user .admin__action-dropdown-menu{min-width:20rem;padding-left:1rem;padding-right:1rem}.admin-user .admin__action-dropdown-menu>li>a{padding-right:1.8rem;padding-left:.5em;white-space:nowrap;transition:background-color .1s linear}.admin-user .admin__action-dropdown-menu>li>a:hover{background-color:#e0f6fe;color:#333}.admin-user .admin__action-dropdown-menu>li>a:active{background-color:#c7effd;bottom:-1px;position:relative}.admin-user .admin__action-dropdown-menu .admin-user-name{text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:20rem;overflow:hidden;vertical-align:top}.admin-user-account-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:11.2rem}.search-global{float:right;margin-right:-.3rem;position:relative;z-index:380}.search-global-field{min-width:5rem}.search-global-field._active .search-global-input{background-color:#fff;border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5);padding-right:4rem;width:25rem}.search-global-field._active .search-global-action{display:block;height:3.3rem;position:absolute;right:0;text-indent:-100%;top:0;width:5rem;z-index:3}.search-global-field .autocomplete-results{height:3.3rem;position:absolute;right:0;top:0;width:25rem}.search-global-field .search-global-menu{border:1px solid #007bdb;border-top-color:transparent;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin-top:-2px;padding:0;position:absolute;right:0;top:100%;z-index:2}.search-global-field .search-global-menu:after{background-color:#fff;content:'';height:5px;left:0;position:absolute;right:0;top:-5px}.search-global-field .search-global-menu>li{background-color:#fff;border-top:1px solid #ddd;display:block;font-size:1.2rem;padding:.75rem 1.4rem .55rem}.search-global-field .search-global-menu>li._active{background-color:#e0f6fe}.search-global-field .search-global-menu .title{display:block;font-size:1.4rem}.search-global-field .search-global-menu .type{color:#1a1a1a;display:block}.search-global-label{cursor:pointer;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;z-index:2}.search-global-label:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.search-global-label:hover:before{color:#000}.search-global-label:before{color:#777;content:'\e60c';font-size:2rem}.search-global-input{background-color:transparent;border:1px solid transparent;font-size:1.4rem;height:3.3rem;padding:.75rem 1.4rem .55rem;position:absolute;right:0;top:0;transition:all .1s linear,width .3s linear;width:5rem;z-index:1}.search-global-action{display:none}.notifications-wrapper{float:right;line-height:1;position:relative}.notifications-wrapper.active{z-index:400}.notifications-wrapper.active .notifications-action{border-color:#007bdb;box-shadow:1px 1px 5px rgba(0,0,0,.5)}.notifications-wrapper.active .notifications-action:after{border:none;background-color:#fff;content:'';display:block;height:6px;left:-6px;margin-top:0;position:absolute;right:0;top:100%;width:auto}.notifications-wrapper .admin__action-dropdown-menu{padding:1rem 0 0;width:32rem}.notifications-action{color:#777;height:3.3rem;padding:.75rem 2rem .65rem}.notifications-action:after{display:none}.notifications-action:before{content:'\e607';font-size:1.9rem;margin-right:0}.notifications-action:active:before{position:relative;top:1px}.notifications-action .notifications-counter{background-color:#e22626;border-radius:1em;color:#fff;display:inline-block;font-size:1.1rem;font-weight:700;left:50%;margin-left:.3em;margin-top:-1.1em;padding:.3em .5em;position:absolute;top:50%}.notifications-entry{line-height:1.36;padding:.6rem 2rem .8rem;position:relative;transition:background-color .1s linear}.notifications-entry:hover{background-color:#e0f6fe}.notifications-entry.notifications-entry-last{margin:0 2rem;padding:.3rem 0 1.3rem;text-align:center}.notifications-entry.notifications-entry-last:hover{background-color:transparent}.notifications-entry+.notifications-entry-last{border-top:1px solid #ddd;padding-bottom:.6rem}.notifications-entry ._cutted{cursor:pointer}.notifications-entry ._cutted .notifications-entry-description-start:after{content:'...'}.notifications-entry-title{color:#ef672f;display:block;font-size:1.1rem;font-weight:700;margin-bottom:.7rem;margin-right:1em}.notifications-entry-description{color:#333;font-size:1.1rem;margin-bottom:.8rem}.notifications-entry-description-end{display:none}.notifications-entry-description-end._show{display:inline}.notifications-entry-time{color:#777;font-size:1.1rem}.notifications-close{line-height:1;padding:1rem;position:absolute;right:0;top:.6rem}.notifications-close:before{color:#ccc;content:'\e620';transition:color .1s linear}.notifications-close:hover:before{color:#b3b3b3}.notifications-close:active{-webkit-transform:scale(0.95);-ms-transform:scale(0.95);transform:scale(0.95)}.page-header-actions{padding-top:1.1rem}.page-header-hgroup{padding-right:1.5rem}.page-title{color:#333;font-size:2.8rem}.page-header{padding:1.5rem 3rem}.menu-wrapper{display:inline-block;position:relative;width:8.8rem;z-index:700}.menu-wrapper:before{background-color:#373330;bottom:0;content:'';left:0;position:fixed;top:0;width:8.8rem;z-index:699}.menu-wrapper._fixed{left:0;position:fixed;top:0}.menu-wrapper._fixed~.page-wrapper{margin-left:8.8rem}.menu-wrapper .logo{display:block;height:8.8rem;padding:2.4rem 0 2.2rem;position:relative;text-align:center;z-index:700}._keyfocus .menu-wrapper .logo:focus{background-color:#4a4542;box-shadow:none}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a{background-color:#373330}._keyfocus .menu-wrapper .logo:focus+.admin__menu .level-0:first-child>a:after{display:none}.menu-wrapper .logo:hover .logo-img{-webkit-filter:brightness(1.1);filter:brightness(1.1)}.menu-wrapper .logo:active .logo-img{-webkit-transform:scale(0.95);-ms-transform:scale(0.95);transform:scale(0.95)}.menu-wrapper .logo .logo-img{height:4.2rem;transition:-webkit-filter .2s linear,filter .2s linear,transform .1s linear;width:3.5rem}.abs-menu-separator,.admin__menu .item-partners>a:after,.admin__menu .level-0:first-child>a:after{background-color:#736963;content:'';display:block;height:1px;left:0;margin-left:16%;position:absolute;top:0;width:68%}.admin__menu li{display:block}.admin__menu .level-0:first-child>a{position:relative}.admin__menu .level-0._active>a,.admin__menu .level-0:hover>a{color:#f7f3eb}.admin__menu .level-0._active>a{background-color:#524d49}.admin__menu .level-0:hover>a{background-color:#4a4542}.admin__menu .level-0>a{color:#aaa6a0;display:block;font-size:1rem;letter-spacing:.025em;min-height:6.2rem;padding:1.2rem .5rem .5rem;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;transition:background-color .1s linear;word-wrap:break-word;z-index:700}.admin__menu .level-0>a:focus{box-shadow:none}.admin__menu .level-0>a:before{content:'\e63a';display:block;font-size:2.2rem;height:2.2rem}.admin__menu .level-0>.submenu{background-color:#4a4542;box-shadow:0 0 3px #000;left:100%;min-height:calc(8.8rem + 2rem + 100%);padding:2rem 0 0;position:absolute;top:0;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);transition-property:-webkit-transform,visibility;transition-property:transform,visibility;transition-duration:.3s;transition-timing-function:ease-in-out;visibility:hidden;z-index:697}.admin__menu .level-0._show>.submenu{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);visibility:visible;z-index:698}.admin__menu .level-1{margin-left:1.5rem;margin-right:1.5rem}.admin__menu [class*=level-]:not(.level-0) a{display:block;padding:1.25rem 1.5rem}.admin__menu [class*=level-]:not(.level-0) a:hover{background-color:#403934}.admin__menu [class*=level-]:not(.level-0) a:active{padding-top:1.35rem;padding-bottom:1.15rem;background-color:#322c29}.admin__menu .submenu li{min-width:23.8rem}.admin__menu .submenu a{color:#fcfcfc;transition:background-color .1s linear}.admin__menu .submenu a:focus,.admin__menu .submenu a:hover{box-shadow:none;text-decoration:none}._keyfocus .admin__menu .submenu a:focus{background-color:#403934}._keyfocus .admin__menu .submenu a:active{background-color:#322c29}.admin__menu .submenu .parent{margin-bottom:4.5rem}.admin__menu .submenu .parent .submenu-group-title,.admin__menu .submenu .parent>a{color:#a79d95;display:block;font-size:1.6rem;font-weight:600;margin-bottom:.7rem;padding:1.25rem 1.5rem;pointer-events:none}.admin__menu .submenu .column{display:table-cell}.admin__menu .submenu-title{color:#fff;display:block;font-size:2.2rem;font-weight:600;margin-bottom:4.2rem;margin-left:3rem;margin-right:5.8rem}.admin__menu .submenu-sub-title{color:#fff;display:block;font-size:1.2rem;margin:-3.8rem 5.8rem 3.8rem 3rem}.admin__menu .action-close{padding:2.4rem 2.8rem;position:absolute;right:0;top:0}.admin__menu .action-close:before{color:#a79d95;font-size:1.7rem}.admin__menu .action-close:hover:before{color:#fff}.admin__menu .item-dashboard>a:before{content:'\e604';font-size:1.8rem;padding-top:.4rem}.admin__menu .item-sales>a:before{content:'\e60b'}.admin__menu .item-catalog>a:before{content:'\e608'}.admin__menu .item-customer>a:before{content:'\e603';font-size:2.6rem;position:relative;top:-.4rem}.admin__menu .item-marketing>a:before{content:'\e609';font-size:2rem;padding-top:.2rem}.admin__menu .item-content>a:before{content:'\e602';font-size:2.4rem;position:relative;top:-.2rem}.admin__menu .item-report>a:before{content:'\e60a'}.admin__menu .item-stores>a:before{content:'\e60d';font-size:1.9rem;padding-top:.3rem}.admin__menu .item-system>a:before{content:'\e60e'}.admin__menu .item-partners>a{padding-bottom:1rem}.admin__menu .item-partners>a:before{content:'\e612'}.admin__menu-overlay{bottom:0;left:0;position:fixed;right:0;top:0;z-index:697}.store-switcher{color:#333;float:left;font-size:1.3rem;margin-top:.7rem}.store-switcher .admin__action-dropdown{margin-left:.5em;background-color:#f8f8f8}.store-switcher .dropdown{display:inline-block;position:relative}.store-switcher .dropdown:after,.store-switcher .dropdown:before{content:'';display:table}.store-switcher .dropdown:after{clear:both}.store-switcher .dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e607';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle:active:after,.store-switcher .dropdown .action.toggle:hover:after{color:#333}.store-switcher .dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .dropdown .action.toggle.active:after{-webkit-font-smoothing:antialiased;font-size:22px;line-height:2;color:#333;content:'\e618';font-family:icons-blank-theme;margin:0;vertical-align:top;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.store-switcher .dropdown .action.toggle.active:active:after,.store-switcher .dropdown .action.toggle.active:hover:after{color:#333}.store-switcher .dropdown .dropdown-menu{background:#fff;border:1px solid #ada89e;z-index:100;margin:4px 0 0;padding:0;list-style:none;box-sizing:border-box;position:absolute;top:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);min-width:19.5rem;display:none}.store-switcher .dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .dropdown.active{overflow:visible}.store-switcher .dropdown.active .dropdown-menu{display:block}.store-switcher .dropdown-menu{left:0;margin-top:.5em;padding-top:.25em}.store-switcher .dropdown-menu li{border:0;cursor:default}.store-switcher .dropdown-menu li:hover{cursor:default}.store-switcher .dropdown-menu li a,.store-switcher .dropdown-menu li span{color:#333;display:block;padding:.5rem 1.3rem}.store-switcher .dropdown-menu li a{text-decoration:none}.store-switcher .dropdown-menu li a:hover{background:#e9e9e9}.store-switcher .dropdown-menu li span{color:#adadad;cursor:default}.store-switcher .dropdown-menu li.current span{background:#eee;color:#333}.store-switcher .dropdown-menu .store-switcher-store a,.store-switcher .dropdown-menu .store-switcher-store span{padding-left:2.6rem}.store-switcher .dropdown-menu .store-switcher-store-view a,.store-switcher .dropdown-menu .store-switcher-store-view span{padding-left:3.9rem}.store-switcher .dropdown-menu .dropdown-toolbar{border-top:1px solid #ebebeb;margin-top:1rem}.store-switcher .dropdown-menu .dropdown-toolbar a:before{content:'\e60e';margin-right:.25em;position:relative;top:1px}.store-switcher-label{font-weight:700}.store-switcher-alt{display:inline-block;position:relative}.store-switcher-alt.active .dropdown-menu{display:block}.store-switcher-alt .dropdown-menu{margin-top:2px;white-space:nowrap}.store-switcher-alt .dropdown-menu ul{list-style:none;margin:0;padding:0}.store-switcher-alt strong{color:#a6a098;display:block;font-size:14px;font-weight:500;line-height:1.333;padding:5px 10px}.store-switcher-alt .store-selected{color:#676056;cursor:pointer;font-size:12px;font-weight:400;line-height:1.333}.store-switcher-alt .store-selected:after{color:#b3b0ad;content:'\e02c';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;margin:0 0 0 3px;speak:none;vertical-align:text-top}.store-switcher-alt .store-switcher-store,.store-switcher-alt .store-switcher-website{padding:0}.store-switcher-alt .store-switcher-store:hover,.store-switcher-alt .store-switcher-website:hover{background:0 0}.store-switcher-alt .manage-stores,.store-switcher-alt .store-switcher-all,.store-switcher-alt .store-switcher-store-view{padding:0}.store-switcher-alt .manage-stores>a,.store-switcher-alt .store-switcher-all>a{color:#676056;display:block;font-size:12px;padding:8px 15px;text-decoration:none}.store-switcher-website{margin:5px 0 0}.store-switcher-website>strong{padding-left:13px}.store-switcher-store{margin:1px 0 0}.store-switcher-store>strong{padding-left:20px}.store-switcher-store>ul{margin-top:1px}.store-switcher-store-view:first-child{border-top:1px solid #e5e5e5}.store-switcher-store-view>a{color:#333;display:block;font-size:13px;padding:5px 15px 5px 24px;text-decoration:none}.tooltip{margin-left:.5em}.tooltip .help a,.tooltip .help span{cursor:pointer;display:inline-block;height:22px;position:relative;vertical-align:middle;width:22px;z-index:2}.tooltip .help a:before,.tooltip .help span:before{color:#333;content:'\e633';font-size:1.7rem}.tooltip .help a span,.tooltip .help span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.tooltip .help a:hover{text-decoration:none}.tooltip .tooltip-content{background:#000;border-radius:3px;color:#fff;display:none;margin-left:-19px;margin-top:10px;max-width:200px;padding:4px 8px;position:absolute;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{border-bottom:5px solid #000;border-left:5px solid transparent;border-right:5px solid transparent;content:'';height:0;left:20px;opacity:.8;position:absolute;top:-5px;width:0}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}.page-actions._fixed,.page-main-actions:not(._hidden){background:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;padding:1.5rem}.page-main-actions{margin:0 0 3rem}.page-main-actions._hidden .store-switcher{display:none}.page-actions{float:right}.page-main-actions .page-actions._fixed{left:8.8rem;position:fixed;right:0;top:0;z-index:400}.page-main-actions .page-actions._fixed .page-actions-inner:before{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333;content:attr(data-title);float:left;font-size:2.8rem;margin-top:.3rem;max-width:50%}.page-actions .page-actions-buttons>button,.page-actions>button{float:right;margin-left:1.3rem}.page-actions .page-actions-buttons>button.action-back,.page-actions .page-actions-buttons>button.back,.page-actions>button.action-back,.page-actions>button.back{float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1}.page-actions .page-actions-buttons>button.action-back:before,.page-actions .page-actions-buttons>button.back:before,.page-actions>button.action-back:before,.page-actions>button.back:before{content:'\e626';margin-right:.5em;position:relative;top:1px}.page-actions .page-actions-buttons>button.action-primary,.page-actions .page-actions-buttons>button.primary,.page-actions>button.action-primary,.page-actions>button.primary{-ms-flex-order:2;-webkit-order:2;order:2}.page-actions .page-actions-buttons>button.save:not(.primary),.page-actions>button.save:not(.primary){-ms-flex-order:1;-webkit-order:1;order:1}.page-actions .page-actions-buttons>button.delete,.page-actions>button.delete{-ms-flex-order:-1;-webkit-order:-1;order:-1}.page-actions .actions-split{float:right;margin-left:1.3rem;-ms-flex-order:2;-webkit-order:2;order:2}.page-actions .actions-split .dropdown-menu .item{display:block}.page-actions-buttons{float:right;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;display:-webkit-flex;display:-ms-flexbox;display:flex}.customer-index-edit .page-actions-buttons{background-color:transparent}.admin__page-nav{background:#f1f1f1;border:1px solid #e3e3e3}.admin__page-nav._collapsed:first-child{border-bottom:none}.admin__page-nav._collapsed._show{border-bottom:1px solid #e3e3e3}.admin__page-nav._collapsed._show ._collapsible{background:#f1f1f1}.admin__page-nav._collapsed._show ._collapsible:after{content:'\e62b'}.admin__page-nav._collapsed._show ._collapsible+.admin__page-nav-items{display:block}.admin__page-nav._collapsed._hide .admin__page-nav-title-messages,.admin__page-nav._collapsed._hide .admin__page-nav-title-messages ._active{display:inline-block}.admin__page-nav+._collapsed{border-bottom:none;border-top:none}.admin__page-nav-title{border-bottom:1px solid #e3e3e3;color:#303030;display:block;font-size:1.4rem;line-height:1.2;margin:0 0 -1px;padding:1.8rem 1.5rem;position:relative;text-transform:uppercase}.admin__page-nav-title._collapsible{background:#fff;cursor:pointer;margin:0;padding-right:3.5rem;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-title._collapsible+.admin__page-nav-items{display:none;margin-top:-1px}.admin__page-nav-title._collapsible:after{content:'\e628';font-size:1.3rem;font-weight:700;position:absolute;right:1.8rem;top:2rem}.admin__page-nav-title._collapsible:hover{background:#f1f1f1}.admin__page-nav-title._collapsible:last-child{margin:0 0 -1px}.admin__page-nav-title strong{font-weight:700}.admin__page-nav-title .admin__page-nav-title-messages{display:none}.admin__page-nav-items{list-style-type:none;margin:0;padding:1rem 0 1.3rem}.admin__page-nav-item{border-left:3px solid transparent;margin-left:.7rem;padding:0;position:relative;transition:border-color .1s ease-out,background-color .1s ease-out}.admin__page-nav-item:hover{border-color:#e4e4e4}.admin__page-nav-item:hover .admin__page-nav-link{background:#e4e4e4;color:#303030;text-decoration:none}.admin__page-nav-item._active,.admin__page-nav-item.ui-state-active{border-color:#eb5202}.admin__page-nav-item._active .admin__page-nav-link,.admin__page-nav-item.ui-state-active .admin__page-nav-link{background:#fff;border-color:#e3e3e3;border-right:1px solid #fff;color:#303030;margin-right:-1px;font-weight:600}.admin__page-nav-item._loading:before,.admin__page-nav-item.ui-tabs-loading:before{display:none}.admin__page-nav-item._loading .admin__page-nav-item-message-loader,.admin__page-nav-item.ui-tabs-loading .admin__page-nav-item-message-loader{display:inline-block}.admin__page-nav-link{border:1px solid transparent;border-width:1px 0;color:#303030;display:block;font-weight:500;line-height:1.2;margin:0 0 -1px;padding:2rem 4rem 2rem 1rem;transition:border-color .1s ease-out,background-color .1s ease-out;word-wrap:break-word}.admin__page-nav-item-messages,.admin__page-nav-link._changed .admin__page-nav-item-message._changed,.admin__page-nav-link._error .admin__page-nav-item-message._error{display:inline-block}.admin__page-nav-item-messages .admin__page-nav-item-message{position:relative}.admin__page-nav-item-messages .admin__page-nav-item-message:hover{z-index:500}.admin__page-nav-item-messages .admin__page-nav-item-message:hover .admin__page-nav-item-message-tooltip{display:block}.admin__page-nav-item-messages .admin__page-nav-item-message._changed,.admin__page-nav-item-messages .admin__page-nav-item-message._error{display:none}.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon{display:inline-block;font-size:1.4rem;padding-left:.8em;vertical-align:top}.admin__page-nav-item-messages .admin__page-nav-item-message._changed .admin__page-nav-item-message-icon:after,.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon:after{color:#666;content:'\e631'}.admin__page-nav-item-messages .admin__page-nav-item-message._error .admin__page-nav-item-message-icon:after{color:#eb5202;content:'\e623'}.admin__page-nav-item-messages .admin__page-nav-item-message-loader{display:none;margin-top:-1rem;position:absolute;right:0;top:50%}.admin__page-nav-item-messages .admin__page-nav-item-message-loader .spinner{font-size:2rem;margin-right:1.5rem}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip{background:#f1f1f1;border:1px solid #f1f1f1;border-radius:1px;bottom:3.7rem;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;left:-1rem;line-height:1.36;padding:2rem;position:absolute;text-transform:none;width:27rem;word-break:normal;z-index:2}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after,.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border:15px solid transparent;height:0;width:0;border-top-color:#f1f1f1;content:'';display:block;left:2rem;position:absolute;top:100%;z-index:3}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:after{border-top-color:#f1f1f1;margin-top:-1px;z-index:4}.admin__page-nav-item-messages .admin__page-nav-item-message-tooltip:before{border-top-color:#bfbfbf}.admin__data-grid-wrap-static .data-grid{box-sizing:border-box}.admin__data-grid-wrap-static .data-grid thead{color:#333}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td{background-color:#f5f5f5}.admin__data-grid-wrap-static .data-grid tr:nth-child(even) td._dragging{background-color:rgba(245,245,245,.95)}.admin__data-grid-wrap-static .data-grid ul{padding-left:1rem;margin-left:1rem}.admin__data-grid-wrap-static .admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:0;position:absolute;right:0;top:0;z-index:401}.admin__data-grid-wrap-static .admin__data-grid-loading-mask .grid-loader{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-filters-actions-wrap{float:right}.data-grid-search-control-wrap{float:left;max-width:45.5rem;position:relative;width:50%}.data-grid-search-control-wrap :-ms-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-webkit-input-placeholder{font-style:italic}.data-grid-search-control-wrap ::-moz-placeholder{font-style:italic}.data-grid-search-control-wrap .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:.6rem 2rem .2rem;position:absolute;right:0;top:1px}.data-grid-search-control-wrap .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.data-grid-search-control-wrap .action-submit:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.data-grid-search-control-wrap .action-submit:hover:before{color:#1a1a1a}._keyfocus .data-grid-search-control-wrap .action-submit:focus{box-shadow:0 0 0 1px #008bdb}.data-grid-search-control-wrap .action-submit:before{content:'\e60c';font-size:2rem;transition:color .1s linear}.data-grid-search-control-wrap .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.data-grid-search-control-wrap .abs-action-menu .action-submenu,.data-grid-search-control-wrap .abs-action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .action-menu,.data-grid-search-control-wrap .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu,.data-grid-search-control-wrap .actions-split .action-menu .action-submenu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu,.data-grid-search-control-wrap .actions-split .dropdown-menu .action-submenu .action-submenu{z-index:400;max-height:19.25rem;overflow-y:auto}.data-grid-search-control-wrap .action-menu-item._selected{background-color:#e0f6fe}.data-grid-search-control-wrap .data-grid-search-label{display:none}.data-grid-search-control{padding-right:6rem;width:100%}.data-grid-filters-action-wrap{float:left;padding-left:2rem}.data-grid-filters-action-wrap .action-default{font-size:1.3rem;margin-bottom:1rem;padding-left:1.7rem;padding-right:2.1rem;padding-top:.7rem}.data-grid-filters-action-wrap .action-default._active{background-color:#fff;border-bottom-color:#fff;border-right-color:#ccc;font-weight:600;margin:-.1rem 0 0;padding-bottom:1.6rem;padding-top:.8rem;position:relative;z-index:281}.data-grid-filters-action-wrap .action-default._active:after{background-color:#eb5202;bottom:100%;content:'';height:3px;left:-1px;position:absolute;right:-1px}.data-grid-filters-action-wrap .action-default:before{color:#333;content:'\e605';font-size:1.8rem;margin-right:.4rem;position:relative;top:-1px;vertical-align:top}.data-grid-filters-action-wrap .filters-active{display:none}.admin__data-grid-filters-wrap{opacity:0;visibility:hidden;clear:both;font-size:1.3rem;transition:opacity .3s ease}.admin__data-grid-filters-wrap._show{opacity:1;visibility:visible;border-bottom:1px solid #ccc;border-top:1px solid #ccc;margin-bottom:.7rem;padding:3.6rem 0 3rem;position:relative;top:-1px;z-index:280}.admin__data-grid-filters-wrap._show .admin__data-grid-filters,.admin__data-grid-filters-wrap._show .admin__data-grid-filters-footer{display:block}.admin__data-grid-filters-wrap .admin__form-field-label,.admin__data-grid-filters-wrap .admin__form-field-legend{display:block;font-weight:700;margin:0 0 .3rem;text-align:left}.admin__data-grid-filters-wrap .admin__form-field{display:inline-block;margin-bottom:2em;margin-left:0;padding-left:2rem;padding-right:2rem;vertical-align:top;width:calc(100% / 4 - 4px)}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field{display:block;float:none;margin-bottom:1.5rem;padding-left:0;padding-right:0;width:auto}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field:last-child{margin-bottom:0}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-label{border:1px solid transparent;float:left;font-weight:400;line-height:1.36;margin-bottom:0;padding-bottom:.6rem;padding-right:1em;padding-top:.6rem;width:25%}.admin__data-grid-filters-wrap .admin__form-field .admin__form-field .admin__form-field-control{margin-left:25%}.admin__data-grid-filters-wrap .admin__action-multiselect,.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text,.admin__data-grid-filters-wrap .admin__form-field-label{font-size:1.3rem}.admin__data-grid-filters-wrap .admin__control-select{padding-top:.5rem;height:3.2rem}.admin__data-grid-filters-wrap .admin__control-select,.admin__data-grid-filters-wrap .admin__control-text.hasDatepicker{width:100%}.admin__data-grid-filters{display:none;margin-left:-2rem;margin-right:-2rem}.admin__filters-legend{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-filters-footer{display:none;font-size:1.4rem}.admin__data-grid-filters-footer .admin__footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-filters-footer .admin__footer-secondary-actions{float:left;width:50%}.admin__data-grid-filters-current{border-bottom:.1rem solid #ccc;border-top:.1rem solid #ccc;display:none;font-size:1.3rem;margin-bottom:.9rem;padding-bottom:.8rem;padding-top:1.1rem;width:100%}.admin__data-grid-filters-current._show{display:table;position:relative;top:-1px;z-index:3}.admin__data-grid-filters-current._show+.admin__data-grid-filters-wrap._show{margin-top:-1rem}.admin__current-filters-actions-wrap,.admin__current-filters-list-wrap,.admin__current-filters-title-wrap{display:table-cell;vertical-align:top}.admin__current-filters-title{margin-right:1em;white-space:nowrap}.admin__current-filters-list-wrap{width:100%}.admin__current-filters-list{margin-bottom:0}.admin__current-filters-list>li{display:inline-block;font-weight:600;margin:0 1rem .5rem;padding-right:2.6rem;position:relative}.admin__current-filters-list .action-remove{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;padding:0;line-height:1;position:absolute;right:0;top:1px}.admin__current-filters-list .action-remove:hover{background-color:transparent;border:none;box-shadow:none}.admin__current-filters-list .action-remove:hover:before{color:#949494}.admin__current-filters-list .action-remove:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.admin__current-filters-list .action-remove:before{color:#adadad;content:'\e620';font-size:1.6rem;transition:color .1s linear}.admin__current-filters-list .action-remove>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__current-filters-actions-wrap .action-clear{border:none;padding-bottom:0;padding-top:0;white-space:nowrap}.admin__data-grid-pager-wrap{text-align:right}.admin__data-grid-pager{display:inline-block;margin-left:3rem}.admin__data-grid-pager .admin__control-text::-webkit-inner-spin-button,.admin__data-grid-pager .admin__control-text::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.admin__data-grid-pager .admin__control-text{-moz-appearance:textfield;text-align:center;width:4.4rem}.action-next,.action-previous{width:4.4rem}.action-next:before,.action-previous:before{font-weight:700}.action-next>span,.action-previous>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.action-previous{margin-right:2.5rem;text-indent:-.25em}.action-previous:before{content:'\e629'}.action-next{margin-left:1.5rem;text-indent:.1em}.action-next:before{content:'\e62a'}.admin__data-grid-action-bookmarks{opacity:.98}.admin__data-grid-action-bookmarks .admin__action-dropdown-text:after{right:-6px;left:0}.admin__data-grid-action-bookmarks._active{z-index:290}.admin__data-grid-action-bookmarks .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;max-width:15rem;min-width:4.9rem;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown:before{content:'\e60f'}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu{font-size:1.3rem;left:0;padding:1rem 0;right:auto}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li{padding:0 5rem 0 0;position:relative;white-space:nowrap}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action){transition:background-color .1s linear}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu>li:not(.action-dropdown-menu-action):hover{background-color:#e3e3e3}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item{max-width:23rem;min-width:18rem;white-space:normal;word-break:break-all}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit{display:none;padding-bottom:1rem;padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-edit .action-dropdown-menu-item-actions{padding-bottom:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action{padding-left:1rem;padding-top:1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action+.action-dropdown-menu-item-last{padding-top:.5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a{color:#008bdb;text-decoration:none;display:inline-block;padding-left:1.1rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-action>a:hover{color:#0fa7ff;text-decoration:underline}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-last{padding-bottom:0}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item{display:none}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._edit .action-dropdown-menu-item-edit{display:block}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu ._active .action-dropdown-menu-link{font-weight:600}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{font-size:1.3rem;min-width:15rem;width:calc(100% - 4rem)}.ie9 .admin__data-grid-action-bookmarks .admin__action-dropdown-menu .admin__control-text{width:15rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-item-actions{border-left:1px solid #fff;bottom:0;position:absolute;right:0;top:0;width:5rem}.admin__data-grid-action-bookmarks .admin__action-dropdown-menu .action-dropdown-menu-link{color:#333;display:block;text-decoration:none;padding:1rem 1rem 1rem 2.1rem}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit,.admin__data-grid-action-bookmarks .action-submit{background-color:transparent;border:none;border-radius:0;box-shadow:none;margin:0;vertical-align:top}.admin__data-grid-action-bookmarks .action-delete:hover,.admin__data-grid-action-bookmarks .action-edit:hover,.admin__data-grid-action-bookmarks .action-submit:hover{background-color:transparent;border:none;box-shadow:none}.admin__data-grid-action-bookmarks .action-delete:before,.admin__data-grid-action-bookmarks .action-edit:before,.admin__data-grid-action-bookmarks .action-submit:before{font-size:1.7rem}.admin__data-grid-action-bookmarks .action-delete>span,.admin__data-grid-action-bookmarks .action-edit>span,.admin__data-grid-action-bookmarks .action-submit>span{clip:rect(0,0,0,0);overflow:hidden;position:absolute}.admin__data-grid-action-bookmarks .action-delete,.admin__data-grid-action-bookmarks .action-edit{padding:.6rem 1.4rem}.admin__data-grid-action-bookmarks .action-delete:active,.admin__data-grid-action-bookmarks .action-edit:active{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)}.admin__data-grid-action-bookmarks .action-submit{padding:.6rem 1rem .6rem .8rem}.admin__data-grid-action-bookmarks .action-submit:active{position:relative;right:-1px}.admin__data-grid-action-bookmarks .action-submit:before{content:'\e625'}.admin__data-grid-action-bookmarks .action-delete:before{content:'\e630'}.admin__data-grid-action-bookmarks .action-edit{padding-top:.8rem}.admin__data-grid-action-bookmarks .action-edit:before{content:'\e631'}.admin__data-grid-action-columns._active{opacity:.98;z-index:290}.admin__data-grid-action-columns .admin__action-dropdown:before{content:'\e60e';font-size:1.8rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-columns-menu{color:#303030;font-size:1.3rem;overflow:hidden;padding:2.2rem 3.5rem 1rem;z-index:1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-header{border-bottom:1px solid #d1d1d1}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-content{width:49.2rem}.admin__data-grid-action-columns-menu._overflow .admin__action-dropdown-menu-footer{border-top:1px solid #d1d1d1;padding-top:2.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-content{max-height:22.85rem;overflow-y:auto;padding-top:1.5rem;position:relative;width:47.4rem}.admin__data-grid-action-columns-menu .admin__field-option{height:1.9rem;float:left;margin-bottom:1.5rem;padding:0 1rem 0 0;width:15.8rem}.admin__data-grid-action-columns-menu .admin__field-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-header{padding-bottom:1.5rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-menu-footer{padding:1rem 0 2rem}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-main-actions{margin-left:25%;text-align:right}.admin__data-grid-action-columns-menu .admin__action-dropdown-footer-secondary-actions{float:left;margin-left:-1em}.admin__data-grid-action-export._active{opacity:.98;z-index:290}.admin__data-grid-action-export .admin__action-dropdown:before{content:'\e635';font-size:1.7rem;left:.3rem;margin-right:.7rem;vertical-align:top}.admin__data-grid-action-export-menu{padding-left:2rem;padding-right:2rem;padding-top:1rem}.admin__data-grid-action-export-menu .admin__action-dropdown-footer-main-actions{padding-bottom:2rem;padding-top:2.5rem;white-space:nowrap}.sticky-header{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:8.8rem;right:0;margin-top:-1px;padding:.5rem 3rem 0;position:fixed;top:77px;z-index:400}.sticky-header .admin__data-grid-wrap{margin-bottom:0;overflow-x:visible;padding-bottom:0}.sticky-header .admin__data-grid-header-row{position:relative;text-align:right}.sticky-header .admin__data-grid-header-row:last-child{margin:0}.sticky-header .admin__data-grid-actions-wrap,.sticky-header .admin__data-grid-filters-wrap,.sticky-header .admin__data-grid-pager-wrap,.sticky-header .data-grid-filters-actions-wrap,.sticky-header .data-grid-search-control-wrap{display:inline-block;float:none;vertical-align:top}.sticky-header .action-select-wrap{float:left;margin-right:1.5rem;width:16.66666667%}.sticky-header .admin__control-support-text{float:left}.sticky-header .data-grid-search-control-wrap{margin:-.5rem 0 0 1.1rem;width:auto}.sticky-header .data-grid-search-control-wrap .data-grid-search-label{box-sizing:border-box;cursor:pointer;display:block;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;position:relative;text-align:center}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:before{color:#333;content:'\e60c';font-size:2rem;transition:color .1s linear}.sticky-header .data-grid-search-control-wrap .data-grid-search-label:hover:before{color:#000}.sticky-header .data-grid-search-control-wrap .data-grid-search-label span{display:none}.sticky-header .data-grid-filters-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-left:0;position:relative}.sticky-header .data-grid-filters-actions-wrap .action-default{background-color:transparent;border:1px solid transparent;box-sizing:border-box;min-width:3.8rem;padding:1.2rem .6rem 1.7rem;text-align:center;transition:all .15s ease}.sticky-header .data-grid-filters-actions-wrap .action-default span{display:none}.sticky-header .data-grid-filters-actions-wrap .action-default:before{margin:0}.sticky-header .data-grid-filters-actions-wrap .action-default._active{background-color:#fff;border-color:#adadad #adadad #fff;box-shadow:1px 1px 5px rgba(0,0,0,.5);z-index:210}.sticky-header .data-grid-filters-actions-wrap .action-default._active:after{background-color:#fff;content:'';height:6px;left:-2px;position:absolute;right:-6px;top:100%}.sticky-header .data-grid-filters-action-wrap{padding:0}.sticky-header .admin__data-grid-filters-wrap{background-color:#fff;border:1px solid #adadad;box-shadow:0 5px 5px 0 rgba(0,0,0,.25);left:0;padding-left:3.5rem;padding-right:3.5rem;position:absolute;top:100%;width:100%;z-index:209}.sticky-header .admin__data-grid-filters-current+.admin__data-grid-filters-wrap._show{margin-top:-6px}.sticky-header .filters-active{background-color:#e04f00;border-radius:10px;color:#fff;display:block;font-size:1.4rem;font-weight:700;padding:.1rem .7rem;position:absolute;right:-7px;top:0;z-index:211}.sticky-header .filters-active:empty{padding-top:0;padding-bottom:0}.sticky-header .admin__data-grid-actions-wrap{margin:-.5rem 0 0 1.1rem;padding-right:.3rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown{background-color:transparent;box-sizing:border-box;min-width:3.8rem;padding-left:.6rem;padding-right:.6rem;text-align:center}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown .admin__action-dropdown-text{display:inline-block;min-width:0;max-width:0;overflow:hidden}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:before{margin:0}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap{margin-right:1.1rem}.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after,.sticky-header .admin__data-grid-actions-wrap .admin__action-dropdown:after{display:none}.sticky-header .admin__data-grid-actions-wrap ._active .admin__action-dropdown{background-color:#fff}.sticky-header .admin__data-grid-action-bookmarks .admin__action-dropdown:before{position:relative;top:-3px}.sticky-header .admin__data-grid-filters-current{border-top:0;border-bottom:0;margin-bottom:0;padding-bottom:0;padding-top:0}.sticky-header .admin__data-grid-pager .admin__control-text,.sticky-header .admin__data-grid-pager-wrap .admin__control-support-text,.sticky-header .data-grid-search-control-wrap .action-submit,.sticky-header .data-grid-search-control-wrap .data-grid-search-control{display:none}.sticky-header .action-next{margin:0}.sticky-header .data-grid{margin-bottom:-1px}.data-grid-cap-left,.data-grid-cap-right{background-color:#f8f8f8;bottom:-2px;position:absolute;top:6rem;width:3rem;z-index:201}.data-grid-cap-left{left:0}.data-grid-cap-right{right:0}.admin__data-grid-header{font-size:1.4rem}.admin__data-grid-header-row+.admin__data-grid-header-row{margin-top:1.1rem}.admin__data-grid-header-row:last-child{margin-bottom:0}.admin__data-grid-header-row .action-select-wrap{display:block}.admin__data-grid-header-row .action-select{width:100%}.admin__data-grid-actions-wrap{float:right;margin-left:1.1rem;margin-top:-.5rem;text-align:right}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap{position:relative;text-align:left}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._hide+.admin__action-dropdown-wrap:after,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:first-child:after{display:none}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown,.admin__data-grid-actions-wrap .admin__action-dropdown-wrap._active .admin__action-dropdown-menu{border-color:#adadad}.admin__data-grid-actions-wrap .admin__action-dropdown-wrap:after{border-left:1px solid #ccc;content:'';height:3.2rem;left:0;position:absolute;top:.5rem;z-index:3}.admin__data-grid-actions-wrap .admin__action-dropdown{padding-bottom:1.7rem;padding-top:1.2rem}.admin__data-grid-actions-wrap .admin__action-dropdown:after{margin-top:-.4rem}.admin__data-grid-outer-wrap{min-height:8rem;position:relative}.admin__data-grid-wrap{margin-bottom:2rem;max-width:100%;overflow-x:auto;padding-bottom:1rem;padding-top:2rem}.admin__data-grid-loading-mask{background:rgba(255,255,255,.5);bottom:0;left:-3rem;position:absolute;right:-3rem;top:0;z-index:401}.admin__data-grid-loading-mask .spinner{font-size:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%}.ie9 .admin__data-grid-loading-mask .spinner{background:url(../images/loader-2.gif) 50% 50% no-repeat;bottom:0;height:149px;left:0;margin:auto;position:absolute;right:0;top:0;width:218px}.data-grid-cell-content{overflow:hidden;width:100%;display:inline-block}body._in-resize{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:col-resize}body._in-resize *,body._in-resize .data-grid-th,body._in-resize .data-grid-th._draggable,body._in-resize .data-grid-th._sortable{cursor:col-resize!important}._layout-fixed{table-layout:fixed}.data-grid{border:none;font-size:1.3rem;margin-bottom:0;max-width:100%;width:100%}.data-grid:not(._dragging-copy) ._odd-row td._dragging{background-color:#d0d0d0}.data-grid:not(._dragging-copy) ._dragging{background-color:#d9d9d9;color:rgba(48,48,48,.95)}.data-grid:not(._dragging-copy) ._dragging a{color:rgba(0,139,219,.95)}.data-grid:not(._dragging-copy) ._dragging a:hover{color:rgba(15,167,255,.95)}.data-grid thead{background-color:transparent}.data-grid tfoot th{padding:1rem}.data-grid tr._odd-row td{background-color:#f5f5f5}.data-grid tr.data-grid-tr-no-data:hover td{background-color:#fff;cursor:default}.data-grid tr:active td{background-color:#e0f6fe}.data-grid tr:hover td{background-color:#e5f7fe}.data-grid tr:not(.data-grid-editable-row):last-child td{border-bottom:.1rem solid #d6d6d6}.data-grid tr ._clickable,.data-grid tr._clickable{cursor:pointer}.data-grid td,.data-grid th{font-size:1.3rem;line-height:1.36;transition:background-color .1s linear;vertical-align:top}.data-grid td._resizing,.data-grid th._resizing{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid td{background-color:#fff;border-left:.1rem dashed #d6d6d6;border-right:.1rem dashed #d6d6d6;color:#303030;padding:1rem}.data-grid td:first-child{border-left-style:solid}.data-grid td:last-child{border-right-style:solid}.data-grid td .action-select-wrap{position:static}.data-grid td .action-select{background-color:transparent;border:none;font-size:1.3rem;position:relative;color:#008bdb;text-decoration:none;padding:0 3rem 0 0}.data-grid td .action-select:hover{color:#0fa7ff;text-decoration:underline}.data-grid td .action-select:hover:after{border-color:#0fa7ff transparent transparent}.data-grid td .action-select:after{border-color:#008bdb transparent transparent;margin:.6rem 0 0 .7rem;right:auto;top:auto}.data-grid td .action-select:before{display:none}.data-grid td .abs-action-menu .action-submenu,.data-grid td .abs-action-menu .action-submenu .action-submenu,.data-grid td .action-menu,.data-grid td .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu,.data-grid td .actions-split .action-menu .action-submenu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu,.data-grid td .actions-split .dropdown-menu .action-submenu .action-submenu{left:auto;min-width:10rem;right:0;text-align:left;top:auto;z-index:1}.data-grid th{background-color:#514943;border:.1rem solid #8a837f;border-left-color:transparent;color:#fff;font-weight:600;padding:0;text-align:left}.data-grid th:first-child{border-left-color:#8a837f}.data-grid th._dragover-left{box-shadow:inset 3px 0 0 0 #fff;z-index:2}.data-grid th._dragover-right{box-shadow:inset -3px 0 0 0 #fff}.data-grid .shadow-div{cursor:col-resize;height:100%;margin-right:-5px;position:absolute;right:0;top:0;width:10px}.data-grid .data-grid-th{background-clip:padding-box;color:#fff;padding:1rem;position:relative;vertical-align:middle}.data-grid .data-grid-th._resize-visible .shadow-div{cursor:auto;display:none}.data-grid .data-grid-th._draggable{cursor:-webkit-grab;cursor:grab}.data-grid .data-grid-th._sortable{cursor:pointer;transition:background-color .1s linear;z-index:1}.data-grid .data-grid-th._sortable:focus,.data-grid .data-grid-th._sortable:hover{background-color:#5f564f}.data-grid .data-grid-th._sortable:active{padding-bottom:.9rem;padding-top:1.1rem}.data-grid .data-grid-th.required>span:after{color:#f38a5e;content:'*';margin-left:.3rem}.data-grid .data-grid-checkbox-cell{padding:0;vertical-align:top;width:5.2rem}.data-grid .data-grid-checkbox-cell:hover{cursor:default}.data-grid .data-grid-thumbnail-cell{text-align:center;width:7rem}.data-grid .data-grid-thumbnail-cell img{border:1px solid #d6d6d6;max-width:5rem}.data-grid .data-grid-multicheck-cell{padding:1rem 1rem .9rem;text-align:center;vertical-align:middle}.data-grid .data-grid-onoff-label>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.data-grid .data-grid-actions-cell{padding-left:2rem;padding-right:2rem;text-align:center;width:1%}.data-grid._hidden{display:none}.data-grid._dragging-copy{box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;opacity:.95;position:fixed;top:0;z-index:1000}.data-grid._dragging-copy .data-grid-th{border:1px solid #007bdb;border-bottom:none}.data-grid._dragging-copy .data-grid-th,.data-grid._dragging-copy .data-grid-th._sortable{cursor:-webkit-grabbing;cursor:grabbing}.data-grid._dragging-copy tr:last-child td{border-bottom:1px solid #007bdb}.data-grid._dragging-copy td{border-left:1px solid #007bdb;border-right:1px solid #007bdb}.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid._dragging-copy._in-edit .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:rgba(255,251,230,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td,.data-grid._dragging-copy._in-edit .data-grid-editable-row:hover td{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:after,.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{left:0;right:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:before{background-color:rgba(255,255,255,.95)}.data-grid._dragging-copy._in-edit .data-grid-editable-row td:only-child{border-left:1px solid #007bdb;border-right:1px solid #007bdb;left:0}.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-select,.data-grid._dragging-copy._in-edit .data-grid-editable-row .admin__control-text{opacity:.5}.data-grid._in-edit tr:hover td{background-color:#e6e6e6}.data-grid._in-edit ._odd-row.data-grid-editable-row td,.data-grid._in-edit ._odd-row.data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit ._odd-row td,.data-grid._in-edit ._odd-row:hover td{background-color:#dcdcdc}.data-grid._in-edit .data-grid-editable-row-actions td,.data-grid._in-edit .data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid._in-edit td{background-color:#e6e6e6;pointer-events:none}.data-grid._in-edit .data-grid-checkbox-cell{pointer-events:auto}.data-grid._in-edit .data-grid-editable-row{border:.1rem solid #adadad;border-bottom-color:#c2c2c2}.data-grid._in-edit .data-grid-editable-row:hover td{background-color:#fff}.data-grid._in-edit .data-grid-editable-row td{background-color:#fff;border-bottom-color:#fff;border-left-style:hidden;border-right-style:hidden;border-top-color:#fff;pointer-events:auto;vertical-align:middle}.data-grid._in-edit .data-grid-editable-row td:first-child{border-left-color:#adadad;border-left-style:solid}.data-grid._in-edit .data-grid-editable-row td:first-child:after,.data-grid._in-edit .data-grid-editable-row td:first-child:before{left:0}.data-grid._in-edit .data-grid-editable-row td:last-child{border-right-color:#adadad;border-right-style:solid;left:-.1rem}.data-grid._in-edit .data-grid-editable-row td:last-child:after,.data-grid._in-edit .data-grid-editable-row td:last-child:before{right:0}.data-grid._in-edit .data-grid-editable-row .admin__control-select,.data-grid._in-edit .data-grid-editable-row .admin__control-text{width:100%}.data-grid._in-edit .data-grid-bulk-edit-panel td{vertical-align:bottom}.data-grid .data-grid-editable-row td{border-left-color:#fff;border-left-style:solid;position:relative;z-index:1}.data-grid .data-grid-editable-row td:after{bottom:0;box-shadow:0 5px 5px rgba(0,0,0,.25);content:'';height:.9rem;left:0;margin-top:-1rem;position:absolute;right:0}.data-grid .data-grid-editable-row td:before{background-color:#fff;bottom:0;content:'';height:1rem;left:-10px;position:absolute;right:-10px;z-index:1}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td,.data-grid .data-grid-editable-row.data-grid-editable-row-actions:hover td{background-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:first-child{border-left-color:#fff;border-right-color:#fff}.data-grid .data-grid-editable-row.data-grid-editable-row-actions td:last-child{left:0}.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel td:before,.data-grid .data-grid-editable-row.data-grid-bulk-edit-panel:hover td{background-color:#fffbe6}.data-grid .data-grid-editable-row-actions{left:50%;margin-left:-12.5rem;margin-top:-2px;position:absolute;text-align:center}.data-grid .data-grid-editable-row-actions td{width:25rem}.data-grid .data-grid-editable-row-actions [class*=action-]{min-width:9rem}.data-grid-th._sortable._ascend,.data-grid-th._sortable._descend{padding-right:2.7rem}.data-grid-th._sortable._ascend:before,.data-grid-th._sortable._descend:before{margin-top:-1em;position:absolute;right:1rem;top:50%}.data-grid-th._sortable._ascend:before{content:'\2193'}.data-grid-th._sortable._descend:before{content:'\2191'}.data-grid-checkbox-cell-inner{display:block;padding:1.1rem 1.8rem .9rem;text-align:right}.data-grid-checkbox-cell-inner:hover{cursor:pointer}.data-grid-row-parent._active>td .data-grid-checkbox-cell-inner:before{content:'\e62b'}.data-grid-row-parent>td .data-grid-checkbox-cell-inner{padding-left:3.7rem;position:relative}.data-grid-row-parent>td .data-grid-checkbox-cell-inner:before{content:'\e628';font-size:1rem;font-weight:700;left:1.35rem;position:absolute;top:1.6rem}.data-grid-th._col-xs{width:1%}.data-grid-info-panel{box-shadow:0 0 5px rgba(0,0,0,.5);margin:2rem .1rem -2rem;padding:1rem}.data-grid-info-panel .messages{margin-bottom:1rem}.data-grid-info-panel-actions{text-align:right}.data-grid-editable-row .admin__field-control{position:relative}.data-grid-editable-row .admin__field-control._error:after{border-color:transparent #ee7d7d transparent transparent;border-style:solid;border-width:0 12px 12px 0;content:'';position:absolute;right:0;top:0}.data-grid-editable-row .admin__field-control._error .admin__control-text{border-color:#ee7d7d}.data-grid-editable-row .admin__field-control._focus:after{display:none}.data-grid-editable-row .admin__field-error{bottom:100%;box-shadow:1px 1px 5px rgba(0,0,0,.5);left:0;margin:0 auto 1.5rem;max-width:32rem;position:absolute;right:0}.data-grid-editable-row .admin__field-error:after,.data-grid-editable-row .admin__field-error:before{border-style:solid;content:'';left:50%;position:absolute;top:100%}.data-grid-editable-row .admin__field-error:after{border-color:#fffbbb transparent transparent;border-width:10px 10px 0;margin-left:-10px;z-index:1}.data-grid-editable-row .admin__field-error:before{border-color:#ee7d7d transparent transparent;border-width:11px 12px 0;margin-left:-12px}.data-grid-bulk-edit-panel .admin__field-label-vertical{display:block;font-size:1.2rem;margin-bottom:.5rem;text-align:left}.data-grid-row-changed{cursor:default;display:block;opacity:.5;position:relative;width:100%;z-index:1}.data-grid-row-changed:after{content:'\e631';display:inline-block}.data-grid-row-changed .data-grid-row-changed-tooltip{background:#f1f1f1;border-radius:1px;border:1px solid #f1f1f1;bottom:100%;box-shadow:0 3px 9px 0 rgba(0,0,0,.3);display:none;font-weight:400;line-height:1.36;margin-bottom:1.5rem;padding:1rem;position:absolute;right:-1rem;text-transform:none;width:27rem;word-break:normal;z-index:2}.data-grid-row-changed._changed{opacity:1;z-index:3}.data-grid-row-changed._changed:hover .data-grid-row-changed-tooltip{display:block}.data-grid-row-changed._changed:hover:before{background:#f1f1f1;border:1px solid #f1f1f1;bottom:100%;box-shadow:4px 4px 3px -1px rgba(0,0,0,.15);content:'';display:block;height:1.6rem;left:50%;margin:0 0 .7rem -.8rem;position:absolute;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:1.6rem;z-index:3}.ie9 .data-grid-row-changed._changed:hover:before{display:none}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]:before,.admin__control-file-label :before,.admin__control-multiselect,.admin__control-select,.admin__control-text,.admin__control-textarea,.selectmenu{background-color:#fff;border-radius:1px;border:1px solid #adadad;color:#303030;font-size:1.4rem;font-weight:400;line-height:1.36;height:auto;width:auto;padding:.6rem 1rem;transition:border-color .1s linear;vertical-align:baseline}.admin__control-multiselect:hover,.admin__control-select:hover,.admin__control-text:hover,.admin__control-textarea:hover,.selectmenu:hover,.selectmenu:hover .selectmenu-toggle:before{border-color:#878787}.admin__control-addon [class*=admin__control-][type]:focus+[class*=admin__addon-]:before,.admin__control-file:active+.admin__control-file-label :before,.admin__control-file:focus+.admin__control-file-label :before,.admin__control-multiselect:focus,.admin__control-select:focus,.admin__control-text:focus,.admin__control-textarea:focus,.selectmenu._focus,.selectmenu._focus .selectmenu-toggle:before{border-color:#007bdb;box-shadow:none;outline:0}.admin__control-addon [class*=admin__control-][type][disabled]+[class*=admin__addon-]:before,.admin__control-file[disabled]+.admin__control-file-label :before,.admin__control-multiselect[disabled],.admin__control-select[disabled],.admin__control-text[disabled],.admin__control-textarea[disabled]{background-color:#e9e9e9;border-color:#adadad;color:#303030;opacity:.5;cursor:not-allowed}.admin__fieldset>.admin__field.admin__field-wide[class]>.admin__field-control{float:none;clear:left;text-align:left;width:auto}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label{display:block;line-height:1.4rem;margin-bottom:.86rem;margin-top:-.14rem;text-align:left;width:auto}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)>.admin__field-label:before{display:none}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span{padding-left:1.5rem}.admin__fieldset>.admin__field.admin__field-wide[class]:not(.admin__field-option)._required>.admin__field-label span:after{left:0;margin-left:30px;top:.2rem}.admin__legend{font-size:1.8rem;font-weight:600;margin-bottom:3rem}.admin__control-checkbox,.admin__control-radio{cursor:pointer;opacity:.01;overflow:hidden;position:absolute;vertical-align:top}.admin__control-checkbox:after,.admin__control-radio:after{display:none}.admin__control-checkbox+label,.admin__control-radio+label{cursor:pointer;display:inline-block}.admin__control-checkbox+label:before,.admin__control-radio+label:before{background-color:#fff;border:1px solid #adadad;color:transparent;float:left;height:1.6rem;text-align:center;vertical-align:top;width:1.6rem}.admin__control-checkbox+.admin__field-label,.admin__control-radio+.admin__field-label{padding-left:2.6rem}.admin__control-checkbox+.admin__field-label:before,.admin__control-radio+.admin__field-label:before{margin:1px 1rem 0 -2.6rem}.admin__control-checkbox:checked+label:before,.admin__control-radio:checked+label:before{color:#514943}.admin__control-checkbox.disabled+label,.admin__control-checkbox[disabled]+label,.admin__control-radio.disabled+label,.admin__control-radio[disabled]+label{cursor:default;color:#303030;opacity:.5}.admin__control-checkbox.disabled+label:before,.admin__control-checkbox[disabled]+label:before,.admin__control-radio.disabled+label:before,.admin__control-radio[disabled]+label:before{background-color:#e9e9e9;border-color:#adadad;cursor:default}._keyfocus .admin__control-checkbox:not(.disabled):focus+label:before,._keyfocus .admin__control-checkbox:not([disabled]):focus+label:before,._keyfocus .admin__control-radio:not(.disabled):focus+label:before,._keyfocus .admin__control-radio:not([disabled]):focus+label:before{border-color:#007bdb}.admin__control-checkbox:not(.disabled):hover+label:before,.admin__control-checkbox:not([disabled]):hover+label:before,.admin__control-radio:not(.disabled):hover+label:before,.admin__control-radio:not([disabled]):hover+label:before{border-color:#878787}.admin__control-radio+label:before{border-radius:1.6rem;content:'\e637';font-size:1rem;transition:border-color .1s linear,color .1s ease-in}.admin__control-radio.admin__control-radio+label:before{line-height:140%}.admin__control-radio:checked:not(.disabled):hover,.admin__control-radio:checked:not(.disabled):hover+label,.admin__control-radio:checked:not([disabled]):hover,.admin__control-radio:checked:not([disabled]):hover+label{cursor:default}.admin__control-radio:checked:not(.disabled):hover+label:before,.admin__control-radio:checked:not([disabled]):hover+label:before{border-color:#adadad}.admin__control-checkbox+label:before{border-radius:1px;content:'';font-size:0;transition:font-size .1s ease-out,color .1s ease-out,border-color .1s linear}.admin__control-checkbox:checked+label:before{content:'\e62d';font-size:1.1rem;line-height:125%}.admin__control-checkbox:not(:checked)._indeterminate+label:before,.admin__control-checkbox:not(:checked):indeterminate+label:before{color:#514943;content:'-';font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700}input[type=checkbox].admin__control-checkbox,input[type=radio].admin__control-checkbox{position:absolute;margin:0}.admin__control-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background-repeat:no-repeat;background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#adadad,#adadad);background-position:calc(100% - 12px) -34px,100%,calc(100% - 3.2rem) 0;background-size:auto,3.2rem 100%,1px 100%;padding-bottom:.5rem;padding-right:4.4rem;padding-top:.5rem;transition:border-color .1s linear}.admin__control-select:hover{border-color:#878787;cursor:pointer}.admin__control-select:focus{background-image:url(../images/arrows-bg.svg),linear-gradient(#e3e3e3,#e3e3e3),linear-gradient(#007bdb,#007bdb);background-position:calc(100% - 12px) 13px,100%,calc(100% - 3.2rem) 0;border-color:#007bdb}.admin__control-select::-ms-expand{display:none}.ie9 .admin__control-select{background-image:none;padding-right:1rem}option:empty{display:none}.admin__control-multiselect{height:auto;padding:.6rem 1rem}.admin__control-file-wrapper{display:inline-block;padding:.5rem 1rem;position:relative;z-index:1}.admin__control-file-label :before{content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__control-file{position:relative;z-index:1;background:0 0;border:0;width:auto}.admin__control-support-text{border:1px solid transparent;display:inline-block;font-size:1.4rem;line-height:1.36;padding-top:.6rem;padding-bottom:.6rem}.admin__control-support-text+[class*=admin__control-],[class*=admin__control-]+.admin__control-support-text{margin-left:.7rem}.admin__control-textarea{height:8.48rem;line-height:1.18;padding-top:.8rem;resize:vertical}.admin__control-addon{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;display:inline-flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;position:relative;width:100%;z-index:1}.admin__control-addon>[class*=admin__addon-],.admin__control-addon>[class*=admin__control-]{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative;z-index:1}.admin__control-addon [class*=admin__control-][type]{appearence:none;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;box-shadow:none;background-color:transparent;border-color:transparent;-webkit-order:1;-ms-flex-order:1;order:1;vertical-align:top;width:auto}.admin__control-addon [class*=admin__control-][type] :focus{box-shadow:0}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]{padding-left:1rem;position:static!important;z-index:0}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]>*{position:relative;vertical-align:top;z-index:2}.admin__control-addon [class*=admin__control-][type]+[class*=admin__addon-]:before{bottom:0;box-sizing:border-box;content:'';left:0;position:absolute;top:0;width:100%;z-index:0}.admin__addon-prefix,.admin__addon-suffix{border:0;box-sizing:border-box;color:#858585;display:inline-block;font-size:1.4rem;font-weight:400;height:3.2rem;line-height:3.2rem;padding:0}.admin__addon-suffix{-webkit-order:3;-ms-flex-order:3;order:3}.admin__addon-suffix:last-child{padding-right:1rem}.admin__addon-prefix{-webkit-order:0;-ms-flex-order:0;order:0}.ie9 .admin__control-addon:after{clear:both;content:'';display:block;height:0;overflow:hidden}.ie9 .admin__addon{min-width:0;overflow:hidden;text-align:right;white-space:nowrap;width:auto}.ie9 .admin__addon [class*=admin__control-]{display:inline}.ie9 .admin__addon-prefix{float:left}.ie9 .admin__addon-suffix{float:right}.admin__control-table-wrapper{max-width:100%;overflow-x:auto;overflow-y:hidden}.admin__control-table{width:100%}.admin__control-table thead{background-color:transparent}.admin__control-table tbody td{vertical-align:middle}.admin__control-table tfoot th{padding-bottom:1.3rem}.admin__control-table tr:last-child td,.admin__control-table tr:last-child th{border-bottom:none}.admin__control-table td,.admin__control-table th{background-color:#efefef;border:0;border-bottom:1px solid #fff;padding:1.3rem 2.5rem 1.3rem 0;text-align:left;vertical-align:top}.admin__control-table td:first-child,.admin__control-table th:first-child{padding-left:1.5rem}.admin__control-table th{border:0;vertical-align:bottom;color:#303030;font-size:1.4rem;font-weight:600;padding-bottom:0}.admin__control-table th._required span:after{color:#eb5202;content:'*'}.admin__control-table .control-table-actions-th{white-space:nowrap}.admin__control-table .control-table-actions-cell{padding-top:1.8rem;text-align:center;width:1%}.admin__control-table .col-draggable{padding-top:2.2rem;width:1%}.admin__control-table .action-delete,.admin__control-table .action-delete:hover{background-color:transparent;border-color:transparent;box-shadow:none}.admin__control-table .action-delete:before{content:'\e630'}.admin__control-table .action-delete>span{display:none}.admin__field-tooltip{display:inline-block;margin-top:5px;overflow:visible;vertical-align:top;width:0}.admin__field-tooltip:hover{position:relative;z-index:500}.admin__field-option .admin__field-tooltip{margin-top:10px}.admin__field-tooltip .admin__field-tooltip-action{margin-left:20px;display:inline-block;text-decoration:none}.admin__field-tooltip .admin__field-tooltip-action:before{-webkit-font-smoothing:antialiased;font-size:2.2rem;line-height:1;color:#514943;content:'\e633';font-family:Icons;vertical-align:middle;display:inline-block;font-weight:400;overflow:hidden;speak:none;text-align:center}.admin__field-tooltip .admin__control-text:focus+.admin__field-tooltip-content,.admin__field-tooltip:hover .admin__field-tooltip-content{display:block}.admin__field-tooltip .admin__field-tooltip-content{bottom:42px;display:none;right:-70px}.admin__field-tooltip .admin__field-tooltip-content:after,.admin__field-tooltip .admin__field-tooltip-content:before{border:16px solid transparent;height:0;width:0;border-top-color:#afadac;content:"";display:block;position:absolute;right:20px;top:100%;z-index:3}.admin__field-tooltip .admin__field-tooltip-content:after{border-top-color:#fffbbb;margin-top:-1px;z-index:4}.abs-admin__field-tooltip-content,.admin__field-tooltip .admin__field-tooltip-content{box-shadow:0 2px 8px 0 rgba(0,0,0,.3);background:#fffbbb;border-radius:1px;border:1px solid #afadac;padding:15px 25px;position:absolute;width:320px;z-index:1}.admin__fieldset{border:0;margin:0;min-width:0;padding:0}.admin__fieldset>.admin__field{border:0;margin:0 0 0 -30px;padding:0}.admin__fieldset>.admin__field:after{clear:both;content:'';display:table}.admin__fieldset>.admin__field>.admin__field-control{width:calc((100%) * .4444444444444444 - 30px);float:left;margin-left:30px}.admin__fieldset>.admin__field>.admin__field-label{width:calc((100%) * .3333333333333333 - 30px);float:left;margin-left:30px}.admin__form-field{border:0;margin:0;padding:0}.admin__field-control .admin__control-text,.admin__field-control .admin__control-textarea,.admin__form-field-control .admin__control-text,.admin__form-field-control .admin__control-textarea{width:100%}.admin__field-label{color:#303030;margin:0;text-align:right}.admin__field-label+br{display:none}.admin__field:not(.admin__field-option)>.admin__field-label{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:600;line-height:3.2rem;padding:0;white-space:nowrap;word-wrap:break-word}.admin__field:not(.admin__field-option)>.admin__field-label:before{opacity:0;visibility:hidden;content:'.';margin-left:-7px;overflow:hidden}.admin__field:not(.admin__field-option)>.admin__field-label span{display:inline-block;line-height:1.2;vertical-align:middle;white-space:normal}._required>.admin__field-label span:after{color:#eb5202;content:'*';display:inline-block;font-size:1.6rem;font-weight:500;line-height:1;margin-left:10px;position:absolute;top:1.2rem;z-index:1}._disabled>.admin__field-label{color:#999}.admin__field{margin-bottom:0}.admin__field+.admin__field{margin-top:1.5rem}.admin__field:not(.admin__field-option)~.admin__field-option{margin-top:.5rem}.admin__field.admin__field-option~.admin__field-option{margin-top:.9rem}.admin__field~.admin__field-option:last-child{margin-bottom:.8rem}.admin__fieldset>.admin__field{margin-bottom:3rem;position:relative}.admin__field[data-config-scope]:before{color:gray;content:attr(data-config-scope);display:inline-block;font-size:1.2rem;left:calc((100%) * .7777777777777778 - 30px);line-height:3.2rem;margin-left:60px;position:absolute;width:calc((100%) * .2222222222222222 - 30px)}.admin__field-control .admin__field[data-config-scope]:nth-child(n+2):before{content:''}.admin__field._error .admin__field-control [class*=admin__addon-]:before,.admin__field._error .admin__field-control>[class*=admin__control-]{border-color:#e22626}.admin__field-control+.admin__field-control{margin-top:1.5rem}.admin__field-error{background:#fffbbb;border:1px solid #ee7d7d;box-sizing:border-box;color:#555;display:block;font-size:1.2rem;font-weight:400;line-height:1.2;margin:.2rem 0 0;padding:.8rem 1rem .9rem}.admin__field-note{color:#303030;font-size:1.2rem;margin:10px 0 0;padding:0}.admin__field-option{padding-top:.8rem}.admin__field-option .admin__field-label{text-align:left}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2),.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1){display:inline-block}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option{display:inline-block;margin-left:41px;margin-top:0}.admin__field-control>.admin__field-option:nth-child(1):nth-last-child(2)+.admin__field-option:before,.admin__field-control>.admin__field-option:nth-child(2):nth-last-child(1)+.admin__field-option:before{background:#cacaca;content:'';display:inline-block;height:20px;margin-left:-20px;position:absolute;width:1px}.admin__field-value{padding-top:.8rem}.admin__control-fields>.admin__field:first-child,[class*=admin__control-grouped]>.admin__field:first-child{position:static}.admin__control-fields>.admin__field:first-child>.admin__field-label,[class*=admin__control-grouped]>.admin__field:first-child>.admin__field-label{width:calc((100%) * .3333333333333333 - 30px);float:left;margin-left:30px;cursor:pointer;left:0;opacity:0;position:absolute;top:0}.admin__control-fields .admin__field-label~.admin__field-control{width:100%}[class*=admin__control-grouped]{box-sizing:border-box;display:table;table-layout:fixed;width:100%}[class*=admin__control-grouped]>.admin__field{display:table-cell;vertical-align:top;width:50%}[class*=admin__control-grouped]>.admin__field>.admin__field-control{float:none;width:100%}[class*=admin__control-grouped]>.admin__field:nth-child(n+2){padding-left:20px}[class*=admin__control-grouped]>.admin__field:nth-child(n+2):not(.admin__field-option) .admin__field-label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.admin__field-control-group{margin-top:.8rem}.admin__field-control-group>.admin__field{padding:0}.admin__legend{float:left;position:static;width:100%}.admin__legend+br{display:block;height:0;overflow:hidden;clear:left}.message{margin-bottom:3rem}.message-icon-top:before{margin-top:0;top:1.8rem}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;margin-bottom:3rem;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav .btn-group .btn-wrap .btn,.nav-bar-outer-actions .btn-wrap .btn{padding-left:.5rem;padding-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:1rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before,.nav-bar>li.ui-state-disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after,.nav-bar>li.ui-state-active~li:after{display:none}.nav-bar>li.active~li a:after,.nav-bar>li.ui-state-active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a,.nav-bar>li.ui-state-active a{color:#000}.nav-bar>li.active a:hover,.nav-bar>li.ui-state-active a:hover{cursor:default}.nav-bar>li.active a:after,.nav-bar>li.ui-state-active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:1.5rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:1.5rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.3rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.3rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip p:last-child{margin-bottom:0}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:20rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@-webkit-keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;clear:left;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-text-description{margin-bottom:1.6rem}.progress-bar-text-progress{text-align:right}.page-columns .page-inner-sidebar{margin:0 0 3rem}.page-header{margin-bottom:2.7rem;padding-bottom:2.9rem;position:relative}.page-header:before{border-bottom:1px solid #e3e3e3;bottom:0;content:'';display:block;height:1px;left:3rem;position:absolute;right:3rem}.container .page-header:before{content:normal}.page-header .message{margin-bottom:1.8rem}.page-header .message+.message{margin-top:-1.5rem}.page-header .admin__action-dropdown,.page-header .search-global-input{transition:none}.container .page-header{margin-bottom:0}.page-title-wrapper{margin-top:1.1rem}.container .page-title-wrapper{background:url(../../pub/images/logo.svg) no-repeat;min-height:41px;padding:4px 0 0 45px}.admin__menu .level-0:first-child>a{margin-top:1.6rem}.admin__menu .level-0:first-child>a:after{top:-1.6rem}.admin__menu .level-0:first-child._active>a:after{display:block}.admin__menu .level-0>a{padding-top:1.3rem;padding-bottom:1.3rem}.admin__menu .level-0>a:before{margin-bottom:.7rem}.admin__menu .item-home>a:before{content:'\e611';font-size:2.3rem;padding-top:-.1rem}.admin__menu .item-component>a:before{content:'\e612'}.admin__menu .item-upgrade>a:before{content:'\e614'}.admin__menu .item-system-config>a:before{content:'\e610'}.admin__menu .item-tools>a:before{content:'\e613'}.modal-sub-title{font-size:1.7rem;font-weight:600}.modal-connect-signin .modal-inner-wrap{max-width:80rem}@-webkit-keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes ngdialog-fadeout{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}@keyframes ngdialog-fadein{0%{opacity:0}100%{opacity:1}}.ngdialog{-webkit-overflow-scrolling:touch;bottom:0;box-sizing:border-box;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:999}.ngdialog *,.ngdialog:after,.ngdialog:before{box-sizing:inherit}.ngdialog.ngdialog-disabled-animation *{-webkit-animation:none!important;animation:none!important}.ngdialog.ngdialog-closing .ngdialog-content,.ngdialog.ngdialog-closing .ngdialog-overlay{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadeout .5s;animation:ngdialog-fadeout .5s}.ngdialog-overlay{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s;background:rgba(0,0,0,.4);bottom:0;left:0;position:fixed;right:0;top:0}.ngdialog-content{-webkit-backface-visibility:hidden;-webkit-animation:ngdialog-fadein .5s;animation:ngdialog-fadein .5s}body.ngdialog-open{overflow:hidden}.component-indicator{border-radius:50%;cursor:help;display:inline-block;height:20px;text-align:center;width:20px}.component-indicator::after,.component-indicator::before{background:#fff;display:block;opacity:0;position:absolute;transition:opacity .2s linear .1s;visibility:hidden}.component-indicator::before{border-radius:1px;border:1px solid #adadad;box-shadow:0 0 2px rgba(0,0,0,.4);content:attr(data-label);font-size:1.2rem;margin:34px 0 0 -10px;min-width:50px;padding:4px 5px}.component-indicator::after{border:1px solid #999;border-width:1px 0 0 1px;box-shadow:-1px -1px 1px rgba(0,0,0,.1);content:'';height:10px;margin:9px 0 0 5px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:10px}.component-indicator:hover::after,.component-indicator:hover::before{opacity:1;transition:opacity .2s linear;visibility:visible}.component-indicator span{display:block;height:20px;overflow:hidden;width:20px}.component-indicator span:before{content:'';display:block;font-family:Icons;font-size:20px;height:100%;line-height:20px;width:100%}.component-indicator._on{background:#79a22e}.component-indicator._off{background:#e22626}.component-indicator._off span:before{background:#fff;height:4px;margin:8px auto 20px;width:12px}.component-indicator._info{background:0 0}.component-indicator._info span{width:21px}.component-indicator._info span:before{color:#008bdb;content:'\e61a';font-family:Icons;font-size:21px}.app-updater .nav{display:block;margin-bottom:3.1rem;margin-top:-2.8rem}.app-updater .nav-bar-outer-actions{margin-top:1rem;padding-right:0}.app-updater .nav-bar-outer-actions .btn-wrap-cancel{margin-right:2.6rem}.main{padding-bottom:2rem;padding-top:3rem}.menu-wrapper .logo-static{pointer-events:none}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;line-height:1.4;margin:2.5rem 0 3.5rem 5rem}.page-title{margin-bottom:1rem}.page-sub-title{font-size:2rem}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.spinner.side{float:left;font-size:2.4rem;margin-left:2rem;margin-top:-5px}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit,.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.readiness-check-item{margin-bottom:4rem;min-height:2.5rem}.readiness-check-item .spinner{font-size:2.5rem;float:left;margin:-.4rem 0 0 1.7rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:5.7rem}.readiness-check-content{margin-left:5.7rem;margin-right:22rem}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.readiness-check-side{float:right;padding-left:2.4rem;width:22rem}.readiness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:1.7rem;margin-top:.3rem}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .customize-your-store-default .legend{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.customize-your-store .message-error:before{margin-top:0;top:1.8rem}.customize-your-store .message-error a{color:#333;text-decoration:underline}.customize-your-store .message-error .form-label:before{background:#fff}.customize-your-store .customize-database-clean p{margin-top:2.5rem}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;height:20rem;margin:1rem 0 2rem;overflow-y:auto;padding:1.5rem 2rem 2rem;resize:vertical}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}.install-database-clean{margin-top:4rem}.install-database-clean .btn{margin-right:1rem}.page-sub-title{margin-bottom:2.1rem;margin-top:3rem}.multiselect-custom{max-width:71.1rem}.content-install{margin-top:3.7rem}.home-page-inner-wrap{margin:0 auto;max-width:91rem}.setup-home-title{margin-bottom:3.9rem;padding-top:1.8rem;text-align:center}.setup-home-item{background-color:#fafafa;border:1px solid #ccc;color:#333;display:block;margin-bottom:2rem;margin-left:1.3rem;margin-right:1.3rem;min-height:30rem;padding:2rem;text-align:center}.setup-home-item:hover{border-color:#8c8c8c;color:#333;text-decoration:none;transition:border-color .1s linear}.setup-home-item:active{-webkit-transform:scale(0.99);-ms-transform:scale(0.99);transform:scale(0.99)}.setup-home-item:before{display:block;font-size:7rem;margin-bottom:3.3rem;margin-top:4rem}.setup-home-item-component:before{content:'\e612'}.setup-home-item-upgrade:before{content:'\e614'}.setup-home-item-configuration:before{content:'\e610'}.setup-home-item-title{display:block;font-size:1.8rem;letter-spacing:.025em;margin-bottom:1rem}.setup-home-item-description{display:block}.componenet-manager-wrap{border:1px solid #bbb;margin:0 0 4rem}.componenet-manager-wrap .componenet-manager-account{font-size:1.4rem;float:right;padding:.6rem 0 0}.componenet-manager-wrap .componenet-manager-account .sign-in-out{margin-left:2rem}.component-manager-title{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;color:#41362f;font-size:2rem;line-height:1.2;padding:2rem}.component-manager-content{padding:2.5rem 2rem 2rem}.componenet-manager-items{list-style:none;margin:0;text-align:center}.componenet-manager-items .btn{border:1px solid #adadad}.componenet-manager-items .item-title{margin:0 0 1.5rem}.componenet-manager-items .item-number{font-size:6rem;line-height:.8;margin:0 0 1.5rem}.componenet-manager-items .item-date{margin:0 0 3.7rem}.componenet-manager-items .item-install{margin:0 0 2rem}.componenet-manager-items .item-install .btn{line-height:1.36;margin:0;padding:0;color:#008bdb;text-decoration:none;background:0 0;border:0;display:inline;font-size:1.4rem;font-weight:400}.componenet-manager-items .item-install .btn:visited{color:#008bdb;text-decoration:none}.componenet-manager-items .item-install .btn:hover{text-decoration:underline}.componenet-manager-items .item-install .btn:active{color:#ff5501;text-decoration:underline}.componenet-manager-items .item-install .btn:hover{color:#0fa7ff}.componenet-manager-items .item-install .btn:active,.componenet-manager-items .item-install .btn:focus,.componenet-manager-items .item-install .btn:hover{background:0 0;border:0}.componenet-manager-items .item-install .btn.disabled,.componenet-manager-items .item-install .btn[disabled],fieldset[disabled] .componenet-manager-items .item-install .btn{color:#008bdb;opacity:.5;cursor:default;pointer-events:none;text-decoration:underline}.componenet-manager-items .item-install .btn.disabled{text-decoration:none}.sync-login-wrap{margin:-2.5rem 0 0;padding:0 10% 4rem}.sync-login-wrap .legend{font-size:2.6rem;color:#eb5202;float:left;font-weight:300;line-height:1.2;margin:-1rem 0 2.5rem;position:static;width:100%}.sync-login-wrap .legend._hidden{display:none}.sync-login-wrap .login-header{font-size:3.4rem;font-weight:300;margin:0 0 2rem}.sync-login-wrap .login-header span{display:inline-block;padding:.9rem 0 0;vertical-align:top}.sync-login-wrap .form-row .form-label{display:inline-block}.sync-login-wrap .form-row .form-label.required{padding-left:1.5rem}.sync-login-wrap .form-row .form-label.required:after{left:0;position:absolute;right:auto}.sync-login-wrap .form-row{max-width:28rem}.sync-login-wrap .form-actions{display:table;margin-top:-1.3rem}.sync-login-wrap .form-actions .links{display:table-header-group}.sync-login-wrap .form-actions .actions{padding:3rem 0 0}@media all and (max-width:1047px){.admin__menu .submenu li{min-width:19.8rem}.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}.app-updater .nav{padding-bottom:1.7rem}.app-updater .nav-bar-outer-actions{margin-top:2rem}}@media all and (min-width:768px){.page-layout-admin-2columns-left .page-columns{margin-left:-30px}.page-layout-admin-2columns-left .page-columns:after{clear:both;content:'';display:table}.page-layout-admin-2columns-left .page-columns .main-col{width:calc((100%) * .75 - 30px);float:right}.page-layout-admin-2columns-left .page-columns .side-col{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}.page-columns{margin-left:-30px}.page-columns:after{clear:both;content:'';display:table}.page-columns .page-inner-content{width:calc((100%) * .75 - 30px);float:right}.page-columns .page-inner-sidebar{width:calc((100%) * .25 - 30px);float:left;margin-left:30px}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}} \ No newline at end of file diff --git a/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php b/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php index b404778db1629d69099f5289e0f04e8892ee3d33..8843fb66c211157f4c0e77c1732ff2ba6748637f 100644 --- a/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php +++ b/setup/src/Magento/Setup/Console/Command/DiCompileCommand.php @@ -28,6 +28,9 @@ use Symfony\Component\Console\Output\OutputInterface; */ class DiCompileCommand extends Command { + /** Command name */ + const NAME = 'setup:di:compile'; + /** @var DeploymentConfig */ private $deploymentConfig; @@ -89,7 +92,7 @@ class DiCompileCommand extends Command */ protected function configure() { - $this->setName('setup:di:compile') + $this->setName(self::NAME) ->setDescription( 'Generates DI configuration and all non-existing interceptors and factories' ); @@ -172,7 +175,6 @@ class DiCompileCommand extends Command $this->cleanupFilesystem( [ DirectoryList::CACHE, - DirectoryList::GENERATION, DirectoryList::DI, ] ); @@ -291,19 +293,34 @@ class DiCompileCommand extends Command array $compiledPathsList, array $dataAttributesIncludePattern ) { + $excludePatterns = []; + foreach ($this->excludedPathsList as $excludedPaths) { + $excludePatterns = array_merge($excludedPaths, $excludePatterns); + } + $operations = [ + OperationFactory::PROXY_GENERATOR => [ + 'paths' => $compiledPathsList['application'], + 'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'], + 'excludePatterns' => $excludePatterns, + ], OperationFactory::REPOSITORY_GENERATOR => [ 'paths' => $compiledPathsList['application'], - 'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'] + 'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'], + 'excludePatterns' => $excludePatterns, ], OperationFactory::DATA_ATTRIBUTES_GENERATOR => [ 'paths' => $compiledPathsList['application'], 'filePatterns' => $dataAttributesIncludePattern ], OperationFactory::APPLICATION_CODE_GENERATOR => [ - $compiledPathsList['application'], - $compiledPathsList['library'], - $compiledPathsList['generated_helpers'], + 'paths' => [ + $compiledPathsList['application'], + $compiledPathsList['library'], + $compiledPathsList['generated_helpers'], + ], + 'filePatterns' => ['php' => '/\.php$/'], + 'excludePatterns' => $excludePatterns, ], OperationFactory::INTERCEPTION => [ 'intercepted_paths' => [ diff --git a/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php b/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php index 33f8f763ede317220fb6fb2e491a9dfc84839acd..ea56ed13dbd4dd0fc09bf49bf05cd0b91a81b228 100644 --- a/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php +++ b/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php @@ -56,6 +56,9 @@ class DiCompileMultiTenantCommand extends AbstractSetupCommand const SERIALIZER_VALUE_IGBINARY = 'igbinary'; /**#@- */ + /** Command name */ + const NAME = 'setup:di:compile-multi-tenant'; + /** * Object Manager * @@ -155,7 +158,7 @@ class DiCompileMultiTenantCommand extends AbstractSetupCommand 'Allows to exclude Paths from compilation (default is #[\\\\/]m1[\\\\/]#i)' ), ]; - $this->setName('setup:di:compile-multi-tenant') + $this->setName(self::NAME) ->setDescription( 'Generates all non-existing proxies and factories, and pre-compile class definitions, ' . 'inheritance information and plugin definitions' diff --git a/setup/src/Magento/Setup/Console/CompilerPreparation.php b/setup/src/Magento/Setup/Console/CompilerPreparation.php new file mode 100644 index 0000000000000000000000000000000000000000..adfefd3db07c03fd3fb1818c75cb96af7d936e1c --- /dev/null +++ b/setup/src/Magento/Setup/Console/CompilerPreparation.php @@ -0,0 +1,76 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Console; + + +use Magento\Framework\App\Bootstrap; +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Filesystem\Driver\File; +use Magento\Setup\Console\Command\DiCompileCommand; +use Magento\Setup\Console\Command\DiCompileMultiTenantCommand; +use Magento\Setup\Mvc\Bootstrap\InitParamListener; +use Symfony\Component\Console\Input\ArgvInput; + +class CompilerPreparation +{ + /** @var \Zend\ServiceManager\ServiceManager */ + private $serviceManager; + + /** @var ArgvInput */ + private $input; + + /** @var File */ + private $filesystemDriver; + + /** + * @param \Zend\ServiceManager\ServiceManager $serviceManager + * @param ArgvInput $input + * @param File $filesystemDriver + */ + public function __construct( + \Zend\ServiceManager\ServiceManager $serviceManager, + \Symfony\Component\Console\Input\ArgvInput $input, + \Magento\Framework\Filesystem\Driver\File $filesystemDriver + ) { + $this->serviceManager = $serviceManager; + $this->input = $input; + $this->filesystemDriver = $filesystemDriver; + } + + /** + * Determine whether a CLI command is for compilation, and if so, clear the directory + * + * @throws \Magento\Framework\Exception\FileSystemException + * @return void + */ + public function handleCompilerEnvironment() + { + $compilationCommands = [DiCompileCommand::NAME, DiCompileMultiTenantCommand::NAME]; + $cmdName = $this->input->getFirstArgument(); + $isHelpOption = $this->input->hasParameterOption('--help') || $this->input->hasParameterOption('-h'); + + if (!in_array($cmdName, $compilationCommands) || $isHelpOption) { + return; + } + + $generationDir = ($cmdName === DiCompileMultiTenantCommand::NAME) + ? $this->input->getParameterOption(DiCompileMultiTenantCommand::INPUT_KEY_GENERATION) + : null; + + if (!$generationDir) { + $mageInitParams = $this->serviceManager->get(InitParamListener::BOOTSTRAP_PARAM); + $mageDirs = isset($mageInitParams[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS]) + ? $mageInitParams[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] + : []; + $generationDir = (new DirectoryList(BP, $mageDirs))->getPath(DirectoryList::GENERATION); + } + + if ($this->filesystemDriver->isExists($generationDir)) { + $this->filesystemDriver->deleteDirectory($generationDir); + } + } +} diff --git a/setup/src/Magento/Setup/Controller/ComponentGrid.php b/setup/src/Magento/Setup/Controller/ComponentGrid.php index 128f3335cc7704d4efcacb13497102a0aff77c70..0c4f7ae10853dca4d11a8cb6146538ddd339d223 100644 --- a/setup/src/Magento/Setup/Controller/ComponentGrid.php +++ b/setup/src/Magento/Setup/Controller/ComponentGrid.php @@ -95,9 +95,10 @@ class ComponentGrid extends \Zend\Mvc\Controller\AbstractActionController $components[$component['name']]['update'] = false; $components[$component['name']]['uninstall'] = false; $components[$component['name']]['moduleName'] = $this->packageInfo->getModuleName($component['name']); - if ($this->composerInformation->isPackageInComposerJson($component['name']) - && ($component['type'] !== \Magento\Framework\Composer\ComposerInformation::METAPACKAGE_PACKAGE_TYPE)) { - $components[$component['name']]['uninstall'] = true; + if ($this->composerInformation->isPackageInComposerJson($component['name'])) { + if ($component['type'] !== \Magento\Framework\Composer\ComposerInformation::METAPACKAGE_PACKAGE_TYPE) { + $components[$component['name']]['uninstall'] = true; + } if (isset($lastSyncData['packages'][$component['name']]['latestVersion']) && version_compare( $lastSyncData['packages'][$component['name']]['latestVersion'], diff --git a/setup/src/Magento/Setup/Controller/DependencyCheck.php b/setup/src/Magento/Setup/Controller/DependencyCheck.php new file mode 100644 index 0000000000000000000000000000000000000000..6f865e166780dc0bf634bc397b0b2fab01eeef29 --- /dev/null +++ b/setup/src/Magento/Setup/Controller/DependencyCheck.php @@ -0,0 +1,159 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Controller; + +use Magento\Setup\Model\DependencyReadinessCheck; +use Magento\Setup\Model\UninstallDependencyCheck; +use Zend\Json\Json; +use Zend\Mvc\Controller\AbstractActionController; +use Zend\View\Model\JsonModel; +use Magento\Framework\Filesystem; +use Magento\Setup\Model\ModuleStatusFactory; +use Magento\Framework\Module\Status; + +/** + * Class DependencyCheck + * + * Checks dependencies. + */ +class DependencyCheck extends AbstractActionController +{ + /** + * Dependency Readiness Check + * + * @var DependencyReadinessCheck + */ + protected $dependencyReadinessCheck; + + /** + * Uninstall Dependency Readiness Check + * + * @var UninstallDependencyCheck + */ + protected $uninstallDependencyCheck; + + /** + * Module/Status Object + * + * @var Status + */ + protected $moduleStatus; + + /** + * Constructor + * + * @param DependencyReadinessCheck $dependencyReadinessCheck + * @param UninstallDependencyCheck $uninstallDependencyCheck + * @param ModuleStatusFactory $moduleStatusFactory + */ + public function __construct( + DependencyReadinessCheck $dependencyReadinessCheck, + UninstallDependencyCheck $uninstallDependencyCheck, + ModuleStatusFactory $moduleStatusFactory + ) { + $this->dependencyReadinessCheck = $dependencyReadinessCheck; + $this->uninstallDependencyCheck = $uninstallDependencyCheck; + $this->moduleStatus = $moduleStatusFactory->create(); + } + + /** + * Verifies component dependency + * + * @return JsonModel + */ + public function componentDependencyAction() + { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; + $packages = Json::decode($this->getRequest()->getContent(), Json::TYPE_ARRAY); + $data = []; + foreach ($packages as $package) { + $data[] = implode(' ', $package); + } + $dependencyCheck = $this->dependencyReadinessCheck->runReadinessCheck($data); + $data = []; + if (!$dependencyCheck['success']) { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + $data['errorMessage'] = $dependencyCheck['error']; + } + $data['responseType'] = $responseType; + return new JsonModel($data); + } + + /** + * Verifies component dependency for uninstall + * + * @return JsonModel + */ + public function uninstallDependencyCheckAction() + { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; + $packages = Json::decode($this->getRequest()->getContent(), Json::TYPE_ARRAY); + + $packagesToDelete = []; + foreach ($packages as $package) { + $packagesToDelete[] = $package['name']; + } + + $dependencyCheck = $this->uninstallDependencyCheck->runUninstallReadinessCheck($packagesToDelete); + $data = []; + if (!$dependencyCheck['success']) { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + $data['errorMessage'] = $dependencyCheck['error']; + } + $data['responseType'] = $responseType; + return new JsonModel($data); + } + + /** + * Verifies component dependency for enable/disable actions + * + * @return JsonModel + */ + public function enableDisableDependencyCheckAction() + { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; + $data = Json::decode($this->getRequest()->getContent(), Json::TYPE_ARRAY); + + try { + if (empty($data['packages'])) { + throw new \Exception('No packages have been found.'); + } + + if (empty($data['type'])) { + throw new \Exception('Can not determine the flow.'); + } + + $modules = $data['packages']; + + $isEnable = ($data['type'] !== 'disable'); + + $modulesToChange = []; + foreach ($modules as $module) { + if (!isset($module['name'])) { + throw new \Exception('Can not find module name.'); + } + $modulesToChange[] = $module['name']; + } + + $constraints = $this->moduleStatus->checkConstraints($isEnable, $modulesToChange); + $data = []; + + if ($constraints) { + $data['errorMessage'] = "Unable to change status of modules because of the following constraints: " + . implode("<br>", $constraints); + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + } + + } catch (\Exception $e) { + $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; + $data['errorMessage'] = $e->getMessage(); + } + + $data['responseType'] = $responseType; + return new JsonModel($data); + } +} diff --git a/setup/src/Magento/Setup/Controller/Environment.php b/setup/src/Magento/Setup/Controller/Environment.php index ac646bcbceff322156bef1fb5379352eaa22a0ff..70db5033490c2e4d5c425837c17e9f7712d5746d 100644 --- a/setup/src/Magento/Setup/Controller/Environment.php +++ b/setup/src/Magento/Setup/Controller/Environment.php @@ -6,25 +6,15 @@ namespace Magento\Setup\Controller; use Magento\Setup\Model\Cron\ReadinessCheck; -use Magento\Setup\Model\CronScriptReadinessCheck; -use Magento\Setup\Model\DependencyReadinessCheck; -use Magento\Setup\Model\UninstallDependencyCheck; -use Magento\Setup\Model\PhpReadinessCheck; -use Zend\Json\Json; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\JsonModel; -use Magento\Setup\Model\FilePermissions; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; -use Magento\Setup\Model\ModuleStatusFactory; -use Magento\Framework\Module\Status; /** * Class Environment * * Provides information and checks about the environment. - * - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Environment extends AbstractActionController { @@ -36,72 +26,42 @@ class Environment extends AbstractActionController /** * File system * - * @var Filesystem + * @var \Magento\Framework\Filesystem */ protected $filesystem; /** * Cron Script Readiness Check * - * @var CronScriptReadinessCheck + * @var \Magento\Setup\Model\CronScriptReadinessCheck */ protected $cronScriptReadinessCheck; - /** - * Dependency Readiness Check - * - * @var DependencyReadinessCheck - */ - protected $dependencyReadinessCheck; - - /** - * Uninstall Dependency Readiness Check - * - * @var UninstallDependencyCheck - */ - protected $uninstallDependencyCheck; - /** * PHP Readiness Check * - * @var PhpReadinessCheck + * @var \Magento\Setup\Model\PhpReadinessCheck */ protected $phpReadinessCheck; - /** - * Module/Status Object - * - * @var Status - */ - protected $moduleStatus; - /** * Constructor * - * @param FilePermissions $permissions - * @param Filesystem $filesystem - * @param CronScriptReadinessCheck $cronScriptReadinessCheck - * @param DependencyReadinessCheck $dependencyReadinessCheck - * @param UninstallDependencyCheck $uninstallDependencyCheck - * @param PhpReadinessCheck $phpReadinessCheck - * @param ModuleStatusFactory $moduleStatusFactory + * @param \Magento\Setup\Model\FilePermissions $permissions + * @param \Magento\Framework\Filesystem $filesystem + * @param \Magento\Setup\Model\CronScriptReadinessCheck $cronScriptReadinessCheck + * @param \Magento\Setup\Model\PhpReadinessCheck $phpReadinessCheck */ public function __construct( - FilePermissions $permissions, - Filesystem $filesystem, - CronScriptReadinessCheck $cronScriptReadinessCheck, - DependencyReadinessCheck $dependencyReadinessCheck, - UninstallDependencyCheck $uninstallDependencyCheck, - PhpReadinessCheck $phpReadinessCheck, - ModuleStatusFactory $moduleStatusFactory + \Magento\Setup\Model\FilePermissions $permissions, + \Magento\Framework\Filesystem $filesystem, + \Magento\Setup\Model\CronScriptReadinessCheck $cronScriptReadinessCheck, + \Magento\Setup\Model\PhpReadinessCheck $phpReadinessCheck ) { $this->permissions = $permissions; $this->filesystem = $filesystem; $this->cronScriptReadinessCheck = $cronScriptReadinessCheck; - $this->dependencyReadinessCheck = $dependencyReadinessCheck; - $this->uninstallDependencyCheck = $uninstallDependencyCheck; $this->phpReadinessCheck = $phpReadinessCheck; - $this->moduleStatus = $moduleStatusFactory->create(); } /** @@ -252,101 +212,4 @@ class Environment extends AbstractActionController $data['responseType'] = $responseType; return new JsonModel($data); } - - /** - * Verifies component dependency - * - * @return JsonModel - */ - public function componentDependencyAction() - { - $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; - $packages = Json::decode($this->getRequest()->getContent(), Json::TYPE_ARRAY); - $data = []; - foreach ($packages as $package) { - $data[] = implode(' ', $package); - } - $dependencyCheck = $this->dependencyReadinessCheck->runReadinessCheck($data); - $data = []; - if (!$dependencyCheck['success']) { - $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; - $data['errorMessage'] = $dependencyCheck['error']; - } - $data['responseType'] = $responseType; - return new JsonModel($data); - } - - /** - * Verifies component dependency for uninstall - * - * @return JsonModel - */ - public function uninstallDependencyCheckAction() - { - $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; - $packages = Json::decode($this->getRequest()->getContent(), Json::TYPE_ARRAY); - - $packagesToDelete = []; - foreach ($packages as $package) { - $packagesToDelete[] = $package['name']; - } - - $dependencyCheck = $this->uninstallDependencyCheck->runUninstallReadinessCheck($packagesToDelete); - $data = []; - if (!$dependencyCheck['success']) { - $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; - $data['errorMessage'] = $dependencyCheck['error']; - } - $data['responseType'] = $responseType; - return new JsonModel($data); - } - - /** - * Verifies component dependency for enable/disable actions - * - * @return JsonModel - */ - public function enableDisableDependencyCheckAction() - { - $responseType = ResponseTypeInterface::RESPONSE_TYPE_SUCCESS; - $data = Json::decode($this->getRequest()->getContent(), Json::TYPE_ARRAY); - - try { - if (empty($data['packages'])) { - throw new \Exception('No packages have been found.'); - } - - if (empty($data['type'])) { - throw new \Exception('Can not determine the flow.'); - } - - $modules = $data['packages']; - - $isEnable = ($data['type'] !== 'disable'); - - $modulesToChange = []; - foreach ($modules as $module) { - if (!isset($module['name'])) { - throw new \Exception('Can not find module name.'); - } - $modulesToChange[] = $module['name']; - } - - $constraints = $this->moduleStatus->checkConstraints($isEnable, $modulesToChange); - $data = []; - - if ($constraints) { - $data['errorMessage'] = "Unable to change status of modules because of the following constraints: " - . implode("<br>", $constraints); - $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; - } - - } catch (\Exception $e) { - $responseType = ResponseTypeInterface::RESPONSE_TYPE_ERROR; - $data['errorMessage'] = $e->getMessage(); - } - - $data['responseType'] = $responseType; - return new JsonModel($data); - } } diff --git a/setup/src/Magento/Setup/Controller/Index.php b/setup/src/Magento/Setup/Controller/Index.php index 1c239ab77aaac4b26877f83c302399fad60b0520..2f80b4b860f5bb85ac9701556852e9c22cc03afb 100644 --- a/setup/src/Magento/Setup/Controller/Index.php +++ b/setup/src/Magento/Setup/Controller/Index.php @@ -9,6 +9,7 @@ namespace Magento\Setup\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use Magento\Setup\Model\ObjectManagerProvider; +use Magento\Framework\App\DeploymentConfig; /** * Main controller of the Setup Wizard @@ -16,17 +17,25 @@ use Magento\Setup\Model\ObjectManagerProvider; class Index extends AbstractActionController { /** - * @var \Magento\Framework\ObjectManagerInterface + * @var \Magento\Setup\Model\ObjectManagerProvider */ - private $objectManager; + private $objectManagerProvider; + + /** + * @var \Magento\Framework\App\DeploymentConfig + */ + private $deploymentConfig; /** * @param ObjectManagerProvider $objectManagerProvider + * @param DeploymentConfig $deploymentConfig */ public function __construct( - ObjectManagerProvider $objectManagerProvider + ObjectManagerProvider $objectManagerProvider, + DeploymentConfig $deploymentConfig ) { - $this->objectManager = $objectManagerProvider->get(); + $this->objectManagerProvider = $objectManagerProvider; + $this->deploymentConfig = $deploymentConfig; } /** @@ -34,19 +43,20 @@ class Index extends AbstractActionController */ public function indexAction() { - if ($this->objectManager->get('Magento\Framework\App\DeploymentConfig')->isAvailable()) { + if ($this->deploymentConfig->isAvailable()) { + $objectManager = $this->objectManagerProvider->get(); /** @var \Magento\Framework\App\State $adminAppState */ - $adminAppState = $this->objectManager->get('Magento\Framework\App\State'); + $adminAppState = $objectManager->get('Magento\Framework\App\State'); $adminAppState->setAreaCode(\Magento\Framework\App\Area::AREA_ADMIN); - $this->objectManager->create( + $objectManager->create( 'Magento\Backend\Model\Auth\Session', [ - 'sessionConfig' => $this->objectManager->get('Magento\Backend\Model\Session\AdminConfig'), + 'sessionConfig' => $objectManager->get('Magento\Backend\Model\Session\AdminConfig'), 'appState' => $adminAppState ] ); - if (!$this->objectManager->get('Magento\Backend\Model\Auth')->isLoggedIn()) { + if (!$objectManager->get('Magento\Backend\Model\Auth')->isLoggedIn()) { $view = new ViewModel(); $view->setTemplate('/error/401.phtml'); $this->getResponse()->setStatusCode(\Zend\Http\Response::STATUS_CODE_401); diff --git a/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php b/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php index f4e52eac26142fd5930344bf0af4a60128671ce7..670e936b0ca861fc976508e178b09926866cb263 100644 --- a/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php +++ b/setup/src/Magento/Setup/Fixtures/CategoriesFixture.php @@ -54,6 +54,7 @@ class CategoriesFixture extends Fixture ->setPath($nestingPath[$groupNumber]) ->setLevel($nestingLevel[$groupNumber] + 1) ->setAvailableSortBy('name') + ->setIsAnchor(false) ->setDefaultSortBy('name') ->setIsActive(true) ->save(); diff --git a/setup/src/Magento/Setup/Model/Navigation.php b/setup/src/Magento/Setup/Model/Navigation.php index a5e4e35fcd8312e5b8ab0d2ab5d755ec3eda8634..9564e311e374ed064c37c636825c1da02f4fa280 100644 --- a/setup/src/Magento/Setup/Model/Navigation.php +++ b/setup/src/Magento/Setup/Model/Navigation.php @@ -7,6 +7,7 @@ namespace Magento\Setup\Model; use Zend\ServiceManager\ServiceLocatorInterface; +use Magento\Framework\App\DeploymentConfig; class Navigation { @@ -34,12 +35,11 @@ class Navigation /** * @param ServiceLocatorInterface $serviceLocator - * @param ObjectManagerProvider $objectManagerProvider + * @param DeploymentConfig $deploymentConfig */ - public function __construct(ServiceLocatorInterface $serviceLocator, ObjectManagerProvider $objectManagerProvider) + public function __construct(ServiceLocatorInterface $serviceLocator, DeploymentConfig $deploymentConfig) { - $objectManager = $objectManagerProvider->get(); - if ($objectManager->get('Magento\Framework\App\DeploymentConfig')->isAvailable()) { + if ($deploymentConfig->isAvailable()) { $this->navStates = $serviceLocator->get('config')[self::NAV_UPDATER]; $this->navType = self::NAV_UPDATER; $this->titles = $serviceLocator->get('config')[self::NAV_UPDATER . 'Titles']; diff --git a/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php b/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php index 3b412d15cc14a644951a23f9087e085a5daf4f38..bd66d8e122360c2cb15543e37ee70cfcaab68152 100644 --- a/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php +++ b/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ApplicationCodeGenerator.php @@ -5,8 +5,12 @@ */ namespace Magento\Setup\Module\Di\App\Task\Operation; +use Magento\Framework\App\Bootstrap; +use Magento\Framework\Exception\FileSystemException; use Magento\Setup\Module\Di\App\Task\OperationInterface; use Magento\Setup\Module\Di\Code\Reader\ClassesScanner; +use Magento\Setup\Module\Di\Code\Scanner\DirectoryScanner; +use Magento\Setup\Module\Di\Code\Scanner\PhpScanner; class ApplicationCodeGenerator implements OperationInterface { @@ -20,16 +24,32 @@ class ApplicationCodeGenerator implements OperationInterface */ private $classesScanner; + /** + * @var PhpScanner + */ + private $phpScanner; + + /** + * @var DirectoryScanner + */ + private $directoryScanner; + /** * @param ClassesScanner $classesScanner + * @param PhpScanner $phpScanner + * @param DirectoryScanner $directoryScanner * @param array $data */ public function __construct( ClassesScanner $classesScanner, + PhpScanner $phpScanner, + DirectoryScanner $directoryScanner, $data = [] ) { $this->data = $data; $this->classesScanner = $classesScanner; + $this->phpScanner = $phpScanner; + $this->directoryScanner = $directoryScanner; } /** @@ -37,16 +57,26 @@ class ApplicationCodeGenerator implements OperationInterface */ public function doOperation() { - if (empty($this->data)) { + if (array_diff(array_keys($this->data), ['filePatterns', 'paths', 'excludePatterns']) + !== array_diff(['filePatterns', 'paths', 'excludePatterns'], array_keys($this->data))) { return; } - foreach ($this->data as $paths) { + foreach ($this->data['paths'] as $paths) { if (!is_array($paths)) { $paths = (array)$paths; } + $files = []; foreach ($paths as $path) { $this->classesScanner->getList($path); + $files = array_merge_recursive( + $files, + $this->directoryScanner->scan($path, $this->data['filePatterns'], $this->data['excludePatterns']) + ); + } + $entities = $this->phpScanner->collectEntities($files['php']); + foreach ($entities as $entityName) { + class_exists($entityName); } } } diff --git a/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ProxyGenerator.php b/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ProxyGenerator.php new file mode 100644 index 0000000000000000000000000000000000000000..ebfec0635b8bb91e13215125f06acc6f5cf62fbd --- /dev/null +++ b/setup/src/Magento/Setup/Module/Di/App/Task/Operation/ProxyGenerator.php @@ -0,0 +1,78 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Module\Di\App\Task\Operation; + +use Magento\Setup\Module\Di\App\Task\OperationInterface; +use Magento\Setup\Module\Di\Code\Scanner; + +class ProxyGenerator implements OperationInterface +{ + /** + * @var Scanner\DirectoryScanner + */ + private $directoryScanner; + + /** + * @var Scanner\XmlScanner + */ + private $proxyScanner; + + /** + * @var array + */ + private $data; + + /** + * @param Scanner\DirectoryScanner $directoryScanner + * @param Scanner\XmlScanner $proxyScanner + * @param array $data + */ + public function __construct( + Scanner\DirectoryScanner $directoryScanner, + Scanner\XmlScanner $proxyScanner, + $data = [] + ) { + $this->directoryScanner = $directoryScanner; + $this->proxyScanner = $proxyScanner; + $this->data = $data; + } + + /** + * Processes operation task + * + * @return void + */ + public function doOperation() + { + if (array_diff(array_keys($this->data), ['filePatterns', 'paths', 'excludePatterns']) + !== array_diff(['filePatterns', 'paths', 'excludePatterns'], array_keys($this->data))) { + return; + } + + $files = []; + foreach ($this->data['paths'] as $path) { + $files = array_merge_recursive( + $files, + $this->directoryScanner->scan($path, $this->data['filePatterns'], $this->data['excludePatterns']) + ); + } + $proxies = $this->proxyScanner->collectEntities($files['di']); + foreach ($proxies as $entityName) { + class_exists($entityName); + } + } + + /** + * Returns operation name + * + * @return string + */ + public function getName() + { + return 'Proxies code generation'; + } +} diff --git a/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php b/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php index cf3c779a3f77603eb3032d02d5134efa39d8af5e..60d1159661528e0598d687e8a44001e615029759 100644 --- a/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php +++ b/setup/src/Magento/Setup/Module/Di/App/Task/Operation/RepositoryGenerator.php @@ -57,8 +57,8 @@ class RepositoryGenerator implements OperationInterface */ public function doOperation() { - if (array_diff(array_keys($this->data), ['filePatterns', 'paths']) - !== array_diff(['filePatterns', 'paths'], array_keys($this->data))) { + if (array_diff(array_keys($this->data), ['filePatterns', 'paths', 'excludePatterns']) + !== array_diff(['filePatterns', 'paths', 'excludePatterns'], array_keys($this->data))) { return; } @@ -68,7 +68,10 @@ class RepositoryGenerator implements OperationInterface $this->repositoryScanner->setUseAutoload(false); $files = []; foreach ($this->data['paths'] as $path) { - $files = array_merge_recursive($files, $this->directoryScanner->scan($path, $this->data['filePatterns'])); + $files = array_merge_recursive( + $files, + $this->directoryScanner->scan($path, $this->data['filePatterns'], $this->data['excludePatterns']) + ); } $repositories = $this->repositoryScanner->collectEntities($files['di']); foreach ($repositories as $entityName) { diff --git a/setup/src/Magento/Setup/Module/Di/App/Task/OperationFactory.php b/setup/src/Magento/Setup/Module/Di/App/Task/OperationFactory.php index dd6bfa1f5ff3adf2395ccfcc871a3ec7fe5efe4a..cb5c930f6e40aeb8d21fe663f5f58ae04010f053 100644 --- a/setup/src/Magento/Setup/Module/Di/App/Task/OperationFactory.php +++ b/setup/src/Magento/Setup/Module/Di/App/Task/OperationFactory.php @@ -32,6 +32,11 @@ class OperationFactory */ const REPOSITORY_GENERATOR = 'repository_generator'; + /** + * Proxy generator + */ + const PROXY_GENERATOR = 'proxy_generator'; + /** * Service data attributes generator */ @@ -53,7 +58,8 @@ class OperationFactory self::APPLICATION_CODE_GENERATOR => 'Magento\Setup\Module\Di\App\Task\Operation\ApplicationCodeGenerator', self::INTERCEPTION => 'Magento\Setup\Module\Di\App\Task\Operation\Interception', self::INTERCEPTION_CACHE => 'Magento\Setup\Module\Di\App\Task\Operation\InterceptionCache', - self::REPOSITORY_GENERATOR => 'Magento\Setup\Module\Di\App\Task\Operation\RepositoryGenerator' + self::REPOSITORY_GENERATOR => 'Magento\Setup\Module\Di\App\Task\Operation\RepositoryGenerator', + self::PROXY_GENERATOR => 'Magento\Setup\Module\Di\App\Task\Operation\ProxyGenerator', ]; /** diff --git a/setup/src/Magento/Setup/Module/I18n/Locale.php b/setup/src/Magento/Setup/Module/I18n/Locale.php index e3bb79e9adb2fd6007dfef92bb711394aa85244e..053ee398a2f71e061d7efee256fe6e686b54e473 100644 --- a/setup/src/Magento/Setup/Module/I18n/Locale.php +++ b/setup/src/Magento/Setup/Module/I18n/Locale.php @@ -30,9 +30,7 @@ class Locale */ public function __construct($locale) { - if ($locale == self::DEFAULT_SYSTEM_LOCALE) { - throw new \InvalidArgumentException('Target locale is system default locale.'); - } elseif (!preg_match('/[a-z]{2}_[A-Z]{2}/', $locale)) { + if (!preg_match('/[a-z]{2}_[A-Z]{2}/', $locale)) { throw new \InvalidArgumentException('Target locale must match the following format: "aa_AA".'); } $this->_locale = $locale; diff --git a/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php b/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php index ee7ecd15e0c5fdc8ed9f24c2eb4a3092dffe0371..96f7c84fd7e7a611579f13e153d37f0cd1b87af9 100644 --- a/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php +++ b/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollector.php @@ -139,7 +139,7 @@ class PhraseCollector if ($phraseTokens) { /** @var \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token $phraseToken */ foreach ($phraseTokens as $phraseToken) { - if ($phraseToken->isConstantEncapsedString()) { + if ($phraseToken->isConstantEncapsedString() || $phraseToken->isConcatenateOperator()) { $phrase[] = $phraseToken->getValue(); } } diff --git a/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php b/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php index a36b8b1e885307150ba4ef9d95ccd8381bfd2137..0477da1bcd3ce5f490c19c7e058e35d89b92f0f2 100644 --- a/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php +++ b/setup/src/Magento/Setup/Module/I18n/Parser/Adapter/Php/Tokenizer/Token.php @@ -166,6 +166,14 @@ class Token return $this->getValue() == ';'; } + /** + * @return bool + */ + public function isConcatenateOperator() + { + return $this->getValue() == '.'; + } + /** * Is namespace separator * diff --git a/setup/src/Magento/Setup/Module/I18n/Parser/Contextual.php b/setup/src/Magento/Setup/Module/I18n/Parser/Contextual.php index d759eb11b2be3620a1e4855b9a8f0c4e9082071f..cbeca7d79d6d8535ee674b36212f85af5833a0e2 100644 --- a/setup/src/Magento/Setup/Module/I18n/Parser/Contextual.php +++ b/setup/src/Magento/Setup/Module/I18n/Parser/Contextual.php @@ -63,7 +63,7 @@ class Contextual extends AbstractParser */ protected function _addPhrase($phraseData, $contextType, $contextValue) { - $phraseKey = $contextType . stripslashes($phraseData['phrase']); + $phraseKey = $contextType . $contextValue. stripslashes($phraseData['phrase']); if (isset($this->_phrases[$phraseKey])) { /** @var \Magento\Setup\Module\I18n\Dictionary\Phrase $phrase */ diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php index 4230d3a67d8820c73ec139d02ed20566e6ff345f..2cbf5cc3f8e3b4e26d75b68ee7869c47623b0731 100644 --- a/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php @@ -141,7 +141,7 @@ class DiCompileCommandTest extends \PHPUnit_Framework_TestCase ->method('create') ->with('Symfony\Component\Console\Helper\ProgressBar') ->willReturn($progressBar); - $this->manager->expects($this->exactly(6))->method('addOperation'); + $this->manager->expects($this->exactly(7))->method('addOperation'); $this->manager->expects($this->once())->method('process'); $tester = new CommandTester($this->command); $tester->execute([]); @@ -149,5 +149,6 @@ class DiCompileCommandTest extends \PHPUnit_Framework_TestCase 'Generated code and dependency injection configuration successfully.', explode(PHP_EOL, $tester->getDisplay()) ); + $this->assertSame(DiCompileCommand::NAME, $this->command->getName()); } } diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileMultiTenantCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileMultiTenantCommandTest.php index 45edf5578c83333180f84ee1bee5c77d904ec58e..c8581808c6660a041854ab31c2b6c077c99bca0d 100644 --- a/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileMultiTenantCommandTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileMultiTenantCommandTest.php @@ -6,11 +6,22 @@ namespace Magento\Setup\Test\Unit\Console\Command; use Magento\Framework\Component\ComponentRegistrar; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Setup\Console\Command\DiCompileMultiTenantCommand; use Symfony\Component\Console\Tester\CommandTester; class DiCompileMultiTenantCommandTest extends \PHPUnit_Framework_TestCase { + /** @var \Magento\Setup\Console\Command\DiCompileMultiTenantCommand */ + private $model; + + public function setUp() + { + $this->model = (new ObjectManager($this))->getObject( + '\Magento\Setup\Console\Command\DiCompileMultiTenantCommand' + ); + } + /** * @dataProvider validateDataProvider * @param array $option @@ -83,4 +94,14 @@ class DiCompileMultiTenantCommandTest extends \PHPUnit_Framework_TestCase ], ]; } + + public function testConfigure() + { + $methodUnderTest = new \ReflectionMethod($this->model, 'configure'); + $methodUnderTest->setAccessible(true); + $methodUnderTest->invoke($this->model); + $this->assertSame(DiCompileMultiTenantCommand::NAME, $this->model->getName()); + $this->assertNotEmpty($this->model->getDescription()); + $this->assertCount(6, $this->model->getDefinition()->getOptions()); + } } diff --git a/setup/src/Magento/Setup/Test/Unit/Console/CompilerPreparationTest.php b/setup/src/Magento/Setup/Test/Unit/Console/CompilerPreparationTest.php new file mode 100644 index 0000000000000000000000000000000000000000..cc46c653e8bc8cb26ed7a8dabeda6bbf5b672186 --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Console/CompilerPreparationTest.php @@ -0,0 +1,181 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Test\Unit\Console; + + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Setup\Console\Command\DiCompileCommand; +use Magento\Setup\Console\Command\DiCompileMultiTenantCommand; +use Magento\Setup\Mvc\Bootstrap\InitParamListener; +use Symfony\Component\Console\Input\ArgvInput; + +class CompilerPreparationTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Setup\Console\CompilerPreparation */ + private $model; + + /** @var \Zend\ServiceManager\ServiceManager | \PHPUnit_Framework_MockObject_MockObject */ + private $serviceManagerMock; + + /** @var \Symfony\Component\Console\Input\ArgvInput | \PHPUnit_Framework_MockObject_MockObject */ + private $inputMock; + + /** @var \Magento\Framework\Filesystem\Driver\File | \PHPUnit_Framework_MockObject_MockObject */ + private $filesystemDriverMock; + + public function setUp() + { + $this->serviceManagerMock = $this->getMockBuilder('\Zend\ServiceManager\ServiceManager') + ->disableOriginalConstructor() + ->getMock(); + $this->inputMock = $this->getMockBuilder('\Symfony\Component\Console\Input\ArgvInput') + ->disableOriginalConstructor() + ->getMock(); + $this->filesystemDriverMock = $this->getMockBuilder('\Magento\Framework\Filesystem\Driver\File') + ->disableOriginalConstructor() + ->getMock(); + $this->model = (new ObjectManager($this))->getObject( + '\Magento\Setup\Console\CompilerPreparation', + [ + 'serviceManager' => $this->serviceManagerMock, + 'input' => $this->inputMock, + 'filesystemDriver' => $this->filesystemDriverMock + ] + ); + } + + /** + * @dataProvider commandNameDataProvider + * @param $commandName + * @param $isCompileCommand + * @param $isHelpOption + * @param bool|null $dirExists + */ + public function testClearGenerationDirWhenNeeded($commandName, $isCompileCommand, $isHelpOption, $dirExists = false) + { + $this->inputMock->expects($this->once())->method('getFirstArgument')->willReturn($commandName); + $this->inputMock->expects($this->atLeastOnce()) + ->method('hasParameterOption') + ->with( + $this->logicalOr('--help', '-h') + )->willReturn($isHelpOption); + if ($isCompileCommand && !$isHelpOption) { + $this->filesystemDriverMock->expects($this->once()) + ->method('isExists') + ->willReturn($dirExists); + $this->filesystemDriverMock->expects($this->exactly((int)$dirExists))->method('deleteDirectory'); + } else { + $this->filesystemDriverMock->expects($this->never())->method('isExists'); + $this->filesystemDriverMock->expects($this->never())->method('deleteDirectory'); + } + $this->model->handleCompilerEnvironment(); + } + + public function commandNameDataProvider() + { + return [ + 'ST compiler, directory exists' => [ + 'commandName' => DiCompileCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => true + ], + 'ST compiler, directory does not exist' => [ + 'commandName' => DiCompileCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => false + ], + 'ST compiler, help option' => [ + 'commandName' => DiCompileCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => true, + 'dirExists' => false + ], + 'MT compiler, directory exists' => [ + 'commandName' => DiCompileMultiTenantCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => true + ], + 'MT compiler, directory does not exist' => [ + 'commandName' => DiCompileMultiTenantCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => false, + 'dirExists' => false + ], + 'MT compiler, help option' => [ + 'commandName' => DiCompileMultiTenantCommand::NAME, + 'isCompileCommand' => true, + 'isHelpOption' => true, + 'dirExists' => true + ], + 'Other command' => [ + 'commandName' => 'not:a:compiler', + 'isCompileCommand' => false, + 'isHelpOption' => false, + ] + ]; + } + + public function testGenerationDirectoryFromInitParams() + { + $customGenerationDirectory = '/custom/generated/code/directory'; + $mageInitParams = ['MAGE_DIRS' => ['generation' => ['path' => $customGenerationDirectory]]]; + + $this->inputMock->expects($this->once()) + ->method('getFirstArgument') + ->willReturn(DiCompileMultiTenantCommand::NAME); + + // Filesystem mock + $this->filesystemDriverMock->expects($this->once())->method('isExists')->willReturn(true); + $this->filesystemDriverMock->expects($this->once()) + ->method('deleteDirectory') + ->with($customGenerationDirectory); + + $this->serviceManagerMock->expects($this->once()) + ->method('get') + ->with(InitParamListener::BOOTSTRAP_PARAM) + ->willReturn($mageInitParams); + $this->model->handleCompilerEnvironment(); + } + + /** + * @dataProvider compilerCommandDataProvider + */ + public function testGenerationDirectoryFromCliOption($commandName) + { + $customGenerationDirectory = '/custom/generated/code/directory'; + $useCliOption = $commandName === DiCompileMultiTenantCommand::NAME; + + $this->inputMock->expects($this->once()) + ->method('getFirstArgument') + ->willReturn($commandName); + $this->inputMock->expects($this->exactly((int)$useCliOption)) + ->method('getParameterOption') + ->with(DiCompileMultiTenantCommand::INPUT_KEY_GENERATION) + ->willReturn($customGenerationDirectory); + // Filesystem mock + $directoryArgConstraint = $useCliOption + ? $this->equalTo($customGenerationDirectory) + : $this->logicalNot($this->equalTo($customGenerationDirectory)); + $this->filesystemDriverMock->expects($this->once())->method('isExists')->willReturn(true); + $this->filesystemDriverMock->expects($this->once()) + ->method('deleteDirectory') + ->with($directoryArgConstraint); + + $this->model->handleCompilerEnvironment(); + } + + public function compilerCommandDataProvider() + { + return [ + [DiCompileCommand::NAME], + [DiCompileMultiTenantCommand::NAME] + ]; + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php index e34be41d76be26d8f7976af10d205171b1968dd1..205ec1b268244195fedaa8281a7b6c1a7c433f21 100644 --- a/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php @@ -28,26 +28,11 @@ class EnvironmentTest extends \PHPUnit_Framework_TestCase */ private $cronScriptReadinessCheck; - /** - * @var \Magento\Setup\Model\DependencyReadinessCheck|\PHPUnit_Framework_MockObject_MockObject - */ - private $dependencyReadinessCheck; - /** * @var \Magento\Setup\Model\PhpReadinessCheck|\PHPUnit_Framework_MockObject_MockObject */ private $phpReadinessCheck; - /** - * @var \Magento\Setup\Model\UninstallDependencyCheck|\PHPUnit_Framework_MockObject_MockObject - */ - protected $uninstallDependencyCheck; - - /** - * @var \Magento\Setup\Model\ModuleStatusFactory|\PHPUnit_Framework_MockObject_MockObject - */ - protected $moduleStatusFactory; - /** * @var Environment */ @@ -57,7 +42,6 @@ class EnvironmentTest extends \PHPUnit_Framework_TestCase { $this->filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); $this->permissions = $this->getMock('Magento\Setup\Model\FilePermissions', [], [], '', false); - $this->cronScriptReadinessCheck = $this->getMock( 'Magento\Setup\Model\CronScriptReadinessCheck', [], @@ -65,36 +49,12 @@ class EnvironmentTest extends \PHPUnit_Framework_TestCase '', false ); - $this->dependencyReadinessCheck = $this->getMock( - 'Magento\Setup\Model\DependencyReadinessCheck', - [], - [], - '', - false - ); $this->phpReadinessCheck = $this->getMock('Magento\Setup\Model\PhpReadinessCheck', [], [], '', false); - $this->uninstallDependencyCheck = $this->getMock( - 'Magento\Setup\Model\UninstallDependencyCheck', - [], - [], - '', - false - ); - $this->moduleStatusFactory = $this->getMock( - 'Magento\Setup\Model\ModuleStatusFactory', - [], - [], - '', - false - ); $this->environment = new Environment( $this->permissions, $this->filesystem, $this->cronScriptReadinessCheck, - $this->dependencyReadinessCheck, - $this->uninstallDependencyCheck, - $this->phpReadinessCheck, - $this->moduleStatusFactory + $this->phpReadinessCheck ); } diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/IndexTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/IndexTest.php index e5a3e2829ccfee7a7df372c974db791e06fe617c..13baa28e0d091a313f38bc40446f94673f622349 100644 --- a/setup/src/Magento/Setup/Test/Unit/Controller/IndexTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Controller/IndexTest.php @@ -25,7 +25,18 @@ class IndexTest extends \PHPUnit_Framework_TestCase */ private $deploymentConfig; - public function testIndexAction() + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\State + */ + private $appState; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Model\Auth + */ + private $auth; + + public function setUp() { $this->objectManager = $this->getMockForAbstractClass('Magento\Framework\ObjectManagerInterface'); $this->objectManagerProvider = $this->getMock( @@ -35,12 +46,58 @@ class IndexTest extends \PHPUnit_Framework_TestCase '', false ); - $this->deploymentConfig = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false); + $this->deploymentConfig = $this->getMock( + 'Magento\Framework\App\DeploymentConfig', + [], + [], + '', + false + ); + $this->appState = $this->getMock( + 'Magento\Framework\App\State', + [], + [], + '', + false + ); + $this->auth = $this->getMock( + 'Magento\Backend\Model\Auth', + [], + [], + '', + false + ); + } + + public function testIndexActionInstalled() + { + $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true); $this->objectManagerProvider->expects($this->once())->method('get')->willReturn($this->objectManager); - $this->objectManager->expects($this->once())->method('get')->willReturn($this->deploymentConfig); + $this->appState->expects($this->once())->method('setAreaCode'); + $this->auth->expects($this->once())->method('isLoggedIn'); + $this->objectManager->expects($this->any()) + ->method('get') + ->will( + $this->returnValueMap( + [ + ['Magento\Framework\App\State', $this->appState], + ['Magento\Backend\Model\Auth', $this->auth] + ] + ) + ); + /** @var $controller Index */ + $controller = new Index($this->objectManagerProvider, $this->deploymentConfig); + $viewModel = $controller->indexAction(); + $this->assertInstanceOf('Zend\View\Model\ViewModel', $viewModel); + $this->assertFalse($viewModel->terminate()); + } + + public function testIndexActionNotInstalled() + { $this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(false); + $this->objectManagerProvider->expects($this->exactly(0))->method('get'); /** @var $controller Index */ - $controller = new Index($this->objectManagerProvider); + $controller = new Index($this->objectManagerProvider, $this->deploymentConfig); $viewModel = $controller->indexAction(); $this->assertInstanceOf('Zend\View\Model\ViewModel', $viewModel); $this->assertFalse($viewModel->terminate()); diff --git a/setup/src/Magento/Setup/Test/Unit/Model/NavigationTest.php b/setup/src/Magento/Setup/Test/Unit/Model/NavigationTest.php index 818c4feffda325e5957bb0a66bd2582dae4b49d2..6b23c410cc71d9b3f0c625e6852db3a9166d6834 100644 --- a/setup/src/Magento/Setup/Test/Unit/Model/NavigationTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Model/NavigationTest.php @@ -16,9 +16,9 @@ class NavigationTest extends \PHPUnit_Framework_TestCase private $serviceLocatorMock; /** - * @var \Magento\Setup\Model\ObjectManagerProvider|\PHPUnit_Framework_MockObject_MockObject + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\DeploymentConfig */ - private $objectManagerProvider; + private $deploymentConfig; /** * @var Navigation @@ -29,12 +29,6 @@ class NavigationTest extends \PHPUnit_Framework_TestCase { $this->serviceLocatorMock = $this->getMockForAbstractClass('Zend\ServiceManager\ServiceLocatorInterface', ['get']); - $deploymentConfig = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false); - $deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(false); - $objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface', [], [], '', false); - $objectManager->expects($this->once())->method('get')->willReturn($deploymentConfig); - $this->objectManagerProvider = $this->getMock('Magento\Setup\Model\ObjectManagerProvider', [], [], '', false); - $this->objectManagerProvider->expects($this->once())->method('get')->willReturn($objectManager); $this->serviceLocatorMock ->expects($this->exactly(2)) ->method('get') @@ -54,7 +48,14 @@ class NavigationTest extends \PHPUnit_Framework_TestCase ['main' => false], ] ])); - $this->navigation = new Navigation($this->serviceLocatorMock, $this->objectManagerProvider); + $this->deploymentConfig = $this->getMock( + 'Magento\Framework\App\DeploymentConfig', + [], + [], + '', + false + ); + $this->navigation = new Navigation($this->serviceLocatorMock, $this->deploymentConfig); } public function testGetType() diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ApplicationCodeGeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ApplicationCodeGeneratorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0a988bb3a5141b69776cf2e3ba87798028a247ae --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ApplicationCodeGeneratorTest.php @@ -0,0 +1,111 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Test\Unit\Module\Di\App\Task; + +use Magento\Setup\Module\Di\App\Task\Operation\ApplicationCodeGenerator; +use Magento\Setup\Module\Di\Code\Scanner; +use Magento\Setup\Module\Di\Code\Reader\ClassesScanner; + +class ApplicationCodeGeneratorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Scanner\DirectoryScanner | \PHPUnit_Framework_MockObject_MockObject + */ + private $directoryScannerMock; + + /** + * @var Scanner\PhpScanner | \PHPUnit_Framework_MockObject_MockObject + */ + private $phpScannerMock; + + /** + * @var ClassesScanner | \PHPUnit_Framework_MockObject_MockObject + */ + private $classesScannerMock; + + protected function setUp() + { + $this->directoryScannerMock = $this->getMockBuilder('Magento\Setup\Module\Di\Code\Scanner\DirectoryScanner') + ->disableOriginalConstructor() + ->getMock(); + $this->phpScannerMock = $this->getMockBuilder('Magento\Setup\Module\Di\Code\Scanner\PhpScanner') + ->disableOriginalConstructor() + ->getMock(); + $this->classesScannerMock = $this->getMockBuilder('Magento\Setup\Module\Di\Code\Reader\ClassesScanner') + ->disableOriginalConstructor() + ->getMock(); + } + + /** + * @param array $data + * + * @dataProvider doOperationWrongDataDataProvider + */ + public function testDoOperationWrongData($data) + { + $model = new ApplicationCodeGenerator( + $this->classesScannerMock, + $this->phpScannerMock, + $this->directoryScannerMock, + $data + ); + + $this->classesScannerMock->expects($this->never()) + ->method('getList'); + $this->directoryScannerMock->expects($this->never()) + ->method('scan'); + $this->phpScannerMock->expects($this->never()) + ->method('collectEntities'); + + $this->assertEmpty($model->doOperation()); + } + + /** + * @return array + */ + public function doOperationWrongDataDataProvider() + { + return [ + [[]], + [['filePatterns' => ['php' => '*.php']]], + [['path' => 'path']], + ]; + } + + public function testDoOperation() + { + $data = [ + 'paths' => ['path/to/app'], + 'filePatterns' => ['php' => '.php'], + 'excludePatterns' => ['/\/Test\//'] + ]; + $files = ['php' => []]; + $model = new ApplicationCodeGenerator( + $this->classesScannerMock, + $this->phpScannerMock, + $this->directoryScannerMock, + $data + ); + + $this->classesScannerMock->expects($this->once()) + ->method('getList') + ->with($data['paths'][0]); + $this->directoryScannerMock->expects($this->once()) + ->method('scan') + ->with( + $data['paths'][0], + $data['filePatterns'], + $data['excludePatterns'] + )->willReturn($files); + $this->phpScannerMock->expects($this->once()) + ->method('collectEntities') + ->with($files['php']) + ->willReturn([]); + + $this->assertEmpty($model->doOperation()); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ProxyGeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ProxyGeneratorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c721973f615efcf3291af497b09b11a26caceb42 --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/ProxyGeneratorTest.php @@ -0,0 +1,95 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Test\Unit\Module\Di\App\Task; + +use Magento\Setup\Module\Di\App\Task\Operation\ProxyGenerator; +use Magento\Setup\Module\Di\Code\Scanner; +use Magento\Setup\Module\Di\Code\Reader\ClassesScanner; + +class ProxyGeneratorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Scanner\DirectoryScanner | \PHPUnit_Framework_MockObject_MockObject + */ + private $directoryScannerMock; + + /** + * @var Scanner\XmlScanner | \PHPUnit_Framework_MockObject_MockObject + */ + private $proxyScannerMock; + + protected function setUp() + { + $this->directoryScannerMock = $this->getMockBuilder('Magento\Setup\Module\Di\Code\Scanner\DirectoryScanner') + ->disableOriginalConstructor() + ->getMock(); + $this->proxyScannerMock = $this->getMockBuilder('Magento\Setup\Module\Di\Code\Scanner\XmlScanner') + ->disableOriginalConstructor() + ->getMock(); + } + + /** + * @param array $data + * + * @dataProvider doOperationWrongDataDataProvider + */ + public function testDoOperationWrongData($data) + { + $model = new ProxyGenerator( + $this->directoryScannerMock, + $this->proxyScannerMock, + $data + ); + + $this->directoryScannerMock->expects($this->never()) + ->method('scan'); + $this->proxyScannerMock->expects($this->never()) + ->method('collectEntities'); + + $this->assertEmpty($model->doOperation()); + } + + /** + * @return array + */ + public function doOperationWrongDataDataProvider() + { + return [ + [[]], + [['filePatterns' => ['php' => '*.php']]], + [['path' => 'path']], + ]; + } + + public function testDoOperation() + { + $data = [ + 'paths' => ['path/to/app'], + 'filePatterns' => ['di' => 'di.xml'], + 'excludePatterns' => ['/\/Test\//'], + ]; + $files = ['di' => []]; + $model = new ProxyGenerator( + $this->directoryScannerMock, + $this->proxyScannerMock, + $data + ); + + $this->directoryScannerMock->expects($this->once()) + ->method('scan') + ->with( + $data['paths'][0], + $data['filePatterns'] + )->willReturn($files); + $this->proxyScannerMock->expects($this->once()) + ->method('collectEntities') + ->with($files['di']) + ->willReturn([]); + + $this->assertEmpty($model->doOperation()); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php index 8b49d60df518b313108b02eecb5a510974de6e7f..626ccfbe7134691b529634f5155f4879c995866b 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/App/Task/RepositoryGeneratorTest.php @@ -16,7 +16,7 @@ class RepositoryGeneratorTest extends \PHPUnit_Framework_TestCase * @var Scanner\DirectoryScanner | \PHPUnit_Framework_MockObject_MockObject */ private $directoryScannerMock; - + /** * @var Scanner\RepositoryScanner | \PHPUnit_Framework_MockObject_MockObject */ @@ -75,6 +75,7 @@ class RepositoryGeneratorTest extends \PHPUnit_Framework_TestCase $data = [ 'paths' => ['path/to/app'], 'filePatterns' => ['di' => 'di.xml'], + 'excludePatterns' => ['/\/Test\//'], ]; $files = ['di' => []]; $model = new RepositoryGenerator( diff --git a/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php b/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php index 09914f7863146d54f3256457a71523da26c7889e..9eec9b6901456d87eacd5ed8014f9cdbabe78fee 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/I18n/LocaleTest.php @@ -9,15 +9,6 @@ use \Magento\Setup\Module\I18n\Locale; class LocaleTest extends \PHPUnit_Framework_TestCase { - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Target locale is system default locale. - */ - public function testLocaleIsSystemDefaultLocaleException() - { - new Locale('en_US'); - } - /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Target locale must match the following format: "aa_AA". diff --git a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php index 954bcc013ade66bfdd3c10c10597fe205f6f5e58..b4f7d60a1ca113b43c289ed4cc57e0bfc471a2b7 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/PhraseCollectorTest.php @@ -204,4 +204,23 @@ class PhraseCollectorTest extends \PHPUnit_Framework_TestCase ->willReturn($line); return $token; } + + public function testCollectPhrases() + { + $firstPart = "'first part'"; + $firstPartToken = new Token(\T_CONSTANT_ENCAPSED_STRING, $firstPart); + $concatenationToken = new Token('.', '.'); + $secondPart = "' second part'"; + $secondPartToken = new Token(\T_CONSTANT_ENCAPSED_STRING, $secondPart); + $phraseTokens = [$firstPartToken, $concatenationToken, $secondPartToken]; + $phraseString = "'first part' . ' second part'"; + + $reflectionMethod = new \ReflectionMethod( + '\Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\PhraseCollector', + '_collectPhrase' + ); + + $reflectionMethod->setAccessible(true); + $this->assertSame($phraseString, $reflectionMethod->invoke($this->phraseCollector, $phraseTokens)); + } } diff --git a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php index 26bcea7516dd2495526e0b75202c3082591a77c6..c29edab1c442d5d96398424fd00be82251c223af 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/I18n/Parser/Adapter/Php/Tokenizer/TokenTest.php @@ -118,4 +118,16 @@ class TokenTest extends \PHPUnit_Framework_TestCase ] ); } + + public function testIsConcatenateOperatorTrue() + { + $token = new \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token('.', '.'); + $this->assertTrue($token->isConcatenateOperator()); + } + + public function testIsConcatenateOperatorFalse() + { + $token = new \Magento\Setup\Module\I18n\Parser\Adapter\Php\Tokenizer\Token(',', ','); + $this->assertFalse($token->isConcatenateOperator()); + } } diff --git a/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php b/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php index ad7f8285196d29543b94473189461b93aa6adb02..f3c12cea22855acb5e9ab6afd9a93dcfb97278ba 100644 --- a/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Validator/DbValidatorTest.php @@ -108,6 +108,18 @@ class DbValidatorTest extends \PHPUnit_Framework_TestCase $this->assertEquals(true, $this->dbValidator->checkDatabaseTablePrefix('_wrong_format')); } + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Table prefix length can't be more than + */ + public function testCheckDatabaseTablePrefixWrongLength() + { + $this->assertEquals( + true, + $this->dbValidator->checkDatabaseTablePrefix('mvbXzXzItSIr0wrZW3gqgV2UKrWiK1Mj7bkBlW72rZW3gqgV2UKrWiK1M') + ); + } + /** * @expectedException \Magento\Setup\Exception * @expectedExceptionMessage Database connection failure. diff --git a/setup/src/Magento/Setup/Validator/DbValidator.php b/setup/src/Magento/Setup/Validator/DbValidator.php index e7b7aea7f0bf02bd6058d1811ddce51fe2ec24f6..8a922b20d134211c8b8722aac1cb39d6de256e9a 100644 --- a/setup/src/Magento/Setup/Validator/DbValidator.php +++ b/setup/src/Magento/Setup/Validator/DbValidator.php @@ -15,6 +15,12 @@ use Magento\Setup\Module\ConnectionFactory; */ class DbValidator { + + /** + * Db prefix max length + */ + const DB_PREFIX_LENGTH = 5; + /** * DB connection factory * @@ -44,7 +50,16 @@ class DbValidator //The table prefix should contain only letters (a-z), numbers (0-9) or underscores (_); // the first character should be a letter. if ($prefix !== '' && !preg_match('/^([a-zA-Z])([[:alnum:]_]+)$/', $prefix)) { - throw new \InvalidArgumentException('Please correct the table prefix format.'); + throw new \InvalidArgumentException( + 'Please correct the table prefix format, should contain only numbers, letters or underscores.' + .' The first character should be a letter.' + ); + } + + if (strlen($prefix) > self::DB_PREFIX_LENGTH) { + throw new \InvalidArgumentException( + 'Table prefix length can\'t be more than ' . self::DB_PREFIX_LENGTH . ' characters.' + ); } return true; diff --git a/setup/view/magento/setup/add-database.phtml b/setup/view/magento/setup/add-database.phtml index 193630700bb6049d3e3832d75d7f69a6822d86b1..2417dca08b56063c7b43322c8c436c27caefec8d 100644 --- a/setup/view/magento/setup/add-database.phtml +++ b/setup/view/magento/setup/add-database.phtml @@ -335,7 +335,7 @@ id="dbTablePrefix" class="form-el-input" tooltip-placement="right" - tooltip="Enter a prefix for database tables created in this installation. Use letters, numbers or underscores, and begin with a letter (Ex: ‘mg1_’)" + tooltip="Enter a prefix for database tables created in this installation. Use letters, numbers or underscores, and begin with a letter (Ex: ‘mg1_’). Table prefix length can't be more than 5 characters." tooltip-trigger="focus" tooltip-append-to-body="true" type="text" diff --git a/setup/view/magento/setup/select-version.phtml b/setup/view/magento/setup/select-version.phtml index b1a8367978eca34216985dc1a72da77e5d42a2aa..eb981f49151e6a73ddb6e1c1a3c7ad6b78b850ec 100644 --- a/setup/view/magento/setup/select-version.phtml +++ b/setup/view/magento/setup/select-version.phtml @@ -186,14 +186,15 @@ <tbody> <tr ng-repeat="component in displayComponents | limitTo:rowLimit"> <td class="data-grid-indicator-cell"> - <div class="onoffswitch"> + <div class="actions-switch"> <input type="checkbox" name="{{component.checkboxId}}" - class="onoffswitch-checkbox" id="{{component.checkboxId}}" + class="actions-switch-checkbox" id="{{component.checkboxId}}" ng-click="AddRemoveComponentOnSliderMove(component)" ng-checked="isSelected(component.name)"> - <label class="onoffswitch-label" for="{{component.checkboxId}}"> - <span class="onoffswitch-inner"></span> - <span class="onoffswitch-switch"></span> + <label class="actions-switch-label" for="{{component.checkboxId}}"> + <span class="actions-switch-inner"></span> + <span class="actions-switch-indicator"></span> + <span class="actions-switch-text" data-label-yes="Yes" data-label-no="No"></span> </label> </div> </td> diff --git a/setup/view/magento/setup/web-configuration.phtml b/setup/view/magento/setup/web-configuration.phtml index a87a668915f9fd59ec3667f5f44618a2ba43ed28..5101643a6defc7f2ccfabe3cd7e2830e9d6612d4 100644 --- a/setup/view/magento/setup/web-configuration.phtml +++ b/setup/view/magento/setup/web-configuration.phtml @@ -20,7 +20,7 @@ $hints = [ ), 'admin' => sprintf( '<p>%s</p>', - 'A unique URL helps keep store and customer info safer.' + 'A unique URL helps keep your store and customers safer. Use only letters, numbers, and underscore characters.' ) ]; ?> @@ -101,6 +101,7 @@ $hints = [ class="form-el-input" type="text" name="admin" + ng-pattern="/^[a-zA-Z0-9_]+$/" ng-model="config.address.admin" ng-class="{'invalid' : webconfig.admin.$invalid && webconfig.submitted }" ng-init="config.address.admin = '<?php echo $this->autoAdminPath ?>';" @@ -111,8 +112,8 @@ $hints = [ tooltip-append-to-body="true" > <div class="error-container"> - <span ng-show="webconfig.admin.$error.required"> - Please enter a valid admin URL path. + <span ng-show="webconfig.admin.$error"> + Please enter a valid admin URL path. Use only letters, numbers, and underscore characters. </span> </div> </div>