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