Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 1 Гость просматривают эту тему.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Вывод цены (price)
« : 16 Октября 2014, 10:16:18 »
Просьба подсказать, как сделать так, чтобы цена выводилась не так 99990 руб, а было так 99 990 руб, т.е. с отступом перед тысячным? В какой директиве, в каком файле, какие надо вносить изменения для этого?
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вывод цены (price)
« Ответ #1 : 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')" />

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re:Вывод цены (price)
« Ответ #2 : 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 как можно задать такой-же формат?
« Последнее редактирование: 16 Октября 2014, 22:53:25 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вывод цены (price)
« Ответ #3 : 16 Октября 2014, 22:50:39 »
В корзине тоже всё работает, за исключением одного - при увеличении количества товаров (js) сумма меняется автоматически и формат сбрасывается.
Правильно ли я понимаю, что в basket.js надо вносить аналогичные правки, чтобы формат не менялся? P.S. В правом верхнем углу сайта корзина тоже без форматирования, тоже вроде basket.js выводит туда информацию из корзины?
В basket.js как можно задать такой-же формат?

Да, это нужно править вывод цены на уровне js обработки в файле /templates/demodizzy/js/basket.js. Единого способа нет, есть много вариантов, поищите в поисковике запрос "js формат цены"

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вывод цены (price)
« Ответ #4 : 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 шаблоны.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re:Вывод цены (price)
« Ответ #5 : 17 Октября 2014, 00:23:04 »
Спасибо! Буду искать и разбираться еще с js.
« Последнее редактирование: 17 Октября 2014, 01:44:07 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Re:Вывод цены (price)
« Ответ #6 : 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>
?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вывод цены (price)
« Ответ #7 : 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=" "/>

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Re: Вывод цены (price)
« Ответ #8 : 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 только попадаются страницы....

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re: Вывод цены (price)
« Ответ #9 : 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')" />

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Re: Вывод цены (price)
« Ответ #10 : 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>