diff --git a/app/code/Magento/Catalog/Model/Product/Type/Price.php b/app/code/Magento/Catalog/Model/Product/Type/Price.php index 814865fa75917..e702965270639 100644 --- a/app/code/Magento/Catalog/Model/Product/Type/Price.php +++ b/app/code/Magento/Catalog/Model/Product/Type/Price.php @@ -262,7 +262,7 @@ protected function _applyTierPrice($product, $qty, $finalPrice) $tierPrice = $product->getTierPrice($qty); if (is_numeric($tierPrice)) { - $finalPrice = min($finalPrice, $tierPrice); + $finalPrice = min($finalPrice, (float) $tierPrice); } return $finalPrice; } @@ -645,7 +645,7 @@ public function calculateSpecialPrice( ) { if ($specialPrice !== null && $specialPrice != false) { if ($this->_localeDate->isScopeDateInInterval($store, $specialPriceFrom, $specialPriceTo)) { - $finalPrice = min($finalPrice, $specialPrice); + $finalPrice = min($finalPrice, (float) $specialPrice); } } return $finalPrice; diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/StoreFrontProductsDisplayUsingElasticSearchTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/StoreFrontProductsDisplayUsingElasticSearchTest.xml new file mode 100644 index 0000000000000..3c1bcb3b352cd --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/Test/StoreFrontProductsDisplayUsingElasticSearchTest.xml @@ -0,0 +1,222 @@ + + + + + + + + + <description value="Set Up Elastic Search and Display all Products on Page"/> + <testCaseId value="MC-30209"/> + <severity value="CRITICAL"/> + <group value="Catalog"/> + </annotations> + <before> + <!-- Login Admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + <!--Create Category and Simple Products--> + <createData entity="SimpleSubCategory" stepKey="createCategory1"/> + <createData entity="SimpleProduct" stepKey="createSimpleProduct"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct2"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct3"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct4"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct5"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct6"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct7"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct8"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct9"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct10"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct11"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct12"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct13"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct14"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct15"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct16"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct17"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct18"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct19"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct20"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct21"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct22"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct23"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct24"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct25"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct26"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct27"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct28"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <createData entity="SimpleProduct" stepKey="createSimpleProduct29"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + <createData entity="SimpleProduct" stepKey="createSimpleProduct30"> + <requiredEntity createDataKey="createCategory1"/> + </createData> + + <!--Enable ElasticSearch as search engine.--> + <magentoCLI command="config:set catalog/search/engine elasticsearch6" stepKey="enableElasticSearchAsSearchEngine"/> + <magentoCLI command="indexer:reindex" stepKey="performReindexAfterElasticSearchEnable"/> + <magentoCLI command="cache:flush" stepKey="cleanCacheAfterElasticSearchEnable"/> + + </before> + <after> + <!--Delete created products, category --> + <deleteData createDataKey="createCategory1" stepKey="deleteCategory"/> + <deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct1"/> + <deleteData createDataKey="createSimpleProduct2" stepKey="deleteSimpleProduct2"/> + <deleteData createDataKey="createSimpleProduct3" stepKey="deleteSimpleProduct3"/> + <deleteData createDataKey="createSimpleProduct4" stepKey="deleteSimpleProduct4"/> + <deleteData createDataKey="createSimpleProduct5" stepKey="deleteSimpleProduct5"/> + <deleteData createDataKey="createSimpleProduct6" stepKey="deleteSimpleProduct6"/> + <deleteData createDataKey="createSimpleProduct7" stepKey="deleteSimpleProduct7"/> + <deleteData createDataKey="createSimpleProduct8" stepKey="deleteSimpleProduct8"/> + <deleteData createDataKey="createSimpleProduct9" stepKey="deleteSimpleProduct9"/> + <deleteData createDataKey="createSimpleProduct10" stepKey="deleteSimpleProduct10"/> + <deleteData createDataKey="createSimpleProduct11" stepKey="deleteSimpleProduct11"/> + <deleteData createDataKey="createSimpleProduct12" stepKey="deleteSimpleProduct12"/> + <deleteData createDataKey="createSimpleProduct13" stepKey="deleteSimpleProduct13"/> + <deleteData createDataKey="createSimpleProduct14" stepKey="deleteSimpleProduct14"/> + <deleteData createDataKey="createSimpleProduct15" stepKey="deleteSimpleProduct15"/> + <deleteData createDataKey="createSimpleProduct16" stepKey="deleteSimpleProduct16"/> + <deleteData createDataKey="createSimpleProduct17" stepKey="deleteSimpleProduct17"/> + <deleteData createDataKey="createSimpleProduct18" stepKey="deleteSimpleProduct18"/> + <deleteData createDataKey="createSimpleProduct19" stepKey="deleteSimpleProduct19"/> + <deleteData createDataKey="createSimpleProduct20" stepKey="deleteSimpleProduct20"/> + <deleteData createDataKey="createSimpleProduct21" stepKey="deleteSimpleProduct21"/> + <deleteData createDataKey="createSimpleProduct22" stepKey="deleteSimpleProduct22"/> + <deleteData createDataKey="createSimpleProduct23" stepKey="deleteSimpleProduct23"/> + <deleteData createDataKey="createSimpleProduct24" stepKey="deleteSimpleProduct24"/> + <deleteData createDataKey="createSimpleProduct25" stepKey="deleteSimpleProduct25"/> + <deleteData createDataKey="createSimpleProduct26" stepKey="deleteSimpleProduct26"/> + <deleteData createDataKey="createSimpleProduct27" stepKey="deleteSimpleProduct27"/> + <deleteData createDataKey="createSimpleProduct28" stepKey="deleteSimpleProduct28"/> + <deleteData createDataKey="createSimpleProduct29" stepKey="deleteSimpleProduct29"/> + <deleteData createDataKey="createSimpleProduct30" stepKey="deleteSimpleProduct30"/> + + + <!--Revert ElasticSearch as search engine.--> + <actionGroup ref="ResetSearchEngineConfigurationActionGroup" stepKey="resetCatalogSearchConfiguration"/> + <magentoCLI command="indexer:reindex" stepKey="performReindexAfterElasticSearchDisable"/> + <magentoCLI command="cache:flush" stepKey="cleanCacheAfterElasticSearchDisable"/> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!--Open Storefront on the myCategory page--> + <amOnPage url="/$$createCategory1.name$$.html" stepKey="GoToStorefrontCategory"/> + <waitForPageLoad stepKey="waitForStorefrontCategoryPageLoad"/> + + <!--Select 12 items per page and verify number of products displayed in each page --> + <conditionalClick selector="{{StorefrontCategoryTopToolbarSection.gridMode}}" visible="true" dependentSelector="{{StorefrontCategoryTopToolbarSection.gridMode}}" stepKey="seeProductGridIsActive"/> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" stepKey="scrollToBottomToolbarSection"/> + <selectOption selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" userInput="12" stepKey="selectPerPageOption"/> + <!--Verify number of products displayed in First Page --> + <seeNumberOfElements selector="{{StorefrontCategoryMainSection.productLink}}" userInput="12" stepKey="seeNumberOfProductsInFirstPage"/> + <!--Verify number of products displayed in Second Page --> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="scrollToNextButton"/> + <click selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="clickOnNextPage"/> + <waitForPageLoad stepKey="waitForPageToLoad4"/> + <seeNumberOfElements selector="{{StorefrontCategoryMainSection.productLink}}" userInput="12" stepKey="seeNumberOfProductsInSecondPage"/> + <!--Verify number of products displayed in third Page --> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="scrollToNextButton1"/> + <click selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="clickOnNextPage1"/> + <waitForPageLoad stepKey="waitForPageToLoad2"/> + <seeNumberOfElements selector="{{StorefrontCategoryMainSection.productLink}}" userInput="6" stepKey="seeNumberOfProductsInThirdPage"/> + + <!--Select First Page using page number--> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.previousPage}}" stepKey="scrollToPreviousPage4"/> + <click selector="{{StorefrontCategoryBottomToolbarSection.pageNumber('1')}}" stepKey="clickOnFirstPage"/> + <waitForPageLoad stepKey="waitForPageToLoad9"/> + <seeNumberOfElements selector="{{StorefrontCategoryMainSection.productLink}}" userInput="12" stepKey="seeNumberOfProductsFirstPage2"/> + <!--Select 24 items per page and verify number of products displayed in each page --> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" stepKey="scrollToPerPage"/> + <selectOption selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" userInput="24" stepKey="selectPerPageOption1"/> + <waitForPageLoad stepKey="waitForPageToLoad10"/> + <seeNumberOfElements selector="{{StorefrontCategoryMainSection.productLink}}" userInput="24" stepKey="seeNumberOfProductsInFirstPage3"/> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="scrollToNextButton2"/> + <click selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="clickOnNextPage2"/> + <waitForPageLoad stepKey="waitForPageToLoad11"/> + <seeNumberOfElements selector="{{StorefrontCategoryMainSection.productLink}}" userInput="6" stepKey="seeNumberOfProductsInSecondPage3"/> + <!--Select First Page using page number--> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.pageNumber('1')}}" stepKey="scrollToPreviousPage5"/> + <click selector="{{StorefrontCategoryBottomToolbarSection.pageNumber('1')}}" stepKey="clickOnFirstPage2"/> + <waitForPageLoad stepKey="waitForPageToLoad13"/> + <!--Select 36 items per page and verify number of products displayed in each page --> + <scrollTo selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" stepKey="scrollToPerPage4"/> + <selectOption selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" userInput="36" stepKey="selectPerPageOption2"/> + <waitForPageLoad stepKey="waitForPageToLoad12"/> + <seeNumberOfElements selector="{{StorefrontCategoryMainSection.productLink}}" userInput="30" stepKey="seeNumberOfProductsInFirstPage4"/> + </test> +</tests> diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/provider.js b/app/code/Magento/Catalog/view/frontend/web/js/product/provider.js index b29ebe7d57d1c..ca9381c45e2ab 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/product/provider.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/product/provider.js @@ -143,7 +143,8 @@ define([ _.each(ids, function (id) { if ( currentTime - id['added_at'] < ~~this.idsStorage.lifetime && - !_.contains(currentProductIds, id['product_id']) + !_.contains(currentProductIds, id['product_id']) && + (!id.hasOwnProperty('website_id') || id['website_id'] === window.checkout.websiteId) ) { _ids[id['product_id']] = id; diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/storage/ids-storage-compare.js b/app/code/Magento/Catalog/view/frontend/web/js/product/storage/ids-storage-compare.js index 2dc6105ca24d5..a904d8ed3b3da 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/product/storage/ids-storage-compare.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/product/storage/ids-storage-compare.js @@ -72,7 +72,8 @@ define([ _.each(data, function (item) { result[item.id] = { 'added_at': new Date().getTime() / 1000, - 'product_id': item.id + 'product_id': item.id, + 'website_id': window.checkout.websiteId }; }); diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/view/provider.js b/app/code/Magento/Catalog/view/frontend/web/js/product/view/provider.js index 9d3746973ef58..f4ce882dd668b 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/product/view/provider.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/product/view/provider.js @@ -90,7 +90,8 @@ define([ _.each(this.data.items, function (item, key) { result[key] = { 'added_at': new Date().getTime() / 1000, - 'product_id': key + 'product_id': key, + 'website_id': window.checkout.websiteId }; }, this); diff --git a/app/code/Magento/Customer/Model/AccountManagement.php b/app/code/Magento/Customer/Model/AccountManagement.php index 985cfe0621bf8..55da6a62f0625 100644 --- a/app/code/Magento/Customer/Model/AccountManagement.php +++ b/app/code/Magento/Customer/Model/AccountManagement.php @@ -68,49 +68,55 @@ class AccountManagement implements AccountManagementInterface /** * Configuration paths for create account email template * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_REGISTER_EMAIL_TEMPLATE = 'customer/create_account/email_template'; /** * Configuration paths for register no password email template * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_REGISTER_NO_PASSWORD_EMAIL_TEMPLATE = 'customer/create_account/email_no_password_template'; /** * Configuration paths for remind email identity * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_REGISTER_EMAIL_IDENTITY = 'customer/create_account/email_identity'; /** * Configuration paths for remind email template * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_REMIND_EMAIL_TEMPLATE = 'customer/password/remind_email_template'; /** * Configuration paths for forgot email email template * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_FORGOT_EMAIL_TEMPLATE = 'customer/password/forgot_email_template'; /** * Configuration paths for forgot email identity * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_FORGOT_EMAIL_IDENTITY = 'customer/password/forgot_email_identity'; /** * Configuration paths for account confirmation required * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management * @see AccountConfirmation::XML_PATH_IS_CONFIRM */ const XML_PATH_IS_CONFIRM = 'customer/create_account/confirm'; @@ -118,42 +124,48 @@ class AccountManagement implements AccountManagementInterface /** * Configuration paths for account confirmation email template * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_CONFIRM_EMAIL_TEMPLATE = 'customer/create_account/email_confirmation_template'; /** * Configuration paths for confirmation confirmed email template * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_CONFIRMED_EMAIL_TEMPLATE = 'customer/create_account/email_confirmed_template'; /** * Constants for the type of new account email to be sent * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED */ const NEW_ACCOUNT_EMAIL_REGISTERED = 'registered'; /** * Welcome email, when password setting is required * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED */ const NEW_ACCOUNT_EMAIL_REGISTERED_NO_PASSWORD = 'registered_no_password'; /** * Welcome email, when confirmation is enabled * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED */ const NEW_ACCOUNT_EMAIL_CONFIRMATION = 'confirmation'; /** * Confirmation email, when account is confirmed * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED */ const NEW_ACCOUNT_EMAIL_CONFIRMED = 'confirmed'; @@ -179,14 +191,15 @@ class AccountManagement implements AccountManagementInterface /** * Configuration path to customer reset password email template * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management + * @see Magento/Customer/Model/EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE */ const XML_PATH_RESET_PASSWORD_TEMPLATE = 'customer/password/reset_password_template'; /** * Minimum password length * - * @deprecated + * @deprecated Get rid of Helpers in Password Security Management */ const MIN_PASSWORD_LENGTH = 6; @@ -526,6 +539,7 @@ public function resendConfirmation($email, $websiteId = null, $redirectUrl = '') // If we are not able to send a new account email, this should be ignored $this->logger->critical($e); } + return true; } /** @@ -671,17 +685,16 @@ public function initiatePasswordReset($email, $template, $websiteId = null) */ private function handleUnknownTemplate($template) { - throw new InputException( - __( - 'Invalid value of "%value" provided for the %fieldName field. Possible values: %template1 or %template2.', - [ - 'value' => $template, - 'fieldName' => 'template', - 'template1' => AccountManagement::EMAIL_REMINDER, - 'template2' => AccountManagement::EMAIL_RESET - ] - ) + $phrase = __( + 'Invalid value of "%value" provided for the %fieldName field. Possible values: %template1 or %template2.', + [ + 'value' => $template, + 'fieldName' => 'template', + 'template1' => AccountManagement::EMAIL_REMINDER, + 'template2' => AccountManagement::EMAIL_RESET + ] ); + throw new InputException($phrase); } /** @@ -713,12 +726,6 @@ public function resetPassword($email, $resetToken, $newPassword) $customerSecure->setRpTokenCreatedAt(null); $customerSecure->setPasswordHash($this->createPasswordHash($newPassword)); $this->destroyCustomerSessions($customer->getId()); - if ($this->sessionManager->isSessionExists()) { - //delete old session and move data to the new session - //use this instead of $this->sessionManager->regenerateId because last one doesn't delete old session - // phpcs:ignore Magento2.Functions.DiscouragedFunction - session_regenerate_id(true); - } $this->customerRepository->save($customer); return true; diff --git a/app/code/Magento/Customer/Model/Visitor.php b/app/code/Magento/Customer/Model/Visitor.php index 6935b9dca7f28..5fa1af69e9bdd 100644 --- a/app/code/Magento/Customer/Model/Visitor.php +++ b/app/code/Magento/Customer/Model/Visitor.php @@ -12,7 +12,8 @@ /** * Class Visitor * - * @package Magento\Customer\Model + * Used to track sessions of the logged in customers + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) */ @@ -173,7 +174,7 @@ public function initByRequest($observer) if ($this->requestSafety->isSafeMethod()) { return $this; } - + if (!$this->getId()) { $this->setSessionId($this->session->getSessionId()); $this->save(); @@ -199,6 +200,9 @@ public function saveByRequest($observer) } try { + if ($this->session->getSessionId() && $this->getSessionId() != $this->session->getSessionId()) { + $this->setSessionId($this->session->getSessionId()); + } $this->save(); $this->_eventManager->dispatch('visitor_activity_save', ['visitor' => $this]); $this->session->setVisitorData($this->getData()); diff --git a/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php b/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php index ad52f81bf8eda..2ee34b6b4c5b1 100644 --- a/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php +++ b/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php @@ -85,6 +85,8 @@ public function apply() private function sliceItems(array $items, int $size, int $currentPage): array { if ($size !== 0) { + $totalPages = (int) ceil(count($items)/$size); + $currentPage = min($currentPage, $totalPages); $offset = ($currentPage - 1) * $size; if ($offset < 0) { $offset = 0;