Я пытаюсь добавить новый столбец для заказа сетки в Magento 2.0. Итак, мне нужно сделать соединение, чтобы заказать сбор сетки. Как мне этого добиться? Потому что в magento2 сетка использует компонент пользовательского интерфейса.
источник
Я пытаюсь добавить новый столбец для заказа сетки в Magento 2.0. Итак, мне нужно сделать соединение, чтобы заказать сбор сетки. Как мне этого добиться? Потому что в magento2 сетка использует компонент пользовательского интерфейса.
Magento 2 добавляет пользовательские столбцы в сетку заказов на продажу,
Присоединиться
Magento \ Sales \ Order \ Сетка \ Коллекция
к любой таблице (таблицам), использование плагина было бы лучшим вариантом, так как это не полагается на переписывание и делает код легким.
Создайте плагин в вашем модуле etc / di.xml
<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>
Итак, мы перехватываем
Magento \ Framework \ View \ Элемент \ UIComponent \ DataProvider \ CollectionFactory
потому что если вы посмотрите на
Magento \ Sales \ и т.д. \ di.xml
вы бы увидели
Magento \ Sales \ Order \ Сетка \ Коллекция
был введен в
Magento \ Framework \ View \ Элемент \ UIComponent \ DataProvider \ CollectionFactory
Создайте папку Plugin и класс плагина в вашем модуле
<?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;
}
}
Здесь мы наблюдаем вокруг события метода getReport ().
копия
продавец / Magento / модуль-продажа / просмотр / adminhtml / ui_component / sales_order_grid.xml
в область вашего модуля
Производитель / ModuleName / вид / adminhtml / ui_component / sales_order_grid.xml
Удалите все содержимое вашего скопированного sales_order_grid.xml, поскольку мы не хотим перезаписывать все содержимое.
Введите следующий код в свой модуль 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">
<!-- 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>
Теперь удалите кеш из папки var / cache или обновите кеш. Вы сможете увидеть добавленные столбцы в сетке заказов на продажу.
["soi" => "sales_order_item"]
и["soa" => "sales_order_address"]
.Когда вы смотрите на
\Magento\Framework\Data\Collection\AbstractDb
сам magento2, предоставьте возможность подключения к вашей коллекции.Итак, что вам нужно сделать, просто добавив в свою коллекцию [
NAMESPACE\MODULENAME\Model\ResourceModel\YOUR_CLASSNAME\Grid\Collection
]источник
_renderFiltersBefore
вы также можете переопределить / расширить_initSelect
.Я создал сетку администратора, которая имеет объединение двух пользовательских таблиц. вы не можете сделать это с помощью виртуального типа di.xml, поэтому вам нужно выполнить следующие шаги и обновить
и т.д. / di.xml,
Model / Resource / Modulename / Collection.php добавить объединение в этот файл,
Модель / Resource / MODULENAME / Сетка / Collection.php,
В вашем etc / di.xml
В вашей модели / Ресурс / Modulename / Collection.php
В вашей модели / ресурс / имя модуля / сетка / коллекция.php
источник
В определении пользовательского интерфейса xml есть узел источника данных, подобный этому
где
listing_name_data_source
можно определить в вашемdi.xml
классе или просто ссылаться на класс напрямую. Сам класс должен расширятьсяMagento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory
и иметь в качествеcollections
аргумента вашу пользовательскую коллекцию. В_initSelect()
методе этого класса коллекции вы можете объединить свои таблицы.источник
Для тех, у кого есть проблемы с решением @Asrar, просто сделайте это:
Это, кажется, работает хорошо для меня.
источник