如果要在列中显示的值是产品属性,则可以轻松地将列添加到产品网格中。它们已存在于“列控件”下的“产品网格”工具栏中。您只需选中/取消选中要在网格中显示或删除的列。但是,如果您想显示数量和网站等非产品属性的值,该怎么办?在这篇博客中,您将学习如何将这样的值添加到产品网格中。
介绍
由于可以打开/关闭每个产品的库存管理,我们将向产品网格添加一个新列,如果库存管理已打开或关闭,将显示该列。
对于所有的代码示例,我创建了一个名为Magease_Custom的MaMeto 2模块。
重要的是Magento的Magento_Catalog模块在我们的模块之前加载,这就是我们将在module.xml文件中的序列标签下添加它的原因。
app/code/Magease/Custom/etc/module.xml
<?xml version="1.0" encoding="utf-8" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Magease_Custom" setup_version="1.0.0">
<sequence>
<module name="Magento_Catalog"/>
</sequence>
</module>
</config>
编辑module.xml后,我们需要使用console命令更新app/etc/config.php文件:
php bin/magento setup:upgrade
产品列表UI组件实例
为了呈现产品网格,Magneto 2使用名为product_listing的列表 UI组件实例和XML配置文件,它是Magento_Catalog/view/adminhtml/ui_component/product_listing.xml。如果我们想要自定义它,我们需要在模块中创建一个具有相同路径和名称的文件。
app/code/Magease/Custom/view/adminhtml/ui_component/product_listing.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="product_columns">
<column name="manage_stock" component="Magento_Ui/js/grid/columns/select" sortOrder="76">
<settings>
<addField>true</addField>
<options class="Magento\Config\Model\Config\Source\Yesno"/>
<filter>select</filter>
<dataType>select</dataType>
<sortable>false</sortable>
<label translate="true">Manage Stock</label>
</settings>
</column>
</columns>
</listing>
要添加新列,我们需要从原始配置文件中引用名为product_columns的列 UI组件,并将新列添加到其中。我们命名我们的专栏manage_stock与标签管理库存。
运行此控制台命令以清除缓存:
php bin/magneto cache:clean config
在我们清理缓存之后,我们应该在产品网格中看到我们的新列但是没有数据,这是因为我们没有将库存管理数据添加到产品集合中。
产品列表数据提供商
将库存管理数据添加到产品集合的最佳位置是product_listing UI组件实例使用的数据提供程序类。
Magento_Catalog/view/adminhtml/ui_component/product_listing.xml
<dataSource name="product_listing_data_source" component="Magento_Ui/js/grid/provider">
<settings>
<storageConfig>
<param name="dataScope" xsi:type="string">filters.store_id</param>
</storageConfig>
<updateUrl path="mui/index/render"/>
</settings>
<aclResource>Magento_Catalog::products</aclResource>
<dataProvider class="Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider" name="product_listing_data_source">
<settings>
<requestFieldName>id</requestFieldName>
<primaryFieldName>entity_id</primaryFieldName>
</settings>
</dataProvider>
</dataSource>
如果我们查看dataSource UI组件,我们将看到dataProvider类是Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider.
如果我们查看这个数据提供程序类,我们将看到两个属性addFieldStrategies和addFilterStrategies,它们都是数组。我们可以对特定列(字段)的集合执行其他策略,它们分别在数据提供者的addField和addFilter方法中调用,我们将为我们的库存管理专栏创建自己的策略。
管理库存领域战略
首先,我们将创建一个现场策略,将库存管理状态添加到产品集合中。
Magease\Custom\Ui\DataProvider\Product\AddManageStockFieldToCollection
<?php
namespace Magease\Custom\Ui\DataProvider\Product;
class AddManageStockFieldToCollection implements \Magento\Ui\DataProvider\AddFieldToCollectionInterface
{
public function addField(\Magento\Framework\Data\Collection $collection, $field, $alias = null)
{
$collection->joinField(
'manage_stock',
'cataloginventory_stock_item',
'manage_stock',
'product_id=entity_id',
null,
'left'
);
}
}
在AddManageStockFieldToCollection字段策略中,我们从Magento\Ui\DataProvider\AddFieldToCollectionInterface接口实现了addField方法。库存管理的状态来自该manage_stock列cataloginventory_stock_item数据库表。我们使用此信息和Magento\Eav\Model\Entity\Collection\AbstractCollection::joinField方法将库存管理状态添加到产品集合中。
管理库存过滤策略
当有人想要通过库存管理状态过滤网格数据时,我们需要创建这种过滤策略。
Magease\自定义\ UI \ DataProvider的\产品\ AddManageStockFilterToCollection
<?php
namespace Magease\Custom\Ui\DataProvider\Product;
class AddManageStockFilterToCollection implements \Magento\Ui\DataProvider\AddFilterToCollectionInterface
{
public function addFilter(\Magento\Framework\Data\Collection $collection, $field, $condition = null)
{
if (isset($condition['eq'])) {
$collection->addFieldToFilter($field, $condition);
}
}
}
在AddManageStockFilterToCollection过滤器策略中,我们从Magento\Ui\DataProvider\AddFilterToCollectionInterface实现了addFilter方法。如果网格被库存管理状态过滤,我们会将过滤器转换转发到Magento\Eav\Model\Entity\Collection\AbstractCollection::addFieldToFilter方法。
将策略添加到产品列表数据提供程序
如果我们想要使用刚刚创建的策略,我们需要将它们添加到product_listing数据提供程序。我们将在di.xml文件中执行 此操作。
app/code/Magease/Custom/etc/adminhtml/di.xml
<?xml version="1.0" encoding="utf-8" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider">
<arguments>
<argument name="addFieldStrategies" xsi:type="array">
<item name="manage_stock" xsi:type="object">Magease\Custom\Ui\DataProvider\Product\AddManageStockFieldToCollection</item>
</argument>
<argument name="addFilterStrategies" xsi:type="array">
<item name="manage_stock" xsi:type="object">Magease\Custom\Ui\DataProvider\Product\AddManageStockFilterToCollection</item>
</argument>
</arguments>
</type>
</config>
运行此控制台命令以清除缓存:
php bin/magneto cache:clean config
清理缓存后,我们应该在产品网格中看到包含数据的新列