UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: sam от 16 Октября 2014, 10:16:18

Название: Вывод цены (price)
Отправлено: sam от 16 Октября 2014, 10:16:18
Просьба подсказать, как сделать так, чтобы цена выводилась не так 99990 руб, а было так 99 990 руб, т.е. с отступом перед тысячным? В какой директиве, в каком файле, какие надо вносить изменения для этого?
Название: Re:Вывод цены (price)
Отправлено: admin от 16 Октября 2014, 15:18:18
для этого есть спец функция у xslt, которая преобразует число в определенный формат.

Конкретно для вашего случая подойдет такой код:

- надо прописать до описание всех template такую консткурцию (скорее всего в файл /templates/demodizzy/xslt/default.xsl)
<xsl:decimal-format name="price" decimal-separator="," grouping-separator="&#160;"/>
- затем при выводе цены, например из узла actual (шаблон для вывода цены /templates/demodizzy/xslt/modules/catalog/price.xsl) указать преобразование
<xsl:value-of select="format-number(actual, '#&#160;###,##','price')" />
Название: Re:Вывод цены (price)
Отправлено: sam от 16 Октября 2014, 18:51:52
Цитировать
-надо прописать до описание всех template такую консткурцию (скорее всего в файл /templates/demodizzy/xslt/default.xsl)

Вставил сразу после xsl:output...

Цитировать
- затем при выводе цены, например из узла actual (шаблон для вывода цены /templates/demodizzy/xslt/modules/emarket/price.xsl) указать преобразование

Содержимое price.xsl - раньше было так:
	<xsl:template match="udata[@method = 'price']">
<xsl:apply-templates select="price" />
</xsl:template>

<xsl:template match="total-price">
<xsl:value-of select="concat(@prefix, ' ', actual, ' ', @suffix)" />
</xsl:template>

<xsl:template match="price" mode="discounted-price">
<xsl:value-of select="concat(@prefix, ' ', actual, ' ', @suffix)" />
</xsl:template>

<xsl:template match="price">
<xsl:value-of select="concat(@prefix, ' ', original, ' ', @suffix)" />
</xsl:template>

<xsl:template match="price[not(original) or original = '']">
<xsl:value-of select="concat(@prefix, ' ', actual, ' ', @suffix)" />
</xsl:template>

Сейчас содержимое сделал таким - работает:
	<xsl:template match="udata[@method = 'price']">
<xsl:apply-templates select="price" />
</xsl:template>

<xsl:template match="total-price">
<xsl:value-of select="concat(@prefix, ' ')" />
<xsl:value-of select="format-number(actual, '#&#160;###,##','price')" />
<xsl:value-of select="concat(' ', @suffix)" />
</xsl:template>

<xsl:template match="price" mode="discounted-price">
<xsl:value-of select="concat(@prefix, ' ')" />
<xsl:value-of select="format-number(actual, '#&#160;###,##','price')" />
<xsl:value-of select="concat(' ', @suffix)" />
</xsl:template>

<xsl:template match="price">
<xsl:value-of select="concat(@prefix, ' ')" />
<xsl:value-of select="format-number(original, '#&#160;###,##','price')" />
<xsl:value-of select="concat(' ', @suffix)" />
</xsl:template>

<xsl:template match="price[not(original) or original = '']">
<xsl:value-of select="concat(@prefix, ' ')" />
<xsl:value-of select="format-number(actual, '#&#160;###,##','price')" />
<xsl:value-of select="concat(' ', @suffix)" />
</xsl:template>

1. В корзине тоже всё работает, за исключением одного - при увеличении количества товаров (js) сумма меняется автоматически и формат сбрасывается.
Правильно ли я понимаю, что в basket.js надо вносить аналогичные правки, чтобы формат не менялся? Как это сделать?


2. В basket.xsl есть строка, которая тоже выводит сумму/цену без форматирования - код ниже, можете подсказать, как здесь применить форматирование?:
	<xsl:template match="summary[amount &gt; 0]" mode="basket">
<span>
<xsl:apply-templates select="amount" />
</span>
<xsl:text> &basket-items-text; </xsl:text>
<xsl:apply-templates select="price/@prefix" />
<xsl:apply-templates select="price/actual" />
<xsl:apply-templates select="price/@suffix" />
</xsl:template>

3. И надо ли в cart.xsl где-то вносить изменения, или там форматировать нечего?

P.S. В правом верхнем углу сайта корзина тоже без форматирования, тоже вроде basket.js выводит туда информацию из корзины?
В basket.js как можно задать такой-же формат?
Название: Re:Вывод цены (price)
Отправлено: admin от 16 Октября 2014, 22:50:39
В корзине тоже всё работает, за исключением одного - при увеличении количества товаров (js) сумма меняется автоматически и формат сбрасывается.
Правильно ли я понимаю, что в basket.js надо вносить аналогичные правки, чтобы формат не менялся? P.S. В правом верхнем углу сайта корзина тоже без форматирования, тоже вроде basket.js выводит туда информацию из корзины?
В basket.js как можно задать такой-же формат?

Да, это нужно править вывод цены на уровне js обработки в файле /templates/demodizzy/js/basket.js. Единого способа нет, есть много вариантов, поищите в поисковике запрос "js формат цены"
Название: Re:Вывод цены (price)
Отправлено: admin от 16 Октября 2014, 23:49:55
1. В корзине тоже всё работает, за исключением одного - при увеличении количества товаров (js) сумма меняется автоматически и формат сбрасывается.
Правильно ли я понимаю, что в basket.js надо вносить аналогичные правки, чтобы формат не менялся? Как это сделать?


2. В basket.xsl есть строка, которая тоже выводит сумму/цену без форматирования - код ниже, можете подсказать, как здесь применить форматирование?:
	<xsl:template match="summary[amount &gt; 0]" mode="basket">
<span>
<xsl:apply-templates select="amount" />
</span>
<xsl:text> &basket-items-text; </xsl:text>
<xsl:apply-templates select="price/@prefix" />
<xsl:apply-templates select="price/actual" />
<xsl:apply-templates select="price/@suffix" />
</xsl:template>

3. И надо ли в cart.xsl где-то вносить изменения, или там форматировать нечего?

P.S. В правом верхнем углу сайта корзина тоже без форматирования, тоже вроде basket.js выводит туда информацию из корзины?
В basket.js как можно задать такой-же формат?

резюмирую:
- все что меняется через js, форматируйте средствами js
- везде где вам надо вывести форматированное значние на уровне xslt используйте
<xsl:value-of select="format-number(actual, '#&#160;###,##','price')" />
где вместо actual нужно прописать путь к переменной, узлу или атрибуту, который содержит само число.

В каких шаблонах у вас требуется прописать форматирование не подскажу, так как это зависит от набора ваших шаблонов. Просмотрите все места где вы хотите вывести форматирование и найдите\измените все соответствующие xsl шаблоны.
Название: Re:Вывод цены (price)
Отправлено: sam от 17 Октября 2014, 00:23:04
Спасибо! Буду искать и разбираться еще с js.
Название: Re:Вывод цены (price)
Отправлено: Axiomateria от 25 Октября 2014, 13:22:22
для этого есть спец функция у xslt, которая преобразует число в определенный формат.

Конкретно для вашего случая подойдет такой код:

- надо прописать до описание всех template такую консткурцию (скорее всего в файл /templates/demodizzy/xslt/default.xsl)
<xsl:decimal-format name="price" decimal-separator="," grouping-separator=" "/>
- затем при выводе цены, например из узла actual (шаблон для вывода цены /templates/demodizzy/xslt/modules/catalog/price.xsl) указать преобразование
<xsl:value-of select="format-number(actual, '# ###,##','price')" />

А что делать в случае двух цен у товара, то есть ес ть актуальная цена, по которой товар и покупается и есть "старая" цена названием поля "old_price" и его типом "price" ?
В шаблоне объекта каталога данные выводятся так:
 <xsl:value-of select="//property[@name='old_price']/value" />
и обрабатываются так:
  <xsl:template match="property[@type='price']/value">
            <xsl:value-of select="." />
    </xsl:template>
?
Название: Re:Вывод цены (price)
Отправлено: admin от 07 Ноября 2014, 20:55:16
А что делать в случае двух цен у товара, то есть ес ть актуальная цена, по которой товар и покупается и есть "старая" цена названием поля "old_price" и его типом "price" ?
В шаблоне объекта каталога данные выводятся так:
 <xsl:value-of select="//property[@name='old_price']/value" />
и обрабатываются так:
  <xsl:template match="property[@type='price']/value">
            <xsl:value-of select="." />
    </xsl:template>
?

Все точно также. Как только у вас есть число, которое вам надо вывести в определенном виде, подставляйте его как первый параметр к выше приведенному вызову. Например так

<xsl:value-of select="format-number(ваше_число_или_переменная_или_значение_из_xml , '# ###,##','price')" />

P.S. Не забывайте добавить в свой шаблон
<xsl:decimal-format name="price" decimal-separator="," grouping-separator=" "/>
Название: Re: Вывод цены (price)
Отправлено: Axiomateria от 23 Июня 2015, 20:17:58
<xsl:value-of select="format-number(actual, '#&#160;###,##','price')" />
В данном примере работает разделение десятков тысяч, то есть выход 10 _пробел_ 000 руб или 10 000 р.

А если цена товара 100 000 рублей ?
Я попробовал поискать в интернете по запросу decimal-separator из переменной     
<xsl:decimal-format name="price" decimal-separator="," grouping-separator="&#160;"/>  
но мне всё про Delphi только попадаются страницы....
Название: Re: Вывод цены (price)
Отправлено: admin от 23 Июня 2015, 21:16:26
А если цена товара 100 000 рублей ?
Я попробовал поискать в интернете по запросу decimal-separator из переменной     
<xsl:decimal-format name="price" decimal-separator="," grouping-separator="&#160;"/>  
но мне всё про Delphi только попадаются страницы....

попробуйте
<xsl:value-of select="format-number(actual, '#&#160;###&#160;###,##','price')" />
Название: Re: Вывод цены (price)
Отправлено: Axiomateria от 23 Июня 2015, 21:31:10
А если цена товара 100 000 рублей ?
Я попробовал поискать в интернете по запросу decimal-separator из переменной     
<xsl:decimal-format name="price" decimal-separator="," grouping-separator=" "/>  
но мне всё про Delphi только попадаются страницы....
попробуйте
<xsl:value-of select="format-number(actual, '# ### ###,##','price')" />
Попробовал и так тоже, но увы, в корзине товаров, где это в общем-то только и нужно ни чего не произошло, то есть по прежнему слитно сумма в 100000 рублей получается.
Вот этот самый шаблон в полный рост:
    <xsl:template match="price[not(original) or original = '' or actual != '0']">
        <xsl:value-of select="concat(@prefix, ' ')" />
        <xsl:value-of select="format-number(actual, '#&#160;###&#160;###,##','price')" />
        <span class="suffix">
            <xsl:value-of select="concat(' ', @suffix)" />
        </span>
    </xsl:template>
</xsl:stylesheet>