Hi there,
I've struggling with this all day, i'm trying to reorder the sources of a product in the admin view, by default the sources are ordered alphabetically ascending, and i need them to be alphabetically descending.
I tried to do this with a plugin on the dataprovider, according to:
vendor/magento/module-inventory-catalog-admin-ui/view/adminhtml/ui_component/product_form.xml
is:
"Magento\InventoryAdminUi\Ui\DataProvider\SourceDataProvider"and then in the plugin an
afterGetData()method, BUT is not working, i'm debugging and the dataprovider i'm catching according to my logs is:
[2024-12-26T20:02:16.430+00:00] INFO: [9d0c7590072a] CustomSortOrderPlugin: Current DataProvider: {"name":"catalogstaging_upcoming_grid_data_source","class":"Magento\\Framework\\View\\Element\\UiComponent\\DataProvider\\DataProvider\\Interceptor"}
This is my app/code/Vendor/Module/etc/adminhtml/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
<plugin name="custom_sort_order_plugin" type="Vendor\Module\Plugin\CustomSortOrderPlugin"/>
</type>
<type name="Magento\InventoryAdminUi\Ui\DataProvider\SourceDataProvider">
<plugin name="custom_sort_order_source_plugin" type="Vendor\Module\Plugin\CustomSortOrderPlugin"/>
</type>
</config>
And the plugin:
<?php
namespace Vendor\Module\Plugin;
use Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider;
use Vendor\Logging\Logger\VendorLogger;
class CustomSortOrderPlugin
{
public function __construct(private readonly VendorLogger $logger)
{
$this->logger->init('custom-source-data-provider');
$this->logger->info('CustomSourceDataProvider instantiated');
}
public function afterGetData(DataProvider $subject, array $result): array
{
// Log all provider names for debugging
$this->logger->info('CustomSortOrderPlugin: Current DataProvider: ' . json_encode([
'name' => $subject->getName(),
'class' => get_class($subject)
]));
// List of possible inventory source data provider names
$validProviders = [
'inventory_source_listing_data_source',
'product_form.product_form_source_listing',
'product_form.sources',
'inventory_low_quantity_notification_stock_grid_data_source'
];
if (in_array($subject->getName(), $validProviders)) {
$this->logger->info('CustomSortOrderPlugin: Found matching provider: ' . json_encode([
'provider' => $subject->getName()
]));
if (!empty($result['items'])) {
$this->logger->info('CustomSortOrderPlugin: Before sorting: ' . json_encode([
'items' => array_column($result['items'], 'name')
]));
usort($result['items'], function ($a, $b) {
return strcasecmp($b['name'], $a['name']); // Descending order
});
// Reindex the array
$result['items'] = array_values($result['items']);
$this->logger->info('CustomSortOrderPlugin: After sorting: ' . json_encode([
'items' => array_column($result['items'], 'name')
]));
} else {
$this->logger->info('CustomSortOrderPlugin: Result items is empty: ' . json_encode([
'result_keys' => array_keys($result)
]));
}
}
return $result;
}
}Any ideas??? thanks!