Skip to content

Commit

Permalink
Added conditions to usages
Browse files Browse the repository at this point in the history
  • Loading branch information
TobiasLufinity committed Nov 14, 2023
1 parent 28ee5e5 commit 75b3d43
Show file tree
Hide file tree
Showing 9 changed files with 489 additions and 18 deletions.
9 changes: 5 additions & 4 deletions Block/Adminhtml/Usage/Edit/BackButton.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
namespace DevStone\UsageCalculator\Block\Adminhtml\Usage\Edit;

use Magento\Backend\Block\Widget\Context;
use Magento\Framework\UrlInterface;
use Magento\Framework\View\Element\UiComponent\Control\ButtonProviderInterface;

/**
Expand All @@ -19,9 +20,9 @@ class BackButton implements ButtonProviderInterface
/**
* Url Builder
*
* @var \Magento\Framework\UrlInterface
* @var UrlInterface
*/
protected $urlBuilder;
protected UrlInterface $urlBuilder;

/**
* Constructor
Expand All @@ -36,7 +37,7 @@ public function __construct(Context $context)
/**
* @return array
*/
public function getButtonData()
public function getButtonData(): array
{
return [
'label' => __('Back'),
Expand All @@ -51,7 +52,7 @@ public function getButtonData()
*
* @return string
*/
public function getBackUrl()
public function getBackUrl(): string
{
return $this->urlBuilder->getUrl('*/*/');
}
Expand Down
220 changes: 220 additions & 0 deletions Block/Adminhtml/Usage/Edit/Conditions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
<?php

declare(strict_types=1);

namespace DevStone\UsageCalculator\Block\Adminhtml\Usage\Edit;

use Magento\Framework\App\ObjectManager;
use Magento\Backend\Block\Widget\Form\Renderer\Fieldset;
use Magento\SalesRule\Model\Rule;

/**
* Block for rendering Conditions tab on Sales Rules creation page.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Conditions extends \Magento\Backend\Block\Widget\Form\Generic implements
\Magento\Ui\Component\Layout\Tabs\TabInterface
{
/**
* Core registry
*
* @var \Magento\Backend\Block\Widget\Form\Renderer\Fieldset
*/
protected $_rendererFieldset;

/**
* @var \Magento\Rule\Block\Conditions
*/
protected $_conditions;

/**
* @var string
*/
protected $_nameInLayout = 'conditions_apply_to';

/**
* @var \Magento\CatalogRule\Model\RuleFactory
*/
private $ruleFactory;

/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Framework\Data\FormFactory $formFactory
* @param \Magento\Rule\Block\Conditions $conditions
* @param \Magento\Backend\Block\Widget\Form\Renderer\Fieldset $rendererFieldset
* @param array $data
* @param \Magento\CatalogRule\ModelRuleFactory|null $ruleFactory
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Data\FormFactory $formFactory,
\Magento\Rule\Block\Conditions $conditions,
\Magento\Backend\Block\Widget\Form\Renderer\Fieldset $rendererFieldset,
array $data = [],
\Magento\CatalogRule\Model\RuleFactory $ruleFactory = null
) {
$this->_rendererFieldset = $rendererFieldset;
$this->_conditions = $conditions;
$this->ruleFactory = $ruleFactory ?: ObjectManager::getInstance()
->get(\Magento\CatalogRule\Model\RuleFactory::class);
parent::__construct($context, $registry, $formFactory, $data);
}

/**
* @inheritdoc
*
* @codeCoverageIgnore
*/
public function getTabClass()
{
return null;
}

/**
* @inheritdoc
*/
public function getTabUrl()
{
return null;
}

/**
* @inheritdoc
*/
public function isAjaxLoaded()
{
return false;
}

/**
* @inheritdoc
*/
public function getTabLabel()
{
return __('Conditions');
}

/**
* @inheritdoc
*/
public function getTabTitle()
{
return __('Conditions');
}

/**
* @inheritdoc
*/
public function canShowTab()
{
return true;
}

/**
* @inheritdoc
*/
public function isHidden()
{
return false;
}

/**
* Prepare form before rendering HTML
*
* @return $this
*/
protected function _prepareForm()
{
$model = $this->_coreRegistry->registry(\Magento\SalesRule\Model\RegistryConstants::CURRENT_SALES_RULE);
$form = $this->addTabToForm($model);
$this->setForm($form);

return parent::_prepareForm();
}

/**
* Handles addition of conditions tab to supplied form.
*
* @param Rule $model
* @param string $fieldsetId
* @param string $formName
* @return \Magento\Framework\Data\Form
* @throws \Magento\Framework\Exception\LocalizedException
*/
protected function addTabToForm($model, $fieldsetId = 'conditions_fieldset', $formName = 'devstone_usagecalculator_usage_form')
{
if (!$model) {
$id = $this->getRequest()->getParam('id');
$model = $this->ruleFactory->create();
$model->load($id);
}
$conditionsFieldSetId = $model->getConditionsFieldSetId($formName);
$newChildUrl = $this->getUrl(
'sales_rule/promo_quote/newConditionHtml/form/' . $conditionsFieldSetId,
['form_namespace' => $formName]
);

/** @var \Magento\Framework\Data\Form $form */
$form = $this->_formFactory->create();
$form->setHtmlIdPrefix('rule_');

$renderer = $this->getLayout()->createBlock(Fieldset::class);
$renderer->setTemplate(
'Magento_CatalogRule::promo/fieldset.phtml'
)->setNewChildUrl(
$newChildUrl
)->setFieldSetId(
$conditionsFieldSetId
);

$fieldset = $form->addFieldset(
$fieldsetId,
[
'legend' => __(
'Apply the rule only if the following conditions are met (leave blank for all products).'
)
]
)->setRenderer(
$renderer
);
$fieldset->addField(
'conditions',
'text',
[
'name' => 'conditions',
'label' => __('Conditions'),
'title' => __('Conditions'),
'required' => true,
'data-form-part' => $formName
]
)->setRule(
$model
)->setRenderer(
$this->_conditions
);

$form->setValues($model->getData());
$this->setConditionFormName($model->getConditions(), $formName);
return $form;
}

/**
* Handles addition of form name to condition and its conditions.
*
* @param \Magento\Rule\Model\Condition\AbstractCondition $conditions
* @param string $formName
* @return void
*/
private function setConditionFormName(\Magento\Rule\Model\Condition\AbstractCondition $conditions, $formName)
{
$conditions->setFormName($formName);
if ($conditions->getConditions() && is_array($conditions->getConditions())) {
foreach ($conditions->getConditions() as $condition) {
$this->setConditionFormName($condition, $formName);
}
}
}
}
6 changes: 6 additions & 0 deletions Block/Catalog/Product/Usage.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,12 @@ public function getUsages($category = null): array
'in'
)->create();
$customerUsageItems = $this->usageRepository->getList($searchCriteria)->getItems();
/** @var \DevStone\UsageCalculator\Model\Usage $customerUsageItem */
foreach ($customerUsageItems as $key => $customerUsageItem) {
if(!$customerUsageItem->getConditions()->validate($this->getProduct())) {
unset($customerUsageItems[$key]);
}
}
$items = array_merge_recursive($items, $customerUsageItems);
}
}
Expand Down
19 changes: 14 additions & 5 deletions Controller/Adminhtml/Usage/Edit.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,24 +67,33 @@ public function execute()
{
// 1. Get ID
$id = $this->getRequest()->getParam('entity_id');
$objectInstance = $this->objectFactory->create();
$model = $this->objectFactory->create();

$this->_coreRegistry->register(\Magento\SalesRule\Model\RegistryConstants::CURRENT_SALES_RULE, $model);


// 2. Initial checking
if ($id) {
$objectInstance->load($id);
if (!$objectInstance->getId()) {
$model->load($id);
if (!$model->getId()) {
$this->messageManager->addErrorMessage(__('This record no longer exists.'));
/** \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultRedirectFactory->create();

return $resultRedirect->setPath('*/*/');
}
$model->getConditions()->setFormName('devstone_usagecalculator_usage_form');
$model->getConditions()->getConditions()[0]['form_name'] = 'devstone_usagecalculator_usage_form';
$form = $model->getConditionsFieldSetId($model->getConditions()->getFormName());
$model->getConditions()->setJsFormObject(
$model->getConditionsFieldSetId($model->getConditions()->getFormName())
);
}

$conditions = $model->getConditions();
// 3. Set entered data if was error when we do save
$data = $this->_session->getFormData(true);
if (!empty($data)) {
$objectInstance->addData($data);
$model->addData($data);
}

// 4. Register model to use later in blocks
Expand Down
8 changes: 8 additions & 0 deletions Controller/Adminhtml/Usage/Save.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ public function execute(): ResultInterface
$objectInstance->load($data['entity_id']);
$params['entity_id'] = $data['entity_id'];
}

if (isset($data['rule']['conditions'])) {
$data['conditions'] = $data['rule']['conditions'];
}
unset($data['conditions_serialized']);

$objectInstance->loadPost($data);
$objectInstance->addData($data);
$objectInstance = $this->helper->initialize($objectInstance);

Expand Down Expand Up @@ -101,4 +108,5 @@ public function execute(): ResultInterface
}
return $resultRedirect->setPath('*/*/');
}

}
Loading

0 comments on commit 75b3d43

Please sign in to comment.