系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》
本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。
在管理产品网格Magento 2中添加库存状态列的步骤:
第 1 步:首先,我们需要在以下路径上在扩展中创建一个“di.xml”文件:
app\code\Vendor\Extension\etc
现在,添加以下代码:
<?xml version="1.0"?> <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"> <plugin name="join_product_grid_with_stock_status" type="Vender\Extension\Plugin\Ui\DataProvider\Product\ProductDataProvider" sortOrder="100" /> </type> </config>
步骤2: 之后,我们需要 在以下扩展名的文件夹路径内创建一个“ProductDataProvider.php”文件:
app\code\Vendor\Extension\Plugin\Ui\DataProvider\Product
然后添加以下代码:
<?php
namespace Vender\Extension\Plugin\Ui\DataProvider\Product;
class ProductDataProvider
{
/**
* @param \Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider $subject
* @param \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection $collection
* @return mixed
*/
public function afterGetCollection(
\Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider $subject,
$collection)
{
$columns = $collection->getSelect()->getPart(\Zend_Db_Select::COLUMNS);
if (!$collection->isLoaded() && !$this->checkJoin($columns))
{
$collection->joinTable(
'cataloginventory_stock_status',
'product_id=entity_id',
["stock_status" => "stock_status"],
null ,
'left'
)->addAttributeToSelect('stock_status');
}
return $collection;
}
/**
* @param array $columns
* @return bool
*/
private function checkJoin($columns)
{
foreach ($columns as $column)
{
if(is_array($column))
{
if(in_array('stock_status', $column))
{
return true;
}
}
}
return false;
}
}步骤3:之后,我们需要在以下扩展名文件夹路径内创建一个“product_listing.xml”文件:
app\code\Vendor\Extension\view\adminhtml\ui_component
之后添加代码,如下所示:
<?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">
<listingToolbar name="listing_top">
<filters name="listing_filters">
<filterSelect name="stock_status" provider="${ $.parentName }">
<settings>
<options class="Vender\Extension\Ui\Component\Listing\Columns\StockStatus\Options"/>
<label translate="true">Stock Status</label>
<dataScope>stock_status</dataScope>
</settings>
</filterSelect>
</filters>
</listingToolbar>
<columns name="product_columns">
<column name="stock_status" class="Vender\Extension\Ui\Component\Listing\Columns\StockStatus" sortOrder="900">
<settings>
<addField>true</addField>
<filter>select</filter>
<options class="Vender\Extension\Ui\Component\Listing\Columns\StockStatus\Options"/>
<label translate="true">Stock Status</label>
<dataType>select</dataType>
</settings>
</column>
</columns>
</listing>步骤4: 之后,我们需要在以下扩展名文件夹路径内创建一个“StockStatus.php”文件:
app\code\Vendor\Extension\Ui\Component\Listing\Columns
接下来,添加以下代码:
<?php
namespace Vender\Extension\Ui\Component\Listing\Columns;
class StockStatus extends \Magento\Ui\Component\Listing\Columns\Column
{
/**
* Column name
*/
const NAME = 'column.stock_status';
/**
* Prepare Data Source
*
* @param array $dataSource
* @return array
*/
public function prepareDataSource(array $dataSource)
{
if (isset($dataSource['data']['items']))
{
$fieldName = $this->getData('name');
foreach ($dataSource['data']['items'] as & $item)
{
if (isset($item[$fieldName]))
{
$item[$fieldName] = $this->getStatus($item[$fieldName]);
}
}
}
return $dataSource;
}
/**
* @param $status
* @return \Magento\Framework\Phrase
*/
private function getStatus($status)
{
if($status == 1)
{
return __('In Stock');
}
else
{
return __('Out of Stock');
}
}
}步骤5: 最后,我们需要在以下扩展名的文件夹路径中创建“Options.php”文件:
app\code\Vendor\Extension\Ui\Component\Listing\Columns\StockStatus
最后,添加代码,如下所述:
<?php
namespace Vender\Extension\Ui\Component\Listing\Columns\StockStatus;
use Magento\Framework\Data\OptionSourceInterface;
class Options implements OptionSourceInterface
{
/**
* @var array
*/
protected $options;
/**
* Get options
*
* @return array
*/
public function toOptionArray()
{
if ($this->options !== null)
{
return $this->options;
}
$this->options = [
[
'label' => __('In Stock'),
'value' => 1
],
[
'label' => __('Out of Stock'),
'value' => 0
]
];
return $this->options;
}
}结语:
因此,每个人都已成功执行了在管理产品网格Magento 2中添加库存状态列的步骤。