这一列是特别的。 首先我们知道产品列表的 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', '{{table}}.stock_id=1', 'left' ); }
|
每个 vendor\magento\module-ui\Component\Listing\Columns\Column.php 对象会调用 prepare()
> 调用 addFieldToSelect()
$this->getContext()->getDataProvider()->addField($this->getName()); ProductDataProvider 调用他的 addField() 就加入了 qty