Selected.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace Dotdigitalgroup\Email\Controller\Adminhtml\Rules;
  3. class Selected extends \Magento\Backend\App\AbstractAction
  4. {
  5. /**
  6. * Authorization level of a basic admin session
  7. *
  8. * @see _isAllowed()
  9. */
  10. const ADMIN_RESOURCE = 'Dotdigitalgroup_Email::exclusion_rules';
  11. /**
  12. * @var \Magento\Framework\App\Response\Http
  13. */
  14. private $http;
  15. /**
  16. * @var \Dotdigitalgroup\Email\Model\RulesFactory
  17. */
  18. private $rulesFactory;
  19. /**
  20. * @var \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Type
  21. */
  22. private $ruleType;
  23. /**
  24. * @var \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Condition
  25. */
  26. private $ruleCondition;
  27. /**
  28. * @var \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Value
  29. */
  30. private $ruleValue;
  31. /**
  32. * @var \Magento\Framework\Json\Helper\Data
  33. */
  34. public $jsonEncoder;
  35. /**
  36. * @var \Magento\Framework\Escaper
  37. */
  38. private $escaper;
  39. /**
  40. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Rules
  41. */
  42. private $rulesResource;
  43. /**
  44. * Selected constructor.
  45. *
  46. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Rules $rulesResource
  47. * @param \Magento\Backend\App\Action\Context $context
  48. * @param \Dotdigitalgroup\Email\Model\RulesFactory $rulesFactory
  49. * @param \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Type $ruleType
  50. * @param \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Condition $ruleCondition
  51. * @param \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Value $ruleValue
  52. * @param \Magento\Framework\Json\Helper\Data $jsonEncoder
  53. * @param \Magento\Framework\App\Response\Http $http
  54. * @param \Magento\Framework\Escaper $escaper
  55. */
  56. public function __construct(
  57. \Dotdigitalgroup\Email\Model\ResourceModel\Rules $rulesResource,
  58. \Magento\Backend\App\Action\Context $context,
  59. \Dotdigitalgroup\Email\Model\RulesFactory $rulesFactory,
  60. \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Type $ruleType,
  61. \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Condition $ruleCondition,
  62. \Dotdigitalgroup\Email\Model\Adminhtml\Source\Rules\Value $ruleValue,
  63. \Magento\Framework\Json\Helper\Data $jsonEncoder,
  64. \Magento\Framework\App\Response\Http $http,
  65. \Magento\Framework\Escaper $escaper
  66. ) {
  67. $this->rulesFactory = $rulesFactory;
  68. $this->ruleType = $ruleType;
  69. $this->ruleCondition = $ruleCondition;
  70. $this->ruleValue = $ruleValue;
  71. $this->jsonEncoder = $jsonEncoder;
  72. $this->escaper = $escaper;
  73. $this->rulesResource = $rulesResource;
  74. parent::__construct($context);
  75. $this->http = $http;
  76. }
  77. /**
  78. * Execute method.
  79. *
  80. * @return \Magento\Framework\App\Response\HttpInterface
  81. */
  82. public function execute()
  83. {
  84. $id = $this->getRequest()->getParam('ruleid');
  85. $attribute = $this->getRequest()->getParam('attribute');
  86. $arrayKey = $this->getRequest()->getParam('arraykey');
  87. $conditionName = $this->getRequest()->getParam('condition');
  88. $valueName = $this->getRequest()->getParam('value');
  89. if ($arrayKey && $id && $attribute && $conditionName && $valueName) {
  90. $rule = $this->rulesFactory->create();
  91. $this->rulesResource->load($rule, $id);
  92. //rule not found
  93. if (!$rule->getId()) {
  94. $this->http->getHeaders()->clearHeaders();
  95. return $this->http->setHeader(
  96. 'Content-Type',
  97. 'application/json'
  98. )->setBody('Rule not found!');
  99. }
  100. $conditions = $rule->getCondition();
  101. $condition = $conditions[$arrayKey];
  102. $selectedConditions = $condition['conditions'];
  103. $selectedValues = $condition['cvalue'];
  104. $type = $this->ruleType->getInputType($attribute);
  105. $conditionOptions = $this->ruleCondition->getInputTypeOptions($type);
  106. $response['condition'] = str_replace(
  107. 'value="' . $selectedConditions . '"',
  108. 'value="' . $selectedConditions . '"' . 'selected="selected"',
  109. $this->getOptionHtml(
  110. 'conditions',
  111. $conditionName,
  112. $conditionOptions
  113. )
  114. );
  115. $elmType = $this->ruleValue->getValueElementType($attribute);
  116. $this->evaluateElmType($elmType, $selectedConditions, $attribute, $selectedValues, $valueName, $response);
  117. $this->http->getHeaders()->clearHeaders();
  118. $this->http->setHeader('Content-Type', 'application/json')
  119. ->setBody($this->jsonEncoder->jsonEncode($response));
  120. }
  121. }
  122. /**
  123. * @param string $elmType
  124. * @param string $selectedConditions
  125. * @param string $attribute
  126. * @param string $selectedValues
  127. * @param string $valueName
  128. * @param string $response
  129. *
  130. * @return null
  131. */
  132. private function evaluateElmType($elmType, $selectedConditions, $attribute, $selectedValues, $valueName, &$response)
  133. {
  134. if ($elmType == 'select' or $selectedConditions == 'null') {
  135. $isEmpty = false;
  136. if ($selectedConditions == 'null') {
  137. $isEmpty = true;
  138. }
  139. $valueOptions = $this->ruleValue->getValueSelectOptions($attribute, $isEmpty);
  140. $response['cvalue'] = str_replace(
  141. 'value="' . $selectedValues . '"',
  142. 'value="' . $selectedValues . '"' . 'selected="selected"',
  143. $this->getOptionHtml('cvalue', $valueName, $valueOptions)
  144. );
  145. } elseif ($elmType == 'text') {
  146. $encodedValue = $this->escaper->escapeHtml($selectedValues);
  147. $html = "<input style='width:160px' title='cvalue' name='$valueName' value='$encodedValue'/>";
  148. $response['cvalue'] = $html;
  149. }
  150. }
  151. /**
  152. * @param string $title
  153. * @param string $name
  154. * @param array $options
  155. *
  156. * @return string
  157. */
  158. private function getOptionHtml($title, $name, $options)
  159. {
  160. $block = $this->_view->getLayout()->createBlock(
  161. \Magento\Framework\View\Element\Html\Select::class
  162. );
  163. $block->setOptions($options)
  164. ->setId('')
  165. ->setClass('')
  166. ->setTitle($title)
  167. ->setName($name)
  168. ->setExtraParams('style="width:160px"');
  169. return $block->toHtml();
  170. }
  171. }