Estoy tratando de agregar una nueva columna para ordenar la cuadrícula en Magento 2.0. Entonces, necesito unirme para ordenar la colección de cuadrículas. Cómo puedo conseguir esto ? Porque, en magento2, la cuadrícula usa el componente UI.
fuente
Estoy tratando de agregar una nueva columna para ordenar la cuadrícula en Magento 2.0. Entonces, necesito unirme para ordenar la colección de cuadrículas. Cómo puedo conseguir esto ? Porque, en magento2, la cuadrícula usa el componente UI.
Magento 2 agrega columnas personalizadas a la cuadrícula de pedidos de ventas,
Unir
Magento \ Sales \ Order \ Grid \ Collection
para cualquier tabla (s), usar el complemento sería la mejor opción ya que esto no se basa en reescrituras y hace que el código sea sencillo.
Cree el complemento en el etc / di.xml de su módulo
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
<plugin name="sales_order_additional_columns" type="Vendor\ModuleName\Plugins\AddColumnsSalesOrderGridCollection" sortOrder="100" disabled="false" />
</type>
Entonces, estamos interceptando
Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ CollectionFactory
porque si miras el
Magento \ Sales \ etc \ di.xml
tu verias
Magento \ Sales \ Order \ Grid \ Collection
fue inyectado en
Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ CollectionFactory
Cree una carpeta de complementos y una clase de complemento en su módulo
<?php namespace Vendor\ModuleName\Plugins;
use Magento\Framework\Message\ManagerInterface as MessageManager;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as SalesOrderGridCollection;
class AddColumnsSalesOrderGridCollection
{
private $messageManager;
private $collection;
public function __construct(MessageManager $messageManager,
SalesOrderGridCollection $collection
) {
$this->messageManager = $messageManager;
$this->collection = $collection;
}
public function aroundGetReport(
\Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
\Closure $proceed,
$requestName
) {
$result = $proceed($requestName);
if ($requestName == 'sales_order_grid_data_source') {
if ($result instanceof $this->collection
) {
$select = $this->collection->getSelect();
$select->join(
["soi" => "sales_order_item"],
'main_table.entity_id = soi.order_id AND soi.product_type="simple"',
array('weight', 'product_type')
)
->distinct();
$select->join(
["soa" => "sales_order_address"],
'main_table.entity_id = soa.parent_id AND soa.address_type="shipping"',
array('email', 'country_id', 'postcode', 'city', 'telephone')
)
->distinct();
}
}
return $this->collection;
}
}
Aquí estamos observando alrededor del evento del método getReport ().
Copiar
vendor / magento / module-sales / view / adminhtml / ui_component / sales_order_grid.xml
al alcance de su módulo
Proveedor / ModuleName / view / adminhtml / ui_component / sales_order_grid.xml
Elimine todo el contenido de su sales_order_grid.xml copiado ya que no queremos anular todo el contenido.
Ingrese el siguiente código en sales_order_grid.xml de su módulo
<?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">
<!-- sales_order_item weight -->
<column name="weight">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Weight</item>
<item name="sortOrder" xsi:type="number">222</item>
<item name="align" xsi:type="string">right</item>
<item name="filter" xsi:type="string">text</item>
<item name="visible" xsi:type="boolean">true</item>
<!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
</item>
</argument>
</column>
<!-- sales_order_item product_type-->
<column name="product_type">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Vendor\ModuleName\Ui\Component\Listing\Column\ProductTypes</item>
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Product Type</item>
<item name="sortOrder" xsi:type="number">232</item>
<item name="align" xsi:type="string">right</item>
<!--<item name="filter" xsi:type="string">select</item>-->
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
<item name="dataType" xsi:type="string">select</item>
<item name="visible" xsi:type="boolean">true</item>
<!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
</item>
</argument>
</column>
<!-- sales_order_address country_id -->
<column name="country_id">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Country ID</item>
<item name="sortOrder" xsi:type="number">242</item>
<item name="align" xsi:type="string">right</item>
<item name="filter" xsi:type="string">text</item>
<item name="visible" xsi:type="boolean">true</item>
<!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
</item>
</argument>
</column>
<!-- sales_order_address post_code -->
<column name="postcode">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Postcode</item>
<item name="sortOrder" xsi:type="number">252</item>
<item name="align" xsi:type="string">right</item>
<item name="filter" xsi:type="string">text</item>
<item name="visible" xsi:type="boolean">true</item>
<!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
</item>
</argument>
</column>
<!-- sales_order_address city -->
<column name="city">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">City</item>
<item name="sortOrder" xsi:type="number">252</item>
<item name="align" xsi:type="string">right</item>
<item name="filter" xsi:type="string">text</item>
<item name="visible" xsi:type="boolean">true</item>
<!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
</item>
</argument>
</column>
<!-- sales_order_address telephone -->
<column name="telephone">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Telephone</item>
<item name="sortOrder" xsi:type="number">252</item>
<item name="align" xsi:type="string">right</item>
<item name="filter" xsi:type="string">text</item>
<item name="visible" xsi:type="boolean">true</item>
<!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
</item>
</argument>
</column>
</columns>
</listing>
Ahora, elimine el caché de la carpeta var / cache o actualice su caché. Podrá ver las columnas agregadas en la cuadrícula de pedidos de ventas.
["soi" => "sales_order_item"]
y["soa" => "sales_order_address"]
.Cuando miras a
\Magento\Framework\Data\Collection\AbstractDb
magento2 en sí mismo, proporciona una operación de gancho para tu colección.Entonces, lo que necesita hacer esto simplemente agregando en su colección [
NAMESPACE\MODULENAME\Model\ResourceModel\YOUR_CLASSNAME\Grid\Collection
]fuente
_renderFiltersBefore
, también puede anular / extender_initSelect
.Creé la grilla de administración que tiene una combinación de dos tablas personalizadas. no puede hacer esto usando el tipo virtual es di.xml, por lo que debe seguir estos pasos y actualizar su
etc / di.xml,
Model / Resource / Modulename / Collection.php add join en este archivo,
Model / Resource / Modulename / Grid / Collection.php,
EN su etc / di.xml
EN su Modelo / Recurso / Nombre del módulo / Colección.php
EN su Modelo / Recurso / Nombre del módulo / Cuadrícula / Colección.php
fuente
En la definición de interfaz de usuario xml hay un nodo de fuente de datos similar a este
donde
listing_name_data_source
se puede definir en sudi.xml
o simplemente hacer referencia a una clase directamente. La clase en sí debe extenderseMagento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory
y tener comocollections
argumento su colección personalizada. En el_initSelect()
método de esa clase de colección puedes unir tus tablas.fuente
Para cualquiera que tenga problemas con la solución @Asrar , simplemente haga esto:
Esto parece estar funcionando bien para mí.
fuente