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

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

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Вызов цены товара
« : 13 Апреля 2015, 13:23:38 »
Здравствуйте! Сделал одну фишку - если перелистывать страницу, наверху всплывает неподвижный "head" в которым через xsl вызвал значение "h1" (//property[@name = 'h1']/value). Хочу вызывать еще цену на товар, если это всплывает в объекте каталога, но не получается.
Просьба подсказать, как правильнее вызвать цену товара + сделать проверку, чтобы, если посетитель зашел именно на страницу объекта каталога, то выводить ему еще и цену, если в других разделах сайта, то цену не выводить.

Делаю так (значение "h1" вызывается, а вот цена нет, и проверку не знаю какую написать?!):
...
<div id="watching_name">
<xsl:apply-templates select="//property[@name = 'h1']/value" />
<xsl:if test="проверка, выводить, если это объект каталога">
<span umi:element-id="{page/@id}" umi:field-name="price">
<xsl:apply-templates select="document(concat('udata://emarket/price/', page/@id,'//0'))" />
</span>
</xsl:if>
</div>
...

Т.е. вопросов два:
1. Проверка, выводить цену, если это объект каталога - как сделать?
2. Цена по вышеуказанному вызову не выводиться - что не так?

Заранее спасибо за советы и подсказки!
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #1 : 16 Апреля 2015, 21:55:12 »
Коллеги, сделайте одолжение, подскажите/советуйте по вопросам выше.
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #2 : 17 Апреля 2015, 17:20:06 »
а данный шаблон какой xml обрабатывает? что у него есть под рукой?

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #3 : 17 Апреля 2015, 20:44:30 »
Не совсем понял Ваш вопрос - этот всплывающий div на 50-60% дублирует инфо из head, т.е. выводит инфо из шапки сайта (логотип, ссылки и контактный телефон). А то, что я пробовал вызвать там цену товара из объекта, этот xsl я беру из object-view.xsl - в object-view.xsl XML именно цены следующий:
<property id="267" name="price" type="price">
<value xlink:href="udata://emarket/price/36092">9990</value>
</property>

Просто, почему по такому-же вызову я не могу цену "price" вызывать в этой всплывающей шапке - h1 ведь вызвал?!

И какую проверку написать, чтобы если вызову цену, то чтобы она отображалась только тогда, когда посетитель на странице с товаром, т.е. после h1 на всплывающей шапке?!
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #4 : 18 Апреля 2015, 18:30:36 »
Цитировать
Просьба подсказать, как правильнее вызвать цену товара
вы уже все написали:
<span umi:element-id="{page/@id}" umi:field-name="price">
<xsl:apply-templates select="document(concat('udata://emarket/price/', page/@id,'//0'))" />
</span>
единственное, что в зависимости от того где вы вызываете этот вызов у вас может меняться строчка page/@id , так как id товара может располагаться по другому пути. Протестируйте через
<xsl:value-of select="page/@id" />
выводит ли он id товара, если нет определите с каким xml вы работает (например использовав <xsl:copy-of select="." /> и посмотрев результат в исходном коде страницы) и где в нем храниться id товара

Цитировать
чтобы, если посетитель зашел именно на страницу объекта каталога, то выводить ему еще и цену, если в других разделах сайта, то цену не выводить.
это легко проверить если знать модуль и метод текущей страницы. В demodizzy, данные параметры доступны через глобальные параметры $module и $method/ В итоге ваша проверка будет выглядеть так:
<xsl:if test="$module='catalog' and $method='object'">
...
</xsl:if>

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #5 : 19 Апреля 2015, 13:16:31 »
С проверкой всё ясно - спасибо! Когда вызову цену, протестирую саму проверку, пока не могу.

Цитировать
...единственное, что в зависимости от того где вы вызываете этот вызов у вас может меняться строчка page/@id , так как id товара может располагаться по другому пути. Протестируйте через <xsl:value-of select="page/@id" /> выводит ли он id товара, если нет определите с каким xml вы работает (например использовав <xsl:copy-of select="." /> и посмотрев результат в исходном коде страницы) и где в нем храниться id товара

Протестировал вышеизложенный <xsl:value-of select="page/@id" /> - id не выводится, использовал <xsl:value-of select="@id" /> - тоже id не получил. Этот всплывающий "head" у меня размещен в /layouts/default.xsl. А <xsl:copy-of select="." /> даёт следующий результат:
<result xmlns:xlink="http://www.w3.org/TR/xlink" module="catalog" method="object" domain="domain" system-build="21905" lang="ru" header="header" title="title" site-name="site-name" request-uri="request-uri" pageId="3061">
<meta>
<parents>
<page id="36" parentId="0" link="/shop/" is-active="1" object-id="480" type-id="77" type-guid="catalog-category" update-time="1378322097" alt-name="shop" xlink:href="upage://36">
<basetype id="54" module="catalog" method="category">Разделы каталога</basetype>
<name>Каталог</name>
</page>
<page id="51" parentId="36" link="/shop/tablets/" is-visible="1" is-active="1" object-id="483" type-id="77" type-guid="catalog-category" update-time="1378321902" alt-name="tablets" xlink:href="upage://51">
<basetype id="54" module="catalog" method="category">Разделы каталога</basetype>
<name>Планшеты</name>
</page>
<page id="27" parentId="51" link="/shop/tablets/vendorname/" is-visible="1" is-active="1" object-id="436" type-id="77" type-guid="catalog-category" update-time="1378223312" alt-name="vendorname" xlink:href="upage://27">
<basetype id="54" module="catalog" method="category">Разделы каталога</basetype>
<name>Планшеты vendorname</name>
</page>
</parents>
<page id="3061" parentId="27" link="link" is-active="1" object-id="30593" type-id="119" update-time="1428650656" alt-name="alt-name">
<basetype id="55" module="catalog" method="object">Объекты каталога</basetype>
...
</page>
</meta>
</result>

Согласно полученному выше коду/результату, можно как-то понять и вызвать цену товара?
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #6 : 20 Апреля 2015, 09:15:01 »
Согласно полученному выше коду/результату, можно как-то понять и вызвать цену товара?

Да, видя, с каким xml вы работает, легко понять где есть id страницы.
Вы можете его взять из атрибута result/@pageId, либо из атрибута result/page/@id. В обоих случаях вы получите то, что вам надо.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #7 : 20 Апреля 2015, 10:37:00 »
Благодарю! Следующий момент, а чтобы вывести там же после цены еще и кнопку "добавить в корзину", которая в свою очередь должна работать корректно, т.е. добавить объект в корзину - как отредактировать код ниже?:

<form id="add_basket_{page/@id}" class="options" action="{$lang-prefix}/emarket/basket/put/element/{page/@id}/">
<xsl:apply-templates select=".//group[@name = 'catalog_option_props']" mode="table_options" />
<input type="submit" class="button big" id="add_basket_{$document-page-id}" />
</form>

Я пробовал ставить просто этот код - получил обрубленный шаблон, меняю page/@id на result/@pageId тоже вывод страницы не соответствующий.
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #8 : 20 Апреля 2015, 11:00:01 »
Я пробовал ставить просто этот код - получил обрубленный шаблон

То есть, на лицевой части сайта после места, где должна быть кнопка пустота? Если да, то попробуйте убрать переменную $document-page-id, заменив её на result/@pageId, хотя если у вас demodizzy, то проблема в чем-то другом должна быть.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re:Вызов цены товара
« Ответ #9 : 20 Апреля 2015, 11:19:10 »
Да, demodizzy. Попробую объяснить, в default.xsl внутри всплывающего head вызвал значение value="h1", не без Вашей помощи вызвали там же и цену после названия, а вот дальше пытаюсь встроить кнопку "в корзину" - 1. чтобы она отобразилась при посещении страницы с объектом; 2. и плюс еще, чтобы она работала корректно при кликании по ней.

Правильно ли я Вас понял, что надо в коде кнопки заменить все page/@id и $document-page-id на result/@pageId? Или заменить просто $document-page-id на result/@pageId? Просто, как в первом, так и во втором варианте замены шаблон обрубается, как и прежде.

Я подумал, может шаблон кнопки "в корзину" можно инклудом вызвать, или это не то получается?
« Последнее редактирование: 20 Апреля 2015, 21:27:33 от sam »
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re: Вызов цены товара
« Ответ #10 : 21 Апреля 2015, 10:22:12 »
Выглядит все правильным. Если выводится белый экран обрубая отрисовку дизайна, значит у вас в шаблоне какая-то переменная выводится, которая не объявлена в данном шаблоне или что-то подобное.

Для начала включите вывод ошибок (секция debug в config.ini файле)

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Вызов цены товара
« Ответ #11 : 21 Апреля 2015, 13:53:28 »
Мне удалось определить место ошибки, но как исправить эту ошибку?

Показываю общий код кнопки, в внутри этого же кода место, где выявлена ошибка:
<form id="add_basket_{result/@pageId}" class="options" action="{$lang-prefix}/emarket/basket/put/element/{result/@pageId}/">
<xsl:apply-templates select=".//group[@name = 'catalog_option_props']" mode="table_options" />
<input type="submit" class="button big" id="add_basket_{result/@pageId}">
<xsl:attribute name="value">
<xsl:text>&basket-add;</xsl:text>

Проблема в закомментированном коде (ошибка - "Variable 'cart_items' has not been declared")
<!--xsl:if test="$cart_items/item[page/@id = $document-page-id]">
<xsl:text> [</xsl:text>
<xsl:value-of select="sum($cart_items/item[page/@id = $document-page-id]/amount)" />
<xsl:text>]</xsl:text>
</xsl:if-->

</xsl:attribute>
</input>
</form>
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re: Вызов цены товара
« Ответ #12 : 21 Апреля 2015, 15:17:17 »
что и следовало доказать. Просто создайте переменную $cart_items. Например так
<xsl:variable name="cart_items" select="document('udata://emarket/cart')/udata/items" />

Но Если смотреть шире, то обязательно учтите сколько раз у вас будет вызываться данный макрос. Макрос корзины udata://emarket/cart вообще не самый легкий и вызывать его по несколько раз не стоит.

Что можно сделать:
1. не использовать блок
<!--xsl:if test="$cart_items/item[page/@id = $document-page-id]">
<xsl:text> [</xsl:text>
<xsl:value-of select="sum($cart_items/item[page/@id = $document-page-id]/amount)" />
<xsl:text>]</xsl:text>
</xsl:if-->
так как он нужен только для вывод кол-ва данного товара уже перемещенного в корзину (многим это не важно)
P.S. убрать его из других мест, например из шаблона который выводит список товаров (там через xsl:with-param он передается)

2. Сделать глобальную переменную
 
<xsl:variable name="cart" select="document('udata://emarket/cart')/udata" />
И использовать её и для вывода краткой корзины, и для передачи товаров в корзине (для кнопки купить), через $cart/items, и для подробной корзины (там тоде есть вызов макроса udata://emarket/cart). Таким образом вы сократите нагрузку на сайт.

*

sam

  • ***
  • 216
  • +3/-1
  • "Век живи - век учись!"
    • Просмотр профиля
Re: Вызов цены товара
« Ответ #13 : 21 Апреля 2015, 17:18:55 »
Я за первый предложенный Вами вариант, т.е. не использовать отображение кол-во добавленного товара, только хочу это сделать везде, как на .../modules/catalog/object-view.xsl, так и на .../modules/catalog/common.xsl . Знаю, что в файле .../js/basket.js есть скрипт, который выполняет тоже самое (отображает кол-во добавленного товара), и этот код скрипта, если подскажете, какая это строка в файле, я бы тоже убрал. Ну, чтобы ни в одном шаблоне сайта такого не было, подскажете в файле .../js/basket.js в каком месте эта функция находится?
Жизнь слишком коротка, чтобы выучить и знать всё на свете. Тем более, что мир быстро меняется, и технологии за ним тоже. Но это не повод, чтобы перестать учиться к чему-то новому. "Век живи - век учись!" Иначе жизнь будет прожита без пользы, как для себя, так и для окружающих.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re: Вызов цены товара
« Ответ #14 : 21 Апреля 2015, 17:59:35 »
подскажете в файле .../js/basket.js в каком месте эта функция находится?

ищите блок
if (detect_options.amount) {
var add_basket_button = jQuery('#add_basket_' + detect_options.id);
if (add_basket_button[0].tagName.toUpperCase() == 'A' && !site.basket.is_cart) {
add_basket_button.text(add_basket_button_text + ' (' + detect_options.amount + ')');
}
if (add_basket_button[0].tagName.toUpperCase() == 'FORM') {
add_basket_button = jQuery('input:submit', add_basket_button);
add_basket_button.val(add_basket_button_text + ' (' + detect_options.amount + ')');
}
else add_basket_button.val(add_basket_button_text + ' (' + detect_options.amount + ')');
}

само количество подставляется из переменной detect_options.amount