Solución:
Después de investigar mucho el código central de Magento, encontré una solución a mi pregunta. En lugar de agregar una columna a la cuadrícula a través de la base de datos, creé un componente de interfaz de usuario sales_order_grid.xml
debajo [COMPANY]/[MODULE]/view/adminhtml/ui_component/sales_order_grid.xml
<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<columns name="sales_order_columns">
<column name="export_status" class="[COMPANY][MODULE]UiComponentListingColumnStatus">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="visible" xsi:type="boolean">true</item>
<item name="label" xsi:type="string" translate="true">XML Exported</item>
</item>
</argument>
</column>
</columns>
</listing>
Luego creó la clase de interfaz de usuario en [COMPANY]/[MODULE]/Ui/Component/Listing/Column/Status.php
namespace [COMPANY][MODULE]UiComponentListingColumn;
use MagentoSalesApiOrderRepositoryInterface;
use MagentoFrameworkViewElementUiComponentContextInterface;
use MagentoFrameworkViewElementUiComponentFactory;
use MagentoUiComponentListingColumnsColumn;
use MagentoFrameworkApiSearchCriteriaBuilder;
class Status extends Column
{
protected $_orderRepository;
protected $_searchCriteria;
public function __construct(ContextInterface $context, UiComponentFactory $uiComponentFactory, OrderRepositoryInterface $orderRepository, SearchCriteriaBuilder $criteria, array $components = [], array $data = [])
{
$this->_orderRepository = $orderRepository;
$this->_searchCriteria = $criteria;
parent::__construct($context, $uiComponentFactory, $components, $data);
}
public function prepareDataSource(array $dataSource)
{
if (isset($dataSource['data']['items'])) {
foreach ($dataSource['data']['items'] as & $item) {
$order = $this->_orderRepository->get($item["entity_id"]);
$status = $order->getData("export_status");
switch ($status) {
case "0":
$export_status = "No";
break;
case "1";
$export_status = "Yes";
break;
default:
$export_status = "Failed";
break;
}
// $this->getData('name') returns the name of the column so in this case it would return export_status
$item[$this->getData('name')] = $export_status;
}
}
return $dataSource;
}
}
Mi solución puede ser un poco más eficiente, ya que sigue la forma nativa de agregar una columna a la cuadrícula, y no tendrá que cargar todos los pedidos que se muestran en la página para obtener los datos de la columna (utilizando el sales_order_grid mesa en su lugar). Sin embargo, lo anterior es un gran ejemplo de cómo crear un renderizador personalizado.
vendedor/[vendor]/[package]/view/adminhtml/ui_component/sales_order_grid.xml
<!-- Add the column "my_column" (My Column) to the sales order grid. -->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<columns name="sales_order_columns">
<column name="my_column">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">My Column</item>
</item>
</argument>
</column>
</columns>
Tenga en cuenta que debe habilitar la columna mediante el widget desplegable sobre la cuadrícula de pedidos antes de que aparezca.
vendedor/[vendor]/[package]/etc/di.xml
<!-- Sync the column "my_column" between the sales_order and sales_order_grid tables -->
<virtualType name="MagentoSalesModelResourceModelOrderGrid" type="MagentoSalesModelResourceModelGrid">
<arguments>
<argument name="columns">
<item name="my_column" xsi:type="string">sales_order.my_column</item>
</argument>
</arguments>
</virtualType>
Ejemplo de código de configuración para agregar una columna a la tabla sales_order_grid (utilícelo en su secuencia de comandos de instalación / actualización). Por cierto, el mismo código funciona para la tabla sales_order.
$setup->getConnection()->addColumn(
$setup->getTable('sales_order_grid'),
'my_column',
[
'type' => MagentoFrameworkDBDdlTable::TYPE_TEXT,
'length' => 255,
'nullable' => true,
'comment' => 'My Column'
]
);
¡Espero eso ayude! 🙂