{ Hello Magento 2 }

解决 Magento 2 应用问题,更注重深度挖掘。(ง •̀_•́)ง

0%

后台产品的数量是如何加到 column 中的

product catalog qty 这一列是特别的。 首先我们知道产品列表的 url 是 .../admin/catalog/product/index/... 那么顺着找到对应的 layout 文件 vendor\magento\module-catalog\view\adminhtml\layout\catalog_product_index.xml。在该 layout 文件中可以看到列表的主体部分是由 ui component 实现的。

1
2
3
...
<uiComponent name="product_listing"/>
...

product_listing.xml 有两处,主体位于 vendor\magento\module-catalog\view\adminhtml\ui_component\product_listing.xml ,另一处在 vendor\magento\module-catalog-inventory\view\adminhtml\ui_component\product_listing.xml 而位于 catalog inventory 模块中的 product_listing.xml 正是产品的 quantity 列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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="product_columns" class="Magento\Catalog\Ui\Component\Listing\Columns">
<column name="qty">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">textRange</item>
<item name="add_field" xsi:type="boolean">true</item>
<item name="label" xsi:type="string" translate="true">Quantity</item>
<item name="sortOrder" xsi:type="number">75</item>
</item>
</argument>
</column>
</columns>
</listing>

但是如果你深扒的话,一定会发现 那么 collection 中的 qty 是从哪里来的? 在 catalog-inventory 的 etc/adminhtml/di.xml 中可以找到:

1
2
3
4
5
6
7
8
9
10
<type name="Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider">
<arguments>
<argument name="addFieldStrategies" xsi:type="array">
<item name="qty" xsi:type="object">Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFieldToCollection</item>
</argument>
<argument name="addFilterStrategies" xsi:type="array">
<item name="qty" xsi:type="object">Magento\CatalogInventory\Ui\DataProvider\Product\AddQuantityFilterToCollection</item>
</argument>
</arguments>
</type>

深入的查看下 AddQuantityFieldToCollection 这个类

1
2
3
4
5
6
7
8
9
10
11
public function addField(Collection $collection, $field, $alias = null)
{
$collection->joinField(
'qty',
'cataloginventory_stock_item',
'qty',
'product_id=entity_id',
'&#123;&#123;table&#125;&#125;.stock_id=1',
'left'
);
}

每个 vendor\magento\module-ui\Component\Listing\Columns\Column.php 对象会调用 prepare() > 调用 addFieldToSelect() $this->getContext()->getDataProvider()->addField($this->getName()); ProductDataProvider 调用他的 addField() 就加入了 qty