Skip to content
Open
30 changes: 30 additions & 0 deletions app/code/Magento/Catalog/Model/Config/Source/SortOrder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php
/**
* Copyright 2025 Adobe
* All Rights Reserved.
*/
declare(strict_types=1);

/**
* Catalog Product List Sort Order
*
*/
namespace Magento\Catalog\Model\Config\Source;

use Magento\Catalog\Model\ResourceModel\Product\Collection;

class SortOrder implements \Magento\Framework\Data\OptionSourceInterface
{
/**
* Retrieve option values array
*
* @return array
*/
public function toOptionArray(): array
{
return [
['value' => Collection::SORT_ORDER_ASC, 'label' => __('Ascending')],
['value' => Collection::SORT_ORDER_DESC, 'label' => __('Descending')],
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@
<data key="path">catalog/frontend/list_allow_all</data>
<data key="value">1</data>
</entity>
<entity name="CustomStoreFrontProductsSortByOrder">
<data key="path">catalog/frontend/default_sort_by_order</data>
<data key="value">DESC</data>
</entity>
<entity name="DefaultListMode">
<data key="path">catalog/frontend/list_mode</data>
<data key="value">grid-list</data>
Expand All @@ -125,4 +129,8 @@
<data key="path">catalog/frontend/list_allow_all</data>
<data key="value">0</data>
</entity>
</entities>
<entity name="DefaultStoreFrontProductsSortByOrder">
<data key="path">catalog/frontend/default_sort_by_order</data>
<data key="value">ASC</data>
</entity>
</entities>
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
</createData>
<magentoCLI command="config:set {{CustomGridPerPageValuesConfigData.path}} {{CustomGridPerPageValuesConfigData.value}}" stepKey="setCustomGridPerPageValues"/>
<magentoCLI command="config:set {{CustomGridPerPageDefaultConfigData.path}} {{CustomGridPerPageDefaultConfigData.value}}" stepKey="setCustomGridPerPageDefaults"/>
<magentoCLI command="config:set {{DefaultStoreFrontProductsSortByOrder.path}} {{DefaultStoreFrontProductsSortByOrder.value}}" stepKey="setDefaultSortByOrderValue"/>
</before>
<after>
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Copyright 2020 Adobe
* All Rights Reserved.
*/
-->
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
<test name="StorefrontProductSortByPositionInDescOrderTest">
<annotations>
<stories value="Sort Products having same position on Storefront In Desc Order"/>
<title value="Sort products with the same position in descending order appropriately"/>
<description value="Use store configuration to sort products of same position in desc order"/>
<severity value="MAJOR"/>
<testCaseId value="AC-14411"/>
<group value="Catalog"/>
</annotations>
<before>
<createData entity="_defaultCategory" stepKey="createCategory"/>
<createData entity="productAlphabeticalA" stepKey="product1">
<requiredEntity createDataKey="createCategory"/>
</createData>
<createData entity="productAlphabeticalB" stepKey="product2">
<requiredEntity createDataKey="createCategory"/>
</createData>
<magentoCLI command="config:set {{CustomStoreFrontProductsSortByOrder.path}} {{CustomStoreFrontProductsSortByOrder.value}}" stepKey="setCustomSortByOrderValue"/>
<actionGroup ref="CliIndexerReindexActionGroup" stepKey="reindex">
<argument name="indices" value=""/>
</actionGroup>
</before>
<after>
<deleteData stepKey="deleteProduct1" createDataKey="product1"/>
<deleteData stepKey="deleteProduct2" createDataKey="product2"/>
<deleteData stepKey="deleteCategory" createDataKey="createCategory"/>
<magentoCLI command="config:set {{DefaultStoreFrontProductsSortByOrder.path}} {{DefaultStoreFrontProductsSortByOrder.value}}" stepKey="setDefaultSortByOrderValue"/>
</after>

<actionGroup ref="StorefrontNavigateToCategoryUrlActionGroup" stepKey="NavigateToCategoryPageOnStoreFront">
<argument name="categoryUrl" value="$$createCategory.custom_attributes[url_key]$$"/>
</actionGroup>
<actionGroup ref="StorefrontQuickSearchCheckProductNameInGridActionGroup" stepKey="assertProduct1Position">
<argument name="productName" value="$product1.name$"/>
<argument name="index" value="2"/>
</actionGroup>
<actionGroup ref="StorefrontQuickSearchCheckProductNameInGridActionGroup" stepKey="assertProduct2Position">
<argument name="productName" value="$product2.name$"/>
<argument name="index" value="1"/>
</actionGroup>
</test>
</tests>
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
</annotations>
<before>
<!-- Step1: Login as Admin -->
<magentoCLI command="config:set {{DefaultStoreFrontProductsSortByOrder.path}} {{DefaultStoreFrontProductsSortByOrder.value}}" stepKey="setDefaultSortByOrderValue"/>
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
</before>
<after>
Expand Down
5 changes: 5 additions & 0 deletions app/code/Magento/Catalog/etc/adminhtml/system.xml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,11 @@
<comment>Applies to category pages.</comment>
<source_model>Magento\Catalog\Model\Config\Source\ListSort</source_model>
</field>
<field id="default_sort_by_order" translate="label comment" type="select" sortOrder="6" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">
<label>Product Listing Sort by Order</label>
<comment>Applies to category pages.</comment>
<source_model>Magento\Catalog\Model\Config\Source\SortOrder</source_model>
</field>
<field id="list_allow_all" translate="label comment" type="select" sortOrder="6" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">
<label>Allow All Products per Page</label>
<comment>Whether to show "All" option in the "Show X Per Page" dropdown.</comment>
Expand Down
1 change: 1 addition & 0 deletions app/code/Magento/Catalog/etc/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<flat_catalog_category>0</flat_catalog_category>
<flat_catalog_product>0</flat_catalog_product>
<default_sort_by>position</default_sort_by>
<default_sort_by_order>ASC</default_sort_by_order>
<list_allow_all>0</list_allow_all>
<parse_url_directives>1</parse_url_directives>
<remember_pagination>0</remember_pagination>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,12 @@ protected function _beforeLoad()
* for the same requests and products with the same relevance
* NOTE: this does not replace existing orders but ADDs one more
*/
$this->setOrder('entity_id', Select::SQL_ASC);
$defaultSortOrder = $this->_scopeConfig->getValue(
'catalog/frontend/default_sort_by_order',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
);
$sortOrder = ($defaultSortOrder == self::SORT_ORDER_ASC) ? Select::SQL_ASC : Select::SQL_DESC;
$this->setOrder('entity_id', $sortOrder);
return parent::_beforeLoad();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
<argument name="value" value="{{_defaultProduct.name}}"/>
</actionGroup>
<actionGroup ref="SaveProductFormActionGroup" stepKey="saveProduct2b"/>
<magentoCLI command="config:set {{DefaultStoreFrontProductsSortByOrder.path}} {{DefaultStoreFrontProductsSortByOrder.value}}" stepKey="setDefaultSortByOrderValue"/>
<actionGroup ref="CliIndexerReindexActionGroup" stepKey="reindex">
<argument name="indices" value=""/>
</actionGroup>
Expand Down