GetAddressesHtmlSelectPlugin.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <?php
  2. /**
  3. * Refer to LICENSE.txt distributed with the Temando Shipping module for notice of license
  4. */
  5. namespace Temando\Shipping\Plugin\Multishipping\Checkout;
  6. use Magento\Checkout\Model\Session;
  7. use Magento\Multishipping\Block\Checkout\Addresses;
  8. use Magento\Quote\Model\Quote\Address\Item;
  9. use Temando\Shipping\Model\Checkout\Schema\CheckoutField;
  10. use Temando\Shipping\Model\Checkout\Schema\CheckoutFieldsSchema;
  11. use Temando\Shipping\Model\Config\ModuleConfigInterface;
  12. /**
  13. * @package Temando\Shipping\Plugin
  14. * @author Sebastian Ertner <sebastian.ertner@netresearch.de>
  15. * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  16. * @link https://www.temando.com/
  17. */
  18. class GetAddressesHtmlSelectPlugin
  19. {
  20. /**
  21. * @var ModuleConfigInterface
  22. */
  23. private $moduleConfig;
  24. /**
  25. * @var CheckoutFieldsSchema
  26. */
  27. private $schema;
  28. /**
  29. * @var Session
  30. */
  31. private $checkoutSession;
  32. /**
  33. * GetAddressesHtmlSelectPlugin constructor.
  34. *
  35. * @param ModuleConfigInterface $moduleConfig
  36. * @param CheckoutFieldsSchema $schema
  37. * @param Session $checkoutSession
  38. */
  39. public function __construct(
  40. ModuleConfigInterface $moduleConfig,
  41. CheckoutFieldsSchema $schema,
  42. Session $checkoutSession
  43. ) {
  44. $this->moduleConfig = $moduleConfig;
  45. $this->schema = $schema;
  46. $this->checkoutSession = $checkoutSession;
  47. }
  48. /**
  49. * @param CheckoutField $field
  50. * @param string $elementId
  51. * @param string $elementName
  52. * @param string $value
  53. * @return string
  54. */
  55. private function renderCheckboxField(CheckoutField $field, $elementId, $elementName, $value)
  56. {
  57. $value = $value ? : $field->getDefaultValue();
  58. $fieldHtml = sprintf(
  59. '<input type="%s" id="%s" name="%s" %s>',
  60. $field->getType(),
  61. $elementId,
  62. $elementName,
  63. $value ? 'checked="checked"' : ''
  64. );
  65. return $fieldHtml;
  66. }
  67. /**
  68. * @param CheckoutField $field
  69. * @param string $elementId
  70. * @param string $elementName
  71. * @param string $value
  72. * @return string
  73. */
  74. private function renderInputField(CheckoutField $field, $elementId, $elementName, $value)
  75. {
  76. $value = $value ? : $field->getDefaultValue();
  77. $fieldHtml = sprintf(
  78. '<input type="%s" id="%s" name="%s" value="%s">',
  79. $field->getType(),
  80. $elementId,
  81. $elementName,
  82. $value
  83. );
  84. return $fieldHtml;
  85. }
  86. /**
  87. * @param CheckoutField $field
  88. * @param string $elementId
  89. * @param string $elementName
  90. * @param string $value
  91. * @return string
  92. */
  93. private function renderSelectField(CheckoutField $field, $elementId, $elementName, $value)
  94. {
  95. $value = $value ? : $field->getDefaultValue();
  96. $options = '';
  97. $fieldOptions = $field->getOptions();
  98. foreach ($fieldOptions as $option) {
  99. $options.= sprintf(
  100. '<option value="%s" %s>%s</option>',
  101. $option['value'],
  102. ($value === (string) $option['value']) ? 'selected="selected"' : '',
  103. $option['name']
  104. );
  105. }
  106. $fieldHtml = sprintf(
  107. '<select id="%s" name="%s">%s</select>',
  108. $elementId,
  109. $elementName,
  110. $options
  111. );
  112. return $fieldHtml;
  113. }
  114. /**
  115. * Render the markup for one field.
  116. * Set value from session if available, from configured default value otherwise.
  117. *
  118. * @param CheckoutField $field
  119. * @param int $index
  120. * @param string $itemId
  121. * @return string
  122. */
  123. private function renderField(CheckoutField $field, $index, $itemId)
  124. {
  125. $value = '';
  126. $checkoutFieldSelection = $this->checkoutSession->getData('checkoutFieldSelection');
  127. if (isset($checkoutFieldSelection[$index])
  128. && isset($checkoutFieldSelection[$index][$itemId])
  129. ) {
  130. $fields = $checkoutFieldSelection[$index][$itemId];
  131. $value = isset($fields[$field->getId()]) ? $fields[$field->getId()] : null;
  132. }
  133. $elementName = 'ship[' . $index . '][' . $itemId . ']['. $field->getId() . ']';
  134. $elementId = 'ship_' . $index . '_' . $itemId . '_' . $field->getId();
  135. $labelHtml = '<label for="' . $elementId . '"><span>'. $field->getLabel() .'</span></label>';
  136. $html = '';
  137. switch ($field->getType()) {
  138. case 'checkbox':
  139. $fieldHtml = $this->renderCheckboxField($field, $elementId, $elementName, $value);
  140. $html = $fieldHtml . $labelHtml;
  141. break;
  142. case 'text':
  143. case 'number':
  144. $fieldHtml = $this->renderInputField($field, $elementId, $elementName, $value);
  145. $html = $labelHtml . $fieldHtml;
  146. break;
  147. case 'select':
  148. $fieldHtml = $this->renderSelectField($field, $elementId, $elementName, $value);
  149. $html = $labelHtml . $fieldHtml;
  150. break;
  151. }
  152. return '<div class="field '. $field->getType() .'">' . $html . '</div>';
  153. }
  154. /**
  155. * @param Addresses $subject
  156. * @param string $result
  157. * @param Item $item
  158. * @param int $index
  159. * @return string
  160. */
  161. public function afterGetAddressesHtmlSelect(Addresses $subject, $result, Item $item, $index)
  162. {
  163. $storeId = $subject->getCheckout()->getQuote()->getStoreId();
  164. if (!$this->moduleConfig->isEnabled($storeId)) {
  165. return $result;
  166. }
  167. $checkoutFields = $this->schema->getFields();
  168. if (empty($checkoutFields)) {
  169. return $result;
  170. }
  171. $fieldsHtml = '';
  172. foreach ($checkoutFields as $checkoutField) {
  173. $fieldsHtml.= $this->renderField($checkoutField, $index, $item->getQuoteItemId());
  174. }
  175. $fieldsHtml = '<div class="multi-checkout-fields">' . $fieldsHtml . '</div>';
  176. return $result . $fieldsHtml;
  177. }
  178. }