In magento 2 admin custom field value stored in db but when edit a product edit page custom field came empty, how to solve this
-
28-02-2021 - |
Question
app/code/Cm/Preoder/view/adminhtml/ui_component/product_form.xml
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<modal name="advanced_inventory_modal">
<fieldset name="stock_data">
<container name="container_backorders">
<field name="backorders">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="component" xsi:type="string">Cm_Preorder/js/backorders</item>
</item>
</argument>
</field>
</container>
<field name="preorder_button">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true"> Pre-Order Cart Button</item>
<item name="scopeLabel" xsi:type="string">[Store view]</item>
<item name="formElement" xsi:type="string">input</item>
<item name="source" xsi:type="string">model</item>
<item name="sortOrder" xsi:type="number">801</item>
<item name="dataScope" xsi:type="string">preorder_button</item>
</item>
</argument>
</field>
<field name="preorder_note">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true"> Pre-Order Note</item>
<item name="scopeLabel" xsi:type="string">[Store view]</item>
<item name="formElement" xsi:type="string">input</item>
<item name="source" xsi:type="string">model</item>
<item name="sortOrder" xsi:type="number">802</item>
<item name="dataScope" xsi:type="string">preorder_note</item>
</item>
</argument>
</field>
</fieldset>
</modal>
</form>
app/code/Cm/Preorder/etc/adminhtml/events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="catalog_product_save_after">
<observer name="preorder" instance="Cm\Preorder\Observer\ProductSaveAfter" />
</event>
</config>
app/code/Cm/Preoder/Observer/ProductSaveAfter.php
<?php
namespace Cm\Preorder\Observer;
use \Magento\Framework\Event\ObserverInterface;
use \Magento\Framework\Event\Observer as EventObserver;
class ProductSaveAfter implements ObserverInterface
{
protected $_scopeConfig;
protected $_request;
protected $_objectManager;
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Framework\App\RequestInterface $request,
\Magento\Framework\ObjectManagerInterface $objectmanager
) {
$this->_objectManager = $objectmanager;
$this->_scopeConfig = $scopeConfig;
$this->_request = $request;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$_product = $observer->getProduct(); // you will get product object
$product_id = $_product->getId();
$preorder_button=$_product->getPreorderButton();
$preorder_note=$_product->getPreorderNote();
$resource = $this->_objectManager->get('Magento\Framework\App\ResourceConnection');
$query = "SELECT * FROM `cataloginventory_stock_item` WHERE `product_id`=$product_id";
$connection = $resource->getConnection();
$res = $connection->fetchAll($query);
if($res)
{
$var = array_column($res, 'product_id');
$key = key($var);
$id = $var[$key];
$sql = "UPDATE `cataloginventory_stock_item` SET preorder_button = '$preorder_button' , preorder_note ='$preorder_note' WHERE product_id = ".$id;
$connection->query($sql);
}
}
}
In product edit form, custom field shows empty after value saved in db
Saved value
Solution
Try using plugin how you save:
app/code/SR/MagentoCommunity/etc/adminhtml/di.xml
<?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\CatalogInventory\Model\Stock\StockItemRepository">
<plugin name="sr_update_stock_item"
type="SR\MagentoCommunity\Plugin\CatalogInventory\Model\Stock\StockItemRepository" sortOrder="1"/>
</type>
</config>
app/code/SR/MagentoCommunity/Plugin/CatalogInventory/Model/Stock/StockItemRepository.php
<?php
namespace SR\MagentoCommunity\Plugin\CatalogInventory\Model\Stock;
use Magento\CatalogInventory\Model\ResourceModel\Stock\Item as StockItemResource;
use Magento\Framework\Registry;
class StockItemRepository
{
/**
* @var StockItemResource
*/
private $resource;
/**
* @var Registry
*/
private $registry;
/**
* StockItemRepository constructor.
*
* @param StockItemResource $resource
* @param Registry $registry
*/
public function __construct(
StockItemResource $resource,
Registry $registry
) {
$this->resource = $resource;
$this->registry = $registry;
}
public function afterSave(
\Magento\CatalogInventory\Model\Stock\StockItemRepository $subject,
$stockItem
) {
$product = $this->registry->registry('product');
$preorderButton = $product->getData('preorder_button');
$preorderNote = $product->getData('preorder_note');
$needSave = false;
$newStockItem = $stockItem;
if ($preorderButton) {
$newStockItem->setPreorderButton($preorderButton);
$needSave = true;
}
if ($preorderNote) {
$newStockItem->setPreorderNote($preorderNote);
$needSave = true;
}
if ($needSave) {
$this->resource->save($newStockItem);
}
return $stockItem;
}
}
How populate when edit:
app/code/SR/MagentoCommunity/etc/adminhtml/di.xml
<?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\CatalogInventory\Ui\DataProvider\Product\Form\Modifier\AdvancedInventory">
<plugin name="sr_load_stock_item"
type="SR\MagentoCommunity\Plugin\CatalogInventory\Ui\DataProvider\Product\Form\Modifier\AdvancedInventory" sortOrder="1"/>
</type>
</config>
app/code/SR/MagentoCommunity/Plugin/CatalogInventory/Ui/DataProvider/Product/Form/Modifier/AdvancedInventory.php
<?php
namespace SR\MagentoCommunity\Plugin\CatalogInventory\Ui\DataProvider\Product\Form\Modifier;
use Magento\CatalogInventory\Model\Stock\StockItemRepository;
class AdvancedInventory
{
/**
* @var StockItemRepository
*/
private $stockItemRepository;
/**
* AdvancedInventory constructor.
*
* @param StockItemRepository $stockItemRepository
*/
public function __construct(
StockItemRepository $stockItemRepository
) {
$this->stockItemRepository = $stockItemRepository;
}
public function afterModifyData(
\Magento\CatalogInventory\Ui\DataProvider\Product\Form\Modifier\AdvancedInventory $subject,
$data
) {
foreach ($data as &$product) {
if (isset($product['product']['stock_data']) && isset($product['product']['stock_data']['item_id'])) {
$itemId = $product['product']['stock_data']['item_id'];
if ($itemId) {
try {
$item = $this->stockItemRepository->get($itemId);
$product['product']['preorder_button'] = $item->getData('preorder_button');
$product['product']['preorder_note'] = $item->getData('preorder_note');;
} catch (\Exception $e) {}
}
}
}
return $data;
}
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange