-
Notifications
You must be signed in to change notification settings - Fork 9.4k
Open
Labels
Area: FrameworkComponent: BundleIssue: ConfirmedGate 3 Passed. Manual verification of the issue completed. Issue is confirmedGate 3 Passed. Manual verification of the issue completed. Issue is confirmedPriority: P2A defect with this priority could have functionality issues which are not to expectations.A defect with this priority could have functionality issues which are not to expectations.Reported on 2.4.8Indicates original Magento version for the Issue report.Indicates original Magento version for the Issue report.Reproduced on 2.4.xThe issue has been reproduced on latest 2.4-develop branchThe issue has been reproduced on latest 2.4-develop branchTriage: Dev.ExperienceIssue related to Developer Experience and needs help with Triage to Confirm or Reject itIssue related to Developer Experience and needs help with Triage to Confirm or Reject it
Description
Preconditions and environment
- Magento version 2.4.6, 2.4.7, 2.4.8
Steps to reproduce
-
Create a module VendorName/ModuleName.
-
Add a plugin in the app/code/VendorName/ModuleName/etc/adminhtml/di.xml file:
<type name="Magento\Framework\DataObject">
<plugin name="VendorName\ModuleName\Plugin\MagentoFramework\Model\DataObjectPlugin"
type="VendorName\ModuleName\Plugin\MagentoFramework\Model\DataObjectPlugin"
disabled="false" sortOrder="1000"/>
</type>
- Create the class VendorName\ModuleName\Plugin\MagentoFramework\Model\DataObjectPlugin:
<?php
/**
* Copyright © VendorName. All rights reserved.
*/
namespace VendorName\ModuleName\Plugin\MagentoFramework\Model;
use Error;
use Exception;
use VendorName\ModuleName\Helper\DataRegistry;
use VendorName\ModuleName\Helper\ActionLog;
use Magento\Framework\App\Area;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\App\State;
use Magento\Framework\DataObject;
use Psr\Log\LoggerInterface;
class DataObjectPlugin
{
public ScopeConfigInterface $config;
public LoggerInterface $logger;
public DataRegistry $registry;
public ActionLog $actionLog;
public RequestInterface $request;
public State $state;
public function __construct(
ScopeConfigInterface $config,
LoggerInterface $logger,
DataRegistry $registry,
ActionLog $actionLog,
RequestInterface $request,
State $state
) {
$this->config = $config;
$this->logger = $logger;
$this->registry = $registry;
$this->actionLog = $actionLog;
$this->request = $request;
$this->state = $state;
}
/**
* @param DataObject $subject
* @param $result
* @return DataObject
*/
public function afterBeforeSave(
DataObject $subject,
$result
) {
if (!($subject instanceof \Magento\Framework\Model\AbstractModel)) {
return $result;
}
try {
if ((int)$this->config->getValue(ActionLog::XML_PATH_ENABLE) == 1
&& (int)$this->config->getValue(ActionLog::XML_PATH_ENABLE_REVERT) == 1
&& $this->state->getAreaCode() == Area::AREA_ADMINHTML
&& !empty($this->request->getParams())
&& !$this->actionLog->isUnusedModel($subject)
) {
$registryData = $this->registry->getValue(ActionLog::REGISTRY_KEY_REVERT) ?? [];
if (!isset($registryData[get_class($subject)])) {
$registryData[get_class($subject)] = [];
}
$registryData[get_class($subject)][] = [
'id' => $subject->getId(),
'action_type' => $subject->getId() == null ? 'create' : 'update',
'before' => $this->actionLog->getOrigData($subject),
'status' => false,
];
$this->registry->unsValue(ActionLog::REGISTRY_KEY_REVERT);
$this->registry->setValue(ActionLog::REGISTRY_KEY_REVERT, $registryData);
}
} catch (Exception|Error $e) {
$this->logger->critical($e->getMessage());
}
return $result;
}
/**
* @param DataObject $subject
* @return void
*/
public function beforeAfterSave(
DataObject $subject
) {
if (!($subject instanceof \Magento\Framework\Model\AbstractModel)) {
return;
}
try {
if ((int)$this->config->getValue(ActionLog::XML_PATH_ENABLE) == 1
&& (int)$this->config->getValue(ActionLog::XML_PATH_ENABLE_REVERT) == 1
&& $this->state->getAreaCode() == Area::AREA_ADMINHTML
&& !empty($this->request->getParams())
&& !$this->actionLog->isUnusedModel($subject)
&& $subject->getId()
) {
$registryData = $this->registry->getValue(ActionLog::REGISTRY_KEY_REVERT) ?? [];
if (!empty($registryData[get_class($subject)])) {
foreach ($registryData[get_class($subject)] as &$registryDatum) {
if ((!empty($registryDatum['id']) && $registryDatum['id'] == $subject->getId())
|| ($subject->getId() && empty($registryDatum['id']) && $registryDatum['action_type'] == 'create')
) {
$registryDatum['id'] = $subject->getId();
$registryDatum['status'] = true;
$registryDatum['scope'] = $this->actionLog->getScope();
$registryDatum['scope_id'] = $this->actionLog->getStoreId($subject);
}
}
$this->registry->unsValue(ActionLog::REGISTRY_KEY_REVERT);
$this->registry->setValue(ActionLog::REGISTRY_KEY_REVERT, $registryData);
}
}
} catch (Exception|Error $e) {
$this->logger->critical($e->getMessage());
}
}
public function beforeBeforeDelete(
DataObject $subject
) {
if (!($subject instanceof \Magento\Framework\Model\AbstractModel)) {
return;
}
try {
if ((int)$this->config->getValue(ActionLog::XML_PATH_ENABLE) == 1
&& (int)$this->config->getValue(ActionLog::XML_PATH_ENABLE_REVERT) == 1
&& $this->state->getAreaCode() == Area::AREA_ADMINHTML
&& !empty($this->request->getParams())
&& !$this->actionLog->isUnusedModel($subject)
) {
$registryData = $this->registry->getValue(ActionLog::REGISTRY_KEY_REVERT) ?? [];
if (!isset($registryData[get_class($subject)])) {
$registryData[get_class($subject)] = [];
}
$registryData[get_class($subject)][] = [
'id' => $subject->getId(),
'status' => true,
'action_type' => 'delete',
'scope' => $this->actionLog->getScope(),
'scope_id' => $this->actionLog->getStoreId($subject),
'before' => $this->actionLog->getOrigData($subject),
];
$this->registry->unsValue(ActionLog::REGISTRY_KEY_REVERT);
$this->registry->setValue(ActionLog::REGISTRY_KEY_REVERT, $registryData);
}
} catch (Exception|Error $e) {
$this->logger->critical($e->getMessage());
}
}
}
-
Execute bin/magento setup:upgrade.
-
Create/update a bundle product.
Expected result
The product is saved without errors.
Actual result
When saving the product, we get the error:
Could not save child: "Unknown entity type: Magento\Bundle\Model\Selection\Interceptor requested"
Additional information
No response
Release note
No response
Triage and priority
- Severity: S0 - Affects critical data or functionality and leaves users without workaround.
- Severity: S1 - Affects critical data or functionality and forces users to employ a workaround.
- Severity: S2 - Affects non-critical data or functionality and forces users to employ a workaround.
- Severity: S3 - Affects non-critical data or functionality and does not force users to employ a workaround.
- Severity: S4 - Affects aesthetics, professional look and feel, “quality” or “usability”.
Metadata
Metadata
Assignees
Labels
Area: FrameworkComponent: BundleIssue: ConfirmedGate 3 Passed. Manual verification of the issue completed. Issue is confirmedGate 3 Passed. Manual verification of the issue completed. Issue is confirmedPriority: P2A defect with this priority could have functionality issues which are not to expectations.A defect with this priority could have functionality issues which are not to expectations.Reported on 2.4.8Indicates original Magento version for the Issue report.Indicates original Magento version for the Issue report.Reproduced on 2.4.xThe issue has been reproduced on latest 2.4-develop branchThe issue has been reproduced on latest 2.4-develop branchTriage: Dev.ExperienceIssue related to Developer Experience and needs help with Triage to Confirm or Reject itIssue related to Developer Experience and needs help with Triage to Confirm or Reject it
Type
Projects
Status
Ready for Development