Перейти к содержимому


Двойственный Выбор


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 Teraweb

Teraweb

    Активный участник

  • Пользователи
  • PipPipPipPip
  • 250 сообщений

Отправлено 21 Март 2016 - 23:52

Такой вопрос. Я хочу сделать товар с двумя модификациями. Размер и материал. У каждого три свойства. Как мне это реализовать. Суть в том, что цены отличаются только у размера. Смысл такой. Покупатель заходит на страницу товара, выбирает размер (1 из 3, цена разная). Потом выбирает материал. Цена уже не меняется!  Делал модификацию как в скриншоте. Пишет ошибку, второй скриншот. Как реализовать? Аккаунт SL-303729

Прикрепленные изображения

  • joxi_screenshot_1458593273620.png
  • Безымянный.png


#2 Vaccina

Vaccina

    Активный участник

  • Модераторы
  • 24 353 сообщений

Отправлено 22 Март 2016 - 01:38

Чтобы не возникало ошибки необходимо указать все возможные вариации модификаций с вашими параметрами, подробней:
http://forum.storela...indpost__p__187

#3 Teraweb

Teraweb

    Активный участник

  • Пользователи
  • PipPipPipPip
  • 250 сообщений

Отправлено 22 Март 2016 - 16:52

Я указал. Пишет ошибку. http://modul-cart.ru/goods/Test

#4 Vaccina

Vaccina

    Активный участник

  • Модераторы
  • 24 353 сообщений

Отправлено 23 Март 2016 - 05:40

в шаблоне Товар код
{% FOR goods_modifications_properties %}
			 <div class="goodsDataMainModificationsBlockProperty">
			 <!-- Выдаем списки со свойствами для модификаций, чтобы определить какую модификацию товара хочет пользователь -->
			 {% FOR values %}
				 <!-- Если это первый элемент в списке -->
				 {% IF goods_modifications_properties.values.first %}
				 <strong>{goods_modifications_properties.NAME}:</strong><br />
				 <select name="form[properties][]">
				 {% ENDIF %}
					 <option value="{goods_modifications_properties.values.ID}" {% IF goods_modifications_properties.values.SELECTED %}selected="selected"{% ENDIF %}>{goods_modifications_properties.values.NAME}</option>
				 <!-- Если это последний элемент в списке -->
				 {% IF goods_modifications_properties.values.last %}
				 </select>
				 {% ENDIF %}
			 {% ENDFOR %}
			 </div>
			 {goods_modifications_properties.index | is_divided("2","</tr><tr>","")}
		 {% ENDFOR %}
замените на
{% FOR goods_modifications_properties %}
																											 <td class="goodsDataMainModificationsBlockProperty">
																												 <!-- Выдаем списки со свойствами для модификаций, чтобы определить какую модификацию товара хочет пользователь -->
																												 {% FOR values %}
																																 <!-- Если это первый элемент в списке -->
																																 {% IF goods_modifications_properties.values.first %}
																																			 <span class="goodsDataMainModificationsRadio">
																																			 <strong>{goods_modifications_properties.NAME}:</strong><br />
																																 {% ENDIF %}
																																 <input type="radio" name="form[properties][{goods_modifications_properties.ID}]" value="{goods_modifications_properties.values.ID}" {% IF goods_modifications_properties.values.SELECTED %}checked="checked"{% ENDIF %} /> {goods_modifications_properties.values.NAME} <br />
																																 {% IF goods_modifications_properties.values.last %}
																																			 </span>
																																 {% ENDIF %}
																												 {% ENDFOR %}
																											 </td>
																											 {goods_modifications_properties.index | is_divided("2","</tr><tr>","")}
																								 {% ENDFOR %}



далее найдите в файле main.js

// Функция собирает свойства в строку, для определения модификации товара
function getSlugFromGoodsDataFormModificationsProperties(obj) {
var properties = new Array();
$(obj).each(function(i){
	 properties[i] = parseInt($(this).val());
});
return properties.sort(function(a,B){return a - b}).join('_');
}

var
// Запоминаем поля выбора свойств, для ускорения работы со значениями свойств
goodsDataProperties = $('div.goodsDataMainModificationsBlock select[name="form[properties][]"]'),
// Запоминаем блоки с информацией по модификациям, для ускорения работы
goodsDataModifications = $('div.goodsDataMainModificationsList');
// Обновляет возможность выбора свойств модификации, для отключения возможности выбора по характеристикам модификации которой не существует.
function updateVisibility (y) {
// Проверяем в каждом соседнем поле выбора модификаций, возможно ли подобрать модификацию для указанных свойств
goodsDataProperties.each(function(j){
	 // Если мы сравниваем значения свойства не с самим собой, а с другим списком значений свойств
	 if( j != y ) {
	 // Проходим по всем значениям текущего свойства модификации товара
	 $(this).find('option').each(function(){
		 // Записываем временный массив свойств, которые будем использовать для проверки существования модификации
		 var checkProperties = new Array();
		 $(goodsDataProperties).each(function(i){
		 checkProperties[i] = parseInt($(this).val());
		 });
		 // Пытаемся найти модификацию соответствующую выбранным значениям свойств
		 checkProperties[j] = parseInt($(this).attr('value'));
		 // Собираем хэш определяющий модификацию по свойствам
		 slug = checkProperties.sort(function(a,B){return a - b}).join('_');
		 // Ищем модификацию по всем выбранным значениям свойств товара. Если модификации нет в возможном выборе, отмечаем потенциальное значение выбора как не доступное для выбора, т.к. такой модификации нет.
		 if(!goodsDataModifications.filter('[rel="'+slug+'"]').length) {
		 $(this).attr('disabled', true);
		 // Если выбрав данное значение свойства товара можно подобрать модификацию, то выделяем вариант выбора как доступный.
		 } else {
		 $(this).attr('disabled', false);
		 }
	 });
	 }
});
}
// Обновляем возможность выбора модификации товара по свойствам. Для тех свойств, выбор по которым не возможен, отключаем такую возможность.
// Проверяем возможность выбора на всех полях кроме первого, чтобы отключить во всех остальных варианты, которые не возможно выбрать
updateVisibility (0);
// Проверяем возможность выбора на всех полях кроме второго, чтобы в первом поле так же отключилась возможность выбора не существующих модификаций
updateVisibility (1);
// Изменение цены товара при изменении у товара свойства для модификации
goodsDataProperties.each(function(y){
$(this).change(function(){
	 var slug = getSlugFromGoodsDataFormModificationsProperties(goodsDataProperties),
	 modificationBlock			 = goodsDataModifications.filter('[rel="'+slug+'"]'),
	 modificationId			 = parseInt(modificationBlock.find('[name="id"]').val()),
	 modificationArtNumber		 = modificationBlock.find('[name="art_number"]').val(),
	 modificationPriceNow		 = parseFloat(modificationBlock.find('[name="price_now"]').val()),
	 modificationPriceNowFormated = modificationBlock.find('.price_now_formated').html(),
	 modificationPriceOld		 = parseFloat(modificationBlock.find('[name="price_old"]').val()),
	 modificationPriceOldFormated = modificationBlock.find('.price_old_formated').html(),
	 modificationRestValue		 = parseFloat(modificationBlock.find('[name="rest_value"]').val()),
	 modificationDescription	 = modificationBlock.find('.description').html(),
	 modificationMeasureId		 = parseInt(modificationBlock.find('[name="measure_id"]').val()),
	 modificationMeasureName	 = modificationBlock.find('[name="measure_name"]').val(),
	 modificationMeasureDesc	 = modificationBlock.find('[name="measure_desc"]').val(),
	 modificationMeasurePrecision = modificationBlock.find('[name="measure_precision"]').val(),
	 modificationIsHasInCompareList= modificationBlock.find('[name="is_has_in_compare_list"]').val(),
	 goodsModificationId		 = $('.goodsDataMainModificationId'),
	 goodsPriceNow				 = $('.goodsDataMainModificationPriceNow'),
	 goodsPriceOld				 = $('.goodsDataMainModificationPriceOld'),
	 goodsAvailable			 = $('.goodsDataMainModificationAvailable'),
	 goodsAvailableTrue		 = goodsAvailable.find('.available-true'),
	 goodsAvailableFalse		 = goodsAvailable.find('.available-false'),
	 goodsArtNumberBlock		 = $('.goodsDataMainModificationArtNumber'),
	 goodsArtNumber			 = goodsArtNumberBlock.find('span'),
	 goodsCompareAddButton		 = $('.goodsDataCompareButton.add'),
	 goodsCompareDeleteButton	 = $('.goodsDataCompareButton.delete'),
	 goodsModDescriptionBlock	 = $('.goodsDataMainModificationsDescriptionBlock');

	 // Изменяем данные товара для выбранных параметров. Если нашлась выбранная модификация
	 if(modificationBlock.length) {
	 // Цена товара
	 goodsPriceNow.html(modificationPriceNowFormated);
	 // Старая цена товара
	 if(modificationPriceOld>modificationPriceNow) {
		 goodsPriceOld.html(modificationPriceOldFormated);
	 } else {
		 goodsPriceOld.html('');
	 }
	 // Есть ли товар есть в наличии
	 if(modificationRestValue>0) {
		 goodsAvailableTrue.show();
		 goodsAvailableFalse.hide();
		 // Если товара нет в наличии
	 } else {
		 goodsAvailableTrue.hide();
		 goodsAvailableFalse.show();
	 }
	 // Если товар есть в списке сравнения
	 if(modificationIsHasInCompareList>0) {
		 goodsCompareAddButton.hide();
		 goodsCompareDeleteButton.show();
		 // Если товара нет в списке сравнения
	 } else {
		 goodsCompareAddButton.show();
		 goodsCompareDeleteButton.hide();
	 }
	 // Покажем артикул модификации товара, если он указан
	 if(modificationArtNumber.length>0) {
		 goodsArtNumberBlock.show();
		 goodsArtNumber.html(modificationArtNumber);
		 // Скроем артикул модификации товара, если он не указан
	 } else {
		 goodsArtNumberBlock.hide();
		 goodsArtNumber.html('');
	 }
	 // Описание модификации товара. Покажем если оно есть, спрячем если его у модификации нет
	 if(modificationDescription.length > 0) {
		 goodsModDescriptionBlock.show().html('<div>' + modificationDescription + '</div>');
	 } else {
		 goodsModDescriptionBlock.hide().html();
	 }

	 // Идентификатор товарной модификации
	 goodsModificationId.val(modificationId);
	 } else {
	 // Отправим запись об ошибке на сервер
	 sendError('no modification by slug '+slug);
	 alert('К сожалению сейчас не получается подобрать модификацию соответствующую выбранным параметрам.');
	 }
	 // Обновляем возможность выбора другой модификации для текущих значений свойств модификации товара.
	 updateVisibility(y);
});
});


замените на
// Функция собирает свойства в строку, для определения модификации товара
function getSlugFromGoodsDataFormModificationsProperties(obj) {
			 var properties = new Array();
			 var reset_arr = new Array();
			 $(obj).find('input[type="radio"]').each(function(i){
				 if($(this).is(':checked')){
							 properties[i] = parseInt($(this).val());}
			 });
			 for(var i in properties) {
				 if(properties[i]) {
				 reset_arr.push(properties[i]);
				 }
			 }
			 return reset_arr.sort(function(a,B){return a - b}).join('_');
}


var
			 // Запоминаем поля выбора свойств, для ускорения работы со значениями свойств
			 goodsDataProperties = $('.goodsDataMainModificationsBlock .goodsDataMainModificationsRadio'),
		
			 // Запоминаем блоки с информацией по модификациям, для ускорения работы
			 goodsDataModifications = $('div.goodsDataMainModificationsList');


// Обновляет возможность выбора свойств модификации, для отключения возможности выбора по характеристикам модификации которой не существует.
function updateVisibility (y) {
			 // Проверяем в каждом соседнем поле выбора модификаций, возможно ли подобрать модификацию для указанных свойств
			 goodsDataProperties.each(function(j){
				 // Если мы сравниваем значения свойства не с самим собой, а с другим списком значений свойств
				 if( j != y ) {
							 // Проходим по всем значениям текущего свойства модификации товара
							 $(this).find('input[type="radio"]').each(function(){
								 // Записываем временный массив свойств, которые будем использовать для проверки существования модификации
								 //var checkProperties = new Array();
								 /*$(goodsDataProperties).each(function(i){
											 if($(this).is(':checked'))
												 checkProperties[i] = parseInt($(this).val());
								 });*/
								 // Пытаемся найти модификацию соответствующую выбранным значениям свойств
								 //checkProperties[j] = parseInt($(this).attr('value'));
								 // Собираем хэш определяющий модификацию по свойствам
								 //slug = checkProperties.sort(function(a,B){return a - b}).join('_');
slug = getSlugFromGoodsDataFormModificationsProperties(goodsDataProperties);
								 // Ищем модификацию по всем выбранным значениям свойств товара. Если модификации нет в возможном выборе, отмечаем потенциальное значение выбора как не доступное для выбора, т.к. такой модификации нет.
								 if(!goodsDataModifications.filter('[rel="'+slug+'"]').length) {
								 $(this).attr('disabled', 'disabled');
								 // Если выбрав данное значение свойства товара можно подобрать модификацию, то выделяем вариант выбора как доступный.
								 } else {
											 $(this).removeAttr('disabled');
								 }
							 });
				 }
			 });
}
// Обновляем возможность выбора модификации товара по свойствам. Для тех свойств, выбор по которым не возможен, отключаем такую возможность.
updateVisibility (0);

// Изменение цены товара при изменении у товара свойства для модификации
goodsDataProperties.each(function(y){
			 $(this).find('input[type="radio"]').click(function(){
				 var slug = getSlugFromGoodsDataFormModificationsProperties(goodsDataProperties),
								 modificationBlock									 = goodsDataModifications.filter('[rel="'+slug+'"]'),
								 modificationId															 = parseInt(modificationBlock.find('[name="id"]').val()),
								 modificationArtNumber		 = modificationBlock.find('[name="art_number"]').val(),
								 modificationPriceNow				 = parseFloat(modificationBlock.find('[name="price_now"]').val()),
								 modificationPriceNowFormated = modificationBlock.find('.price_now_formated').html(),
								 modificationPriceOld				 = parseFloat(modificationBlock.find('[name="price_old"]').val()),
								 modificationPriceOldFormated = modificationBlock.find('.price_old_formated').html(),
								 modificationRestValue		 = parseFloat(modificationBlock.find('[name="rest_value"]').val()),
								 modificationDescription				 = modificationBlock.find('.description').html(),
								 modificationMeasureId		 = parseInt(modificationBlock.find('[name="measure_id"]').val()),
								 modificationMeasureName				 = modificationBlock.find('[name="measure_name"]').val(),
								 modificationMeasureDesc				 = modificationBlock.find('[name="measure_desc"]').val(),
								 modificationMeasurePrecision = modificationBlock.find('[name="measure_precision"]').val(),
								 modificationIsHasInCompareList= modificationBlock.find('[name="is_has_in_compare_list"]').val(),
								 goodsModificationId					 = $('.goodsDataMainModificationId'),
								 goodsPriceNow										 = $('.goodsDataMainModificationPriceNow'),
								 goodsPriceOld										 = $('.goodsDataMainModificationPriceOld'),
								 goodsAvailable															 = $('.goodsDataMainModificationAvailable'),
								 goodsAvailableTrue								 = goodsAvailable.find('.available-true'),
								 goodsAvailableFalse					 = goodsAvailable.find('.available-false'),
								 goodsArtNumberBlock					 = $('.goodsDataMainModificationArtNumber'),
								 goodsArtNumber															 = goodsArtNumberBlock.find('span');
								 goodsCompareAddButton		 = $('.goodsDataCompareButton.add');
								 goodsCompareDeleteButton			 = $('.goodsDataCompareButton.delete');
								 goodsModDescriptionBlock			 = $('.goodsDataMainModificationsDescriptionBlock');
				
				
				 // Изменяем данные товара для выбранных параметров. Если нашлась выбранная модификация
				 if(modificationBlock.length) {
								 // Цена товара
								 goodsPriceNow.html(modificationPriceNowFormated);

								 // Старая цена товара
								 if(modificationPriceOld>modificationPriceNow) {
								 goodsPriceOld.html(modificationPriceOldFormated);
								 } else {
								 goodsPriceOld.html('');
								 }
							
								 // Есть ли товар есть в наличии
								 if(modificationRestValue>0) {
								 goodsAvailableTrue.show();
								 goodsAvailableFalse.hide();
								 // Если товара нет в наличии
								 } else {
								 goodsAvailableTrue.hide();
								 goodsAvailableFalse.show();
								 }
								 // Если товар есть в списке сравнения
								 if(modificationIsHasInCompareList>0) {
								 goodsCompareAddButton.hide();
								 goodsCompareDeleteButton.show();
								 // Если товара нет в списке сравнения
								 } else {
								 goodsCompareAddButton.show();
								 goodsCompareDeleteButton.hide();
								 }
							
								 // Покажем артикул модификации товара, если он указан
								 if(modificationArtNumber.length>0) {
								 goodsArtNumberBlock.show();
								 goodsArtNumber.html(modificationArtNumber);
								 // Скроем артикул модификации товара, если он не указан
								 } else {
								 goodsArtNumberBlock.hide();
								 goodsArtNumber.html('');
								 }
								 // Описание модификации товара. Покажем если оно есть, спрячем если его у модификации нет
								 if(modificationDescription.length > 0) {
								 goodsModDescriptionBlock.show().html('<div>' + modificationDescription + '</div>');
								 } else {
								 goodsModDescriptionBlock.hide().html();
								 }
							
							
								 // Идентификатор товарной модификации
								 goodsModificationId.val(modificationId);
								 window.location.hash = '?modification='+modificationId;
				 } else {
								 // Отправим запись об ошибке на сервер
								 sendError('no modification by slug '+slug);
								 alert('К сожалению сейчас не получается подобрать модификацию соответствующую выбранным параметрам.');
				 }
				
				 // Обновляем возможность выбора другой модификации для текущих значений свойств модификации товара.
				 updateVisibility(y);
			 });
});

далее найдите строку:
return reset_arr.sort(function(a,B){return a - b}).join('_');

в ней "B" замените на "b"




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных