UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: sam от 13 Апреля 2015, 13:23:38

Название: Вызов цены товара
Отправлено: sam от 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. Цена по вышеуказанному вызову не выводиться - что не так?

Заранее спасибо за советы и подсказки!
Название: Re:Вызов цены товара
Отправлено: sam от 16 Апреля 2015, 21:55:12
Коллеги, сделайте одолжение, подскажите/советуйте по вопросам выше.
Название: Re:Вызов цены товара
Отправлено: admin от 17 Апреля 2015, 17:20:06
а данный шаблон какой xml обрабатывает? что у него есть под рукой?
Название: Re:Вызов цены товара
Отправлено: sam от 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 на всплывающей шапке?!
Название: Re:Вызов цены товара
Отправлено: admin от 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>
Название: Re:Вызов цены товара
Отправлено: sam от 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>

Согласно полученному выше коду/результату, можно как-то понять и вызвать цену товара?
Название: Re:Вызов цены товара
Отправлено: admin от 20 Апреля 2015, 09:15:01
Согласно полученному выше коду/результату, можно как-то понять и вызвать цену товара?

Да, видя, с каким xml вы работает, легко понять где есть id страницы.
Вы можете его взять из атрибута result/@pageId, либо из атрибута result/page/@id. В обоих случаях вы получите то, что вам надо.
Название: Re:Вызов цены товара
Отправлено: sam от 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 тоже вывод страницы не соответствующий.
Название: Re:Вызов цены товара
Отправлено: admin от 20 Апреля 2015, 11:00:01
Я пробовал ставить просто этот код - получил обрубленный шаблон

То есть, на лицевой части сайта после места, где должна быть кнопка пустота? Если да, то попробуйте убрать переменную $document-page-id, заменив её на result/@pageId, хотя если у вас demodizzy, то проблема в чем-то другом должна быть.
Название: Re:Вызов цены товара
Отправлено: sam от 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? Просто, как в первом, так и во втором варианте замены шаблон обрубается, как и прежде.

Я подумал, может шаблон кнопки "в корзину" можно инклудом вызвать, или это не то получается?
Название: Re: Вызов цены товара
Отправлено: admin от 21 Апреля 2015, 10:22:12
Выглядит все правильным. Если выводится белый экран обрубая отрисовку дизайна, значит у вас в шаблоне какая-то переменная выводится, которая не объявлена в данном шаблоне или что-то подобное.

Для начала включите вывод ошибок (секция debug в config.ini файле)
Название: Re: Вызов цены товара
Отправлено: sam от 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>
Название: Re: Вызов цены товара
Отправлено: admin от 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). Таким образом вы сократите нагрузку на сайт.
Название: Re: Вызов цены товара
Отправлено: sam от 21 Апреля 2015, 17:18:55
Я за первый предложенный Вами вариант, т.е. не использовать отображение кол-во добавленного товара, только хочу это сделать везде, как на .../modules/catalog/object-view.xsl, так и на .../modules/catalog/common.xsl . Знаю, что в файле .../js/basket.js есть скрипт, который выполняет тоже самое (отображает кол-во добавленного товара), и этот код скрипта, если подскажете, какая это строка в файле, я бы тоже убрал. Ну, чтобы ни в одном шаблоне сайта такого не было, подскажете в файле .../js/basket.js в каком месте эта функция находится?
Название: Re: Вызов цены товара
Отправлено: admin от 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
Название: Re: Вызов цены товара
Отправлено: sam от 21 Апреля 2015, 18:46:00
Цитировать
само количество подставляется из переменной detect_options.amount

А правильно ли я понимаю, что если убрать этот код целиком (или закомментировав), то basket.js будет работать полноценно, за исключением вставки кол-ва добавленного товара на самих кнопках "в корзину"?
Название: Re: Вызов цены товара
Отправлено: admin от 22 Апреля 2015, 04:15:46
А правильно ли я понимаю, что если убрать этот код целиком (или закомментировав), то basket.js будет работать полноценно, за исключением вставки кол-ва добавленного товара на самих кнопках "в корзину"?
Да
Название: Re: Вызов цены товара
Отправлено: sam от 22 Апреля 2015, 10:13:23
Большое-пребольшое спасибо! Очень сильно помогли - всё задуманное было реализовано полностью, не без Вашей помощи.