系统学习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中添加库存状态列的步骤。