1. vendor/magento/module-sales-rule/Controller/Adminhtml/Promo/Quote/NewActionHtml.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\SalesRule\Controller\Adminhtml\Promo\Quote;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Rule\Model\Condition\AbstractCondition;
use Magento\SalesRule\Controller\Adminhtml\Promo\Quote;
use Magento\SalesRule\Model\Rule;
/**
* New action html action
*/
class NewActionHtml extends Quote implements HttpPostActionInterface
{
/**
* New action html action
*
* @return void
*/
public function execute()
{
$id = $this->getRequest()
->getParam('id');
$formName = $this->getRequest()
->getParam('form_namespace');
$typeArr = explode('|', str_replace('-', '/', $this->getRequest()->getParam('type')));
$type = $typeArr[0];
$model = $this->_objectManager->create(
$type
)->setId(
$id
)->setType(
$type
)->setRule(
$this->_objectManager->create(Rule::class)
)->setPrefix(
'actions'
);
if (!empty($typeArr[1])) {
$model->setAttribute($typeArr[1]);
}
if ($model instanceof AbstractCondition) {
$model->setJsFormObject($formName);
$model->setFormName($formName);
$this->setJsFormObject($model);
$html = $model->asHtmlRecursive();
} else {
$html = '';
}
$this->getResponse()
->setBody($html);
}
/**
* Set jsFormObject for the model object
*
* @return void
* @param AbstractCondition $model
*/
private function setJsFormObject(AbstractCondition $model): void
{
$requestJsFormName = $this->getRequest()->getParam('form');
$actualJsFormName = $this->getJsFormObjectName($model->getFormName());
if ($requestJsFormName === $actualJsFormName) { //new
$model->setJsFormObject($actualJsFormName);
} else { //edit
$model->setJsFormObject($requestJsFormName);
}
}
/**
* Get jsFormObject name
*
* @param string $formName
* @return string
*/
private function getJsFormObjectName(string $formName): string
{
return $formName . 'rule_actions_fieldset_';
}
}
2.vendor/magento/module-sales-rule/Controller/Adminhtml/Promo/Quote/NewConditionHtml.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\SalesRule\Controller\Adminhtml\Promo\Quote;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Rule\Model\Condition\AbstractCondition;
use Magento\SalesRule\Controller\Adminhtml\Promo\Quote;
/**
* Controller class NewConditionHtml. Returns condition html
*/
class NewConditionHtml extends Quote implements HttpPostActionInterface
{
/**
* New condition html action
*
* @return void
*/
public function execute()
{
$id = $this->getRequest()->getParam('id');
$formName = $this->getRequest()->getParam('form_namespace');
$typeArr = explode('|', str_replace('-', '/', $this->getRequest()->getParam('type')));
$type = $typeArr[0];
$model = $this->_objectManager->create(
$type
)->setId(
$id
)->setType(
$type
)->setRule(
$this->_objectManager->create(\Magento\SalesRule\Model\Rule::class)
)->setPrefix(
'conditions'
);
if (!empty($typeArr[1])) {
$model->setAttribute($typeArr[1]);
}
if ($model instanceof AbstractCondition) {
$model->setJsFormObject($this->getRequest()->getParam('form'));
$model->setFormName($formName);
$this->setJsFormObject($model);
$html = $model->asHtmlRecursive();
} else {
$html = '';
}
$this->getResponse()->setBody($html);
}
/**
* Set jsFormObject for the model object
*
* @return void
* @param AbstractCondition $model
*/
private function setJsFormObject(AbstractCondition $model): void
{
$requestJsFormName = $this->getRequest()->getParam('form');
$actualJsFormName = $this->getJsFormObjectName($model->getFormName());
if ($requestJsFormName === $actualJsFormName) { //new
$model->setJsFormObject($actualJsFormName);
}
}
/**
* Get jsFormObject name
*
* @param string $formName
* @return string
*/
private function getJsFormObjectName(string $formName): string
{
return $formName . 'rule_conditions_fieldset_';
}
}
3. /dev/tests/integration/testsuite/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewActionHtmlTest.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\SalesRule\Controller\Adminhtml\Promo\Quote;
use Magento\TestFramework\TestCase\AbstractBackendController;
/**
* New action html test
*
* Verify the request object contains the proper form object for action
* @magentoAppArea adminhtml
*/
class NewActionHtmlTest extends AbstractBackendController
{
/**
* @var string
*/
protected $resource = 'Magento_SalesRule::quote';
/**
* @var string
*/
protected $uri = 'backend/sales_rule/promo_quote/newActionHtml';
/**
* @var string
*/
private $formName = 'test_form';
/**
* @var string
*/
private $requestFormName = 'rule_actions_fieldset_';
/**
* Test verifies that execute method has the proper data-form-part value in html response
*
* @return void
*/
public function testExecute(): void
{
$this->prepareRequest();
$this->dispatch($this->uri);
$html = $this->getResponse()
->getBody();
$this->assertContains($this->formName, $html);
}
/**
* @inheritdoc
*/
public function testAclHasAccess()
{
$this->prepareRequest();
parent::testAclHasAccess();
}
/**
* @inheritdoc
*/
public function testAclNoAccess()
{
$this->prepareRequest();
parent::testAclNoAccess();
}
/**
* Prepare request
*
* @return void
*/
private function prepareRequest(): void
{
$this->getRequest()->setParams(
[
'id' => 1,
'form' => $this->requestFormName,
'form_namespace' => $this->formName,
'type' => 'Magento\SalesRule\Model\Rule\Condition\Product|quote_item_price',
]
)->setMethod('POST');
}
}
4. /dev/tests/integration/testsuite/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/NewConditionHtmlTest.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\SalesRule\Controller\Adminhtml\Promo\Quote;
use Magento\TestFramework\TestCase\AbstractBackendController;
/**
* New condition html test
*
* Verify the request object contains the proper form object for condition
* @magentoAppArea adminhtml
*/
class NewConditionHtmlTest extends AbstractBackendController
{
/**
* @var string
*/
protected $resource = 'Magento_SalesRule::quote';
/**
* @var string
*/
protected $uri = 'backend/sales_rule/promo_quote/newConditionHtml';
/**
* @var string
*/
private $formName = 'test_form';
/**
* @var string
*/
private $requestFormName = 'rule_conditions_fieldset_';
/**
* Test verifies that execute method has the proper data-form-part value in html response
*
* @return void
*/
public function testExecute(): void
{
$this->prepareRequest();
$this->dispatch($this->uri);
$html = $this->getResponse()
->getBody();
$this->assertContains($this->formName, $html);
}
/**
* @inheritdoc
*/
public function testAclHasAccess()
{
$this->prepareRequest();
parent::testAclHasAccess();
}
/**
* @inheritdoc
*/
public function testAclNoAccess()
{
$this->prepareRequest();
parent::testAclNoAccess();
}
/**
* Prepare request
*
* @return void
*/
private function prepareRequest(): void
{
$this->getRequest()->setParams(
[
'id' => 1,
'form' => $this->requestFormName,
'form_namespace' => $this->formName,
'type' => 'Magento\SalesRule\Model\Rule\Condition\Product|category_ids',
]
)->setMethod('POST');
}
}
3 Comments
Sushant Vishwas · August 26, 2021 at 10:53 am
No Idea
area 52 · September 18, 2021 at 12:58 am
Hey, I think your blog might be having browser compatibility issues.
When I look at your blog in Opera, it looks fine but when opening in Internet
Explorer, it has some overlapping. I just wanted to give you a quick
heads up! Other then that, very good blog!
My web blog – area 52
Mable Belangia · April 22, 2022 at 8:51 pm
It’s difficult to find well-informed people on this topic, however, you sound like you know what you’re talking about! Thanks