Опционные свойства в виде выпадающих списков с сохранением добавления товара в корзину без перезагрузки(demodizzy) — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
 
(не показаны 2 промежуточные версии этого же участника)
Строка 14: Строка 14:
 
==Решение:==
 
==Решение:==
  
:немного изменить basket.js(templates/demodizzy/js), а именно откорректировали функцию добавления в корзину:
+
:немного изменить basket.js(templates/demodizzy/js), а именно откорректировать функцию добавления в корзину:
  
<source lang="js">
+
<source lang="javascript">
 +
 
 +
site.basket.add = function(id, form, popup) {
 +
    var e_name, options = {};
 +
    if (form) {
 +
        var elements = jQuery('option:selected', form);
 +
        for (var i = 0; i < elements.length; i++) {
 +
            e_name = elements[i].id.replace(/^options\[/, '').replace(/\]$/, '');
 +
            options[e_name] = elements[i].value;
 +
        }
 +
    }
 +
    basket.putElement(id, options, this.replace(id));
 +
    if (popup) jQuery('#add_options_' + id).remove();
 +
};
  
 
</source>
 
</source>
  
:Внесем в него изменения:
+
Были внесены следующие изменения:
 +
 
 +
*radio:checked было изменено на option:selected
 +
*elements[i].name.replace заменено на elements[i].id.replace
 +
 
 +
 
 +
:Шаблоны вывода опционных свойств изменим следующим образом(templates/demodizzy/xslt/modules/catalog/object-view.xsl):
  
 
<source lang="xml">
 
<source lang="xml">
<xsl:template match="price" mode="discounted-price">
+
<xsl:template match="property" mode="table_options">
<xsl:if test="original!=' ' ">
+
<table class="object">
 +
<tr>
 +
<th>
 +
<xsl:value-of select="concat(title, ':')" />
 +
</th>
 +
<td>
 +
<select id="options[{@name}]" name="options[{@name}]">
 +
<xsl:apply-templates select="value/option" mode="table_options" />
 +
</select>
 +
</td>
 +
</tr>
 +
</table>
 +
</xsl:template>
  
      <span style="text-decoration: line-through"> 
 
  
            <xsl:value-of select="concat(@prefix, ' ', original,' ', @suffix)" />
 
  
      </span>
+
<xsl:template match="option" mode="table_options">
      </xsl:if>
+
<option value="{object/@id}" name="options[{../../@name}]" id="options[{../../@name}]">
 
+
<xsl:value-of select="object/@name" />
            <xsl:value-of select="concat(@prefix, ' ', actual,' ', @suffix)" />  
+
</option>
 
</xsl:template>
 
</xsl:template>
 
</source>
 
</source>
 
:Старая цена зачеркивается, если срабатывает условие, что original(старая цена) не пустой.
 
:Если не прописать данное условие, то, при отключении активности скидки, рядом с обычной ценой отобразится лишний зачеркнутый суффикс "руб".
 

Текущая версия на 15:38, 31 января 2014

Актуально для версии 2.9.5

Данное решение рассмотрено на примере интернет-магазина "Современный", шаблон demodizzy.


Задача:

Необходимо, чтобы опционные свойства выводились в виде выпадающих списков и сохранилось добавление товара в корзину без перезагрузки.

Дело было в том, что js файл, который отвечает за добавление товара в корзину без перезагрузки обращается к элементам radiobutton, которые изначально описаны в шаблоне дизайна. Если изменить radiobutton на выпадающие списки, страница будет перезагружаться.

Решение:

немного изменить basket.js(templates/demodizzy/js), а именно откорректировать функцию добавления в корзину:
site.basket.add = function(id, form, popup) {
    var e_name, options = {};
    if (form) {
        var elements = jQuery('option:selected', form);
        for (var i = 0; i < elements.length; i++) {
            e_name = elements[i].id.replace(/^options\[/, '').replace(/\]$/, '');
            options[e_name] = elements[i].value;
        }
    }
    basket.putElement(id, options, this.replace(id));
    if (popup) jQuery('#add_options_' + id).remove();
};

Были внесены следующие изменения:

  • radio:checked было изменено на option:selected
  • elements[i].name.replace заменено на elements[i].id.replace


Шаблоны вывода опционных свойств изменим следующим образом(templates/demodizzy/xslt/modules/catalog/object-view.xsl):
	<xsl:template match="property" mode="table_options">
		<table class="object">
				<tr>
					<th>
						<xsl:value-of select="concat(title, ':')" />
					</th>
			<td>
			<select id="options[{@name}]" name="options[{@name}]">
				<xsl:apply-templates select="value/option" mode="table_options" />
			</select>
			</td>
			</tr>
		</table>
	</xsl:template>



	<xsl:template match="option" mode="table_options">
			<option value="{object/@id}" name="options[{../../@name}]" id="options[{../../@name}]">
		<xsl:value-of select="object/@name" />
	</option>
	</xsl:template>