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');
    }
}

Categories: Magento2

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

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *