UMIhelp

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

Название: Зачеркнутая цена в объектах каталога
Отправлено: sam от 07 Ноября 2014, 01:48:18
Здравствуйте!

Прошу подсказать: хочу сделать старую зачеркнутую цену рядом с ценой без использования скидочных механизмов, т.е. в Шаблоне данных (Тип данных -> Объекты каталога) в ценовые свойства добавляю новое поле с идентификатором "old_price", получаю в объектах это пустое поле (тип: строка/цена), дальше в объекте вручную ввожу произвольную цену и пробую вызвать инфо. из этого блока через <xsl:value-of select="//property[@name = 'old_price']/value/item/@name" /> в object-view.xsl, а информация/значение не выводиться на сайт?!

Почему? Что не так делаю?!

Заранее спасибо за помощь!

P.S. Суть в том, чтобы на сайте сделать блок с двумя ценами, одна зачеркнутая, а другая реальная - поля заполняются вручную при обновлении цен на товары (если, например, предыдущая цена была дороже настоящей, в старые вручную переносим предыдущую цену и зачеркиваем, а в поле цена вписываем уже актуальную новую цену).
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: admin от 07 Ноября 2014, 21:00:21
Если вы создали поле для старой цены, оно явно имеет тип данных либо числовое, либо число с точкой, либо строка. Во всех случаях, при выводе значений такого поля вам нужен вызов вида
<xsl:value-of select="//property[@name = 'old_price']/value" />

А приведенный вами вызов, больше подходит для полей типа "выпадающий список".
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: sam от 07 Ноября 2014, 21:54:11
Спасибо! Это вроде азы, а я так и не догадался убрать лишнее после value.

Может еще подскажите, как сделать, чтобы вывести разницу в цене, т.е. "старая цена - новая цена = разница в цене" (<xsl:value-of select="//property[@name = 'old_price']/value" /> минус <xsl:apply-templates select="document(concat('udata://emarket/price/', page/@id,'//0'))" /> = разница в цене)?
Можно ведь это прописать каким-то одним xsl-вызовом?

И еще, <xsl:value-of select="//property[@name = 'old_price']/value" /> можно сделать, чтобы цена выводилась по формату 99 999. Просто не знаю, как здесь заключить ее в нужный формат.

И последнее, делаю проверку на заполнение поля "старая цена", а она не работает - в чём ошибка на Ваш взгляд (код ниже):

<xsl:choose>
<xsl:when test="value and not(value='')">     
<span>       
<xsl:value-of select="//property[@name = 'old_price']/value" />
<xsl:text> руб</xsl:text>
</span>
</xsl:when>
<xsl:otherwise>
<xsl:text>Цена:</xsl:text>
</xsl:otherwise>
</xsl:choose>


Без заключения в span проверка тоже не работает.

Пожалуйста, постарайтесь ответить на все три связанных друг с другом вопроса.
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: admin от 08 Ноября 2014, 01:18:27
xslt это может
<xsl:variable name="old_price" select="//property[@name = 'old_price']/value" />
<xsl:variable name="new_price" select="document(concat('udata://emarket/price/', page/@id,'//0'))/udata/price/actual" />
<xsl:variable name="discount_value" select="$old_price - $new_price" />

разница цен: <xsl:value-of select="$discount_value" />
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: sam от 08 Ноября 2014, 01:33:00
Цитировать
xslt это может
Код:
<xsl:variable name="old_price" select="//property[@name = 'old_price']/value" />
<xsl:variable name="new_price" select="document(concat('udata://emarket/price/', page/@id,'//0'))/udata/price/actual" />
<xsl:variable name="discount_value" select="$old_price - $new_price" />

разница цен: <xsl:value-of select="$discount_value" />

Т.е., получается что <xsl:apply-templates select="document(concat('udata://emarket/price/', page/@id,'//0'))" /> я могу заменить на Ваш код <xsl:variable name="new_price" select="document(concat('udata://emarket/price/', page/@id,'//0'))/udata/price/actual" />.

Правильно ли я понимаю, что, если даже не будет старой цены, а только действующая одна цена, то она по этому вызову будет выводиться, а сама формула будет работать только при заполнении старой и новой цены, да?

А еще на два вопроса ответите, где формат цены и проверка (см. выше)?
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: admin от 08 Ноября 2014, 04:59:09
Правильно ли я понимаю, что, если даже не будет старой цены, а только действующая одна цена, то она по этому вызову будет выводиться, а сама формула будет работать только при заполнении старой и новой цены, да?

А еще на два вопроса ответите, где формат цены и проверка (см. выше)?

<xsl:variable name="new_price" select="document(concat('udata://emarket/price/', page/@id,'//0'))/udata/price/actual" />
вытянет одну переменную, одним запросом, а код
<xsl:apply-templates select="document(concat('udata://emarket/price/', page/@id,'//0'))" /> обрабатывает весь блок применяя отдельный шаблон. Вам же нужно было только значение.

По поводу формата цены мы уже с вами обсуждали в какой-то теме недавно.

По поводу проверки, тестируйте или приводите пример, что делает что не работает.
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: sam от 08 Ноября 2014, 16:07:54
Проверка - примерный код уже приводил выше, повторюсь (см. ниже):

<xsl:choose>
<xsl:when test="value and not(value='')">     
<span>       
<xsl:value-of select="//property[@name = 'old_price']/value" />
<xsl:value-of select="concat(' ', @suffix)" />
</span>
</xsl:when>
<xsl:otherwise>
<xsl:text>Цена:</xsl:text>
</xsl:otherwise>
</xsl:choose>

Если заполнено поле старая цена, выводить ее, если нет, то выводить текст "Цена:".
-----
Расчет разницы в цене - а нельзя действующий код переделать?:

<xsl:apply-templates select="document(concat('udata://emarket/price/', page/@id,'//0'))" />

заменить на:

<xsl:variable name="new_price" select="document(concat('udata://emarket/price/', page/@id,'//0'))" />

Такой код сработает, или только предложенный Вами вариант должен быть?! Просто не везде будет заполнено поле "старая цена", и не везде нужен будет вычислительный расчет.
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: admin от 08 Ноября 2014, 17:44:54
sam, вы можете использовать и комбинировать куски "форматирование числа", "вывод цены", "вывод старой цены", "высчитывание разницы" как угодна, все уже зависитот вашей фантазии

Цитировать
<xsl:choose>
   <xsl:when test="value and not(value='')">     
      <span>       
         <xsl:value-of select="//property[@name = 'old_price']/value" />
         <xsl:text> руб</xsl:text>
      </span>
   </xsl:when>
   <xsl:otherwise>
      <xsl:text>Цена:</xsl:text>
   </xsl:otherwise>
</xsl:choose>

в этом коде все написанно верно, но не факт, что там где вы его используете есть те переменные которые вы проверяете. То есть я не в курсе где вы вставляете этот код и есть ли там параметр value и что в нем может выводится, если в этом месте доступ к //property[@name = 'old_price']/value. Так что вопрос скорее к вам, где вы это выводите, какой xml вам там доступен и т.п. советую просто перепроверить все эти составляющие. Так как иначе проще залезть к вам на сайт, чем помочь вам советом. Уж слишком мног очего придется выспрашивать у вас.

P.S. проверьте каждый элемент (value, //property[@name = 'old_price']/value и т.п.) с которым вы работает, посмотрите, что там за значения бывают, а потом уже смотрите как из них формируется выражение для логической проверки. Так и выясните в чем сложность.
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: sam от 08 Ноября 2014, 23:57:58
Вспомнил я проблему с проверкой и выводом иконок (лучшее/новинки), и воспользовался предложенным Вами в той теме вариантом при проверке value, и сделал следующий рабочий код (с использованием расчета разницы между старой и новой ценой) - <xsl:when test="document(concat('upage://', page/@id, '.old_price'))//value">:

<xsl:choose>
<xsl:when test="document(concat('upage://', page/@id, '.old_price'))//value">
<xsl:value-of select="format-number(//property[@name = 'old_price']/value, '#&#160;###,##','price')" />
<xsl:text> руб</xsl:text>
<xsl:text> (</xsl:text>
<xsl:value-of select="format-number($discount_value, '#&#160;###,##','price')" />
<xsl:text> руб)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>Цена:</xsl:text>
</xsl:otherwise>
</xsl:choose>


Главное, что все работает. Спасибо, что подтолкнули на поиск решения проблемы самостоятельно! За уделённое время на мои вопросы отдельное спасибо! Думаю, что тема закрыта.
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: sam от 10 Апреля 2015, 14:08:24
Здравствуйте! Возник вопрос, как уже писали выше, разницу между новой и старой ценой в числовом выражении мы выводить научились, а вот как можно получить эту-же разницу в процентном соотношении? Например, нужно получить следующее (формула):

87000 * 100 / 950000 = 9,16%

Делаю я это так, но не работает?! Как подправить, чтобы сработало?:
<xsl:variable name="discount_percent" select="$new_price * 100 / $old_price" />
<xsl:value-of select="format-number(discount_percent, '#&#160;###,##','price')" />

Заранее спасибо за помощь!
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: admin от 10 Апреля 2015, 15:13:04
87000 * 100 / 950000 = 9,16%

Делаю я это так, но не работает?! Как подправить, чтобы сработало?:
<xsl:variable name="discount_percent" select="$new_price * 100 / $old_price" />
<xsl:value-of select="format-number(discount_percent, '#&#160;###,##','price')" />

вместо символа деления "/" используйте "div"
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: admin от 10 Апреля 2015, 18:29:53
пример чего? у вас уже есть код, у вас была ошибка в знаках, в беседе прояснилось в чем именно.
Или вы имеет в виду написать ваш кусочек кода с исправлением?

<xsl:variable name="discount_percent" select="$new_price * 100 div $old_price" />
<xsl:value-of select="format-number(discount_percent, '#&#160;###,##','price')" />
Название: Re:Зачеркнутая цена в объектах каталога
Отправлено: sam от 10 Апреля 2015, 18:40:10
admin, спасибо! не сразу понял, что "/" надо просто заменить на "div". У меня была ошибка при вычисление процента (в самой формуле расчета), подправил так, буду пробовать реализовать:

<xsl:variable name="discount_value" select="$new_price - $old_price" />
<xsl:variable name="discount_percent" select="$discount_value * 100 div $old_price" />
<xsl:value-of select="format-number($discount_percent, '#&#160;###,##','price')" />