diff --git a/Block/Catalog/Product/Usage.php b/Block/Catalog/Product/Usage.php index 9d51e0b..854fc18 100644 --- a/Block/Catalog/Product/Usage.php +++ b/Block/Catalog/Product/Usage.php @@ -205,11 +205,19 @@ public function getUsages($category = null): array public function isCustomerLoggedIn(): bool { + $current_customer_id = $this->_coreRegistry->registry('current_customer_id'); + if ($current_customer_id) { + return true; + } return $this->session->isLoggedIn(); } public function getCustomerId(): ?int { + $current_customer_id = $this->_coreRegistry->registry('current_customer_id'); + if ($current_customer_id) { + return $current_customer_id; + } return $this->session->getCustomerId(); } @@ -367,7 +375,20 @@ public function getJsonConfig(): string ]; } - return $this->serializer->serialize(['links' => $linksConfig]); + $currentProduct = $this->getProduct(); + $config = [ + "categorySelectElement" => "#usage_category", + "allElements" => "#usages_all", + 'links' => $linksConfig + ]; + + if ($currentProduct->hasPreconfiguredValues()) { + $config['selectedOptions'] = $currentProduct->getPreconfiguredValues()->getData('options'); + $config['selectedCategory'] = $currentProduct->getPreconfiguredValues()->getData('usage_category'); + $config['selectedUsage'] = $currentProduct->getPreconfiguredValues()->getData('usage_id'); + } + + return $this->serializer->serialize($config); } /** diff --git a/etc/di.xml b/etc/di.xml index f858ac4..a97636c 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -202,4 +202,6 @@ + + diff --git a/view/adminhtml/layout/catalog_product_view_type_image.xml b/view/adminhtml/layout/catalog_product_view_type_image.xml index 92cb06b..433fe91 100644 --- a/view/adminhtml/layout/catalog_product_view_type_image.xml +++ b/view/adminhtml/layout/catalog_product_view_type_image.xml @@ -7,6 +7,27 @@ + + + 360 + + + + + + + + + + + true + + + + + + + diff --git a/view/adminhtml/templates/product/composite/fieldset/usages-container.phtml b/view/adminhtml/templates/product/composite/fieldset/usages-container.phtml index 15ec08a..e8a21bf 100644 --- a/view/adminhtml/templates/product/composite/fieldset/usages-container.phtml +++ b/view/adminhtml/templates/product/composite/fieldset/usages-container.phtml @@ -11,6 +11,51 @@ Configure Usage
+
+ +
+ + +

+ +
+
+ +
+ +
+
+ getCategoriesSelectHtml() ?> +
+
+ getPreviousCategories() ) ): ?> + + + getChildHtml('all.usages'); ?> + getChildHtml('custom.usages'); ?> +
+ +
+
+ +
@@ -21,7 +66,7 @@
- +
getUsagesSelectHtml($usages, $category); ?> @@ -30,8 +75,25 @@
- +*/ +?> + getJsonConfig(); + $scriptString = << -
- - - diff --git a/view/frontend/templates/catalog/product/type/default.phtml b/view/frontend/templates/catalog/product/type/default.phtml deleted file mode 100644 index 02eed95..0000000 --- a/view/frontend/templates/catalog/product/type/default.phtml +++ /dev/null @@ -1,9 +0,0 @@ - -getOption() ?> -
- -
diff --git a/view/frontend/templates/catalog/product/type/file.phtml b/view/frontend/templates/catalog/product/type/file.phtml deleted file mode 100644 index cb442ad..0000000 --- a/view/frontend/templates/catalog/product/type/file.phtml +++ /dev/null @@ -1,63 +0,0 @@ - -getOption(); ?> -getFileInfo(); ?> -hasData(); ?> -getId() . '_file'; ?> - - - -getIsRequire()) ? ' required' : ''; ?> - -
- - -
- escapeHtml($_fileInfo->getTitle()) ?> - - - - getIsRequire()): ?> - - - -
- -
> - /> - - getFileExtension()): ?> -

- : getFileExtension() ?> -

- - getImageSizeX() > 0): ?> -

- : getImageSizeX() ?> -

- - getImageSizeY() > 0): ?> -

- : getImageSizeY() ?> -

- -
-
diff --git a/view/frontend/templates/catalog/product/type/select.phtml b/view/frontend/templates/catalog/product/type/select.phtml deleted file mode 100644 index 4e1b8ef..0000000 --- a/view/frontend/templates/catalog/product/type/select.phtml +++ /dev/null @@ -1,27 +0,0 @@ - - - -getOption(); -$class = ($_option->getIsRequire()) ? ' required' : ''; -?> -
- -
- escapeHtml($_option->getHelp()); ?> -
-
- getValuesHtml() ?> - getIsRequire()): ?> - getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_RADIO || $_option->getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_CHECKBOX): ?> - - - -
-
diff --git a/view/frontend/templates/catalog/product/type/text.phtml b/view/frontend/templates/catalog/product/type/text.phtml deleted file mode 100644 index 528e6fe..0000000 --- a/view/frontend/templates/catalog/product/type/text.phtml +++ /dev/null @@ -1,61 +0,0 @@ - -getOption(); -$class = ($_option->getIsRequire()) ? ' required' : ''; -?> - -
- -
- escapeHtml($_option->getHelp()); ?> -
-
- getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_FIELD): ?> - getIsRequire()) { - $_textValidate['required'] = true; - } - if ($_option->getMaxCharacters()) { - $_textValidate['maxlength'] = $_option->getMaxCharacters(); - } - $_textValidate['validate-no-utf8mb4-characters'] = true; - ?> - - data-validate="escapeHtml(json_encode($_textValidate)) ?>" - - data-title="escapeHtmlAttr($_option->getTitle()) ?>" - name="options[getId() ?>]" - data-selector="options[getId() ?>]" - value="escapeHtml($block->getDefaultValue()) ?>"/> - getType() == \Magento\Catalog\Api\Data\ProductCustomOptionInterface::OPTION_TYPE_AREA): ?> - getIsRequire()) { - $_textAreaValidate['required'] = true; - } - if ($_option->getMaxCharacters()) { - $_textAreaValidate['maxlength'] = $_option->getMaxCharacters(); - } - $_textAreaValidate['validate-no-utf8mb4-characters'] = true; - ?> - - -
-
diff --git a/view/frontend/templates/catalog/product/usages.phtml b/view/frontend/templates/catalog/product/usages.phtml deleted file mode 100644 index 31ac849..0000000 --- a/view/frontend/templates/catalog/product/usages.phtml +++ /dev/null @@ -1,26 +0,0 @@ - -getCategories() as $category): ?> - getUsages($category) ?> - - - - - - - \ No newline at end of file diff --git a/view/frontend/web/usage.js b/view/frontend/web/usage.js deleted file mode 100644 index 961798f..0000000 --- a/view/frontend/web/usage.js +++ /dev/null @@ -1,251 +0,0 @@ -/** - * @api - */ -define([ - 'jquery', - 'priceBox', - 'jquery/ui', - 'domReady!' -], function ($, priceBox) { - 'use strict'; - var self; - - $.widget('mage.usage', { - options: { - priceHolderSelector: '#product-options-wrapper .price-box' - }, - hidden: true, - - /** @inheritdoc */ - _create: function () { - self = this; - - this.element.find(this.options.categorySelectElement).on('change', function () { - self.element.find(".category-container").hide().find('select, input, textarea').prop('disabled', true); - self.element.find(".usage-container").hide(); - self.element.find("#category_container_" + $(this).val()).show() - .find('.usage-select-box').val('').prop('disabled', false); - self.__addHashToURL(); - }); - - $('#category_container_previous').change(function () { - var values = $('#usage_previous_usages').val().split(' - '); - var elements = $('#downloadable-usages-list .usage-container').find('select, input, textarea'); - - // Setting first two values (category and its usage) - $('#usage_category').val(values[0]); - $('[name="usage_id\\[' + values[0] + '\\]"]').val(values[1]).show().prop('disabled', false).closest('.category-container').show(); - // removing first two values from the array - values.splice(0, 2); - - //setting values for rest of the elements (select, input, textarea) - values.forEach(function (item, index) { - var kvp = item.split(':'); - $('#downloadable-usages-list [name*="\\[' + kvp[0] + '\\]"]').val(kvp[1]).show().prop('disabled', false).closest('.usage-container').show(); - }); - $(this).hide().find('.usage-select-box').prop('disabled', true); - self._reloadPrice(); - self.__addHashToURL(); - }); - - this.element.find('select, input, textarea').on('change', this._reloadPrice); - - this.element.find('.help-text').hide(); - - this.element.find('label').on('click', function (e) { - e.preventDefault(); - $(this).closest('.field').find('.help-text').toggle() - var $a = $(this).find('a'); - var current = $a.html(); - $a.html($a.data('less')); - $a.data('less', current); - }); - - this.element.find(".usage-select-box").on('change', function () { - self.element.find(".usage-container").hide().find('select, input, textarea').prop('disabled', true); - self.element.find("#usage_container_" + $(this).val()).show().find('select, input, textarea').prop('disabled', false); - self.__addHashToURL(); - }); - - $('#maincontent .product-info-main .usages-more-info-call').hide(); - - $('.usages-container-inner').hide().find('select, input, textarea').prop('disabled', true); - $('#usage-button, #usage-button-close').on('click', function (e) { - e.preventDefault(); - $('#maincontent .product.info.detailed').toggle(); - $('#maincontent .product-info-main .product-info-main > div:not(.product-add-form)').toggle(); - $('#product-options-wrapper > div > div:not(.product-info-price):not(.usages-container)').toggle(); - $('.usages-container-inner').toggle(); - $('#usage-button').toggle(); - $('#maincontent .product-info-main .usages-more-info-call').toggle(); - if (self.hidden) { - self.element.find(self.options.categorySelectElement).prop('disabled', false).val('').trigger('change'); - $('#previously_usage_category').prop('disabled', false); - location.hash = "#license"; - } else { - $('.usages-container-inner').find('select, input, textarea').prop('disabled', true); - $(self.options.priceHolderSelector + ', .product-options-bottom').hide(); - location.hash = ""; - } - - self.hidden = !self.hidden; - }); - try { - $(self.options.priceHolderSelector).priceBox('setDefault', { - 'basePrice': { - 'amount': 0.0, - 'adjustments': [] - }, - 'finalPrice': { - 'amount': 0.0, - 'adjustments': [] - }, - 'oldPrice': { - 'amount': 0.0, - 'adjustments': [] - } - }); - $(self.options.priceHolderSelector + ', .product-options-bottom').hide(); - } catch (err) { - - } - - - $('.usage-container select').on('change', function () { - self.__addHashToURL(); - }); - - $('.usage-container input').change(function () { - self.__addHashToURL(); - }); - - if (location.hash.substr(0, 8) === '#license') { - var properties = location.hash.substr(9, location.hash.length); - $('#usage-button').click(); - if (properties.length) { - self._loadProperties(properties); - } - } - - }, - - /** - * Reload product price with selected link price included - * @private - */ - _reloadPrice: function () { - var finalPrice = 0, - basePrice = 0, - $usage, - $selected, - terms, - categoryId, - haveActive = false; - - self.element.find().show(); - - categoryId = self.element.find(self.options.categorySelectElement).val(); - - $usage = self.element.find("#category_container_" + categoryId + ' .usage-select-box option:selected'); - - finalPrice = basePrice = parseFloat($usage.attr('price')); - terms = $usage.data('terms'); - - if (basePrice) { - self.element.find("#category_container_" + categoryId).removeClass('active'); - } else if (categoryId) { - self.element.find('.field.active').removeClass('active'); - self.element.find("#category_container_" + categoryId).addClass('active'); - } else { - self.element.find('.usages-container-inner > .control > .field').addClass('active'); - } - - self.element.find("#usage_container_" + $usage.attr('value') + ' select[name*=options]').each(function (index, select) { - $selected = $(select).find('option:selected'); - if (!$selected.attr('price') && !haveActive) { - $(select).closest('.field').addClass('active'); - haveActive = true; - } else { - $(select).closest('.field.active').removeClass('active'); - } - - finalPrice *= parseFloat($selected.attr('price')) / 100; - terms = terms.replace( - '(' + select.title + ')', - '' + $selected.text() + '' - ); - }); - - self.element.find("#usage_container_" + $usage.attr('value') + ' input').each(function (index, input) { - if (!$(input).val() && !haveActive) { - $(input).closest('.field').addClass('active'); - haveActive = true; - } else { - $(input).closest('.field.active').removeClass('active'); - } - terms = terms.replace( - '(' + $(input).data('title') + ')', - '' + $(input).val() + '' - ); - }); - - if (isNaN(finalPrice)) { - finalPrice = 0; - terms = ""; - } - // This is tricky with multiple currencies, so I am disabling this for now. - // if (95 !== ((finalPrice * 100) % 100)) { - // finalPrice = Math.round(finalPrice); - // } - - $(self.options.priceHolderSelector).trigger('updatePrice', { - 'prices': { - 'finalPrice': { - 'amount': finalPrice - }, - 'basePrice': { - 'amount': basePrice - } - } - }); - - if (finalPrice <= 0 && !$usage.data('is-free')) { - $(self.options.priceHolderSelector + ', .product-options-bottom').hide(); - $('#usages-advice-container').html(''); - } else { - $('#usages-advice-container').html(terms); - $(self.options.priceHolderSelector + ', .product-options-bottom').show(); - } - }, - - /** - * Load all the options according to url - * @param properties - * @private - */ - _loadProperties: function (properties) { - var decodeProperties = decodeURI(properties).split('&'); - decodeProperties.forEach(function (option) { - var kvp = option.split('='); - kvp[0] = kvp[0].replace('[', '\\[').replace(']', '\\]'); - self.element.find('[name=' + kvp[0] + ']').val(kvp[1]).show().prop('disabled', false).change(); - self.element.find('[name=' + kvp[0] + ']').closest('.field').show(); - self.element.find('[name=' + kvp[0] + ']').closest('.usage-container').show(); - }); - self._reloadPrice(); - }, - - __addHashToURL: function () { - var hashVal = '#license'; - $('#product_addtocart_form input, #product_addtocart_form select').each(function (index) { - var isDisabled = $(this).is(':disabled') || $(this).attr('type') == 'hidden' || !$(this).is(':visible') || $(this).val() == null || !$(this).val(); - if (!isDisabled) { - hashVal += '&' + $(this).attr('name') + '=' + $(this).val(); - } - }); - location.hash = encodeURI(hashVal); - } - }); - - return $.mage.usage; -});