当前位置: 技术文章>> 如何在管理产品网格中添加库存状态列 Magento 2

文章标题:如何在管理产品网格中添加库存状态列 Magento 2
  • 文章分类: Magento
  • 16962 阅读
系统学习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中添加库存状态列的步骤。


推荐文章