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

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

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
шаг 1: В админке - Модули - Шаблон данных -  в типе данных "Объект каталога" -
создал поле "Страницы на которых выводить товар", идентификатор "ssylka_na_obekt"
тип - ссылка на дерево.

шаг 2: В папке /templates/demodizzy/usels/ создал файл getSection.xml, id - это раздел каталога в котором есть другие подразделы
и внутри которых имеются объекты каталога, внутри которых мы выбираем в каких разделах отображать его.   
<page>{1}</page> к чему это не разобрался

С текстом
 <?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
    <type id="207" />
</target>
<property name="ssylka_na_obekt">
  <page>{1}</page>
</property>
</selection>

Шаг 3: Куда размещать и как размещать этот код, тоже не разберусь.
попробовал прям сюда /xslt/modules/catalog/category-view.xsl
Результат ноль.

<xsl:template name="other-catalog">
    <h3>Этот товар отмечен в следующих разделах:</h3>
    <xsl:apply-templates select="document('usel://getSection')/udata/page"  mode="getSection">
        <xsl:with-param name="this_page" select="@id" />
    </xsl:apply-templates>
</xsl:template>
 
<xsl:template match="page" mode="getSection">
    <xsl:param name="this_page" />
    <xsl:apply-templates select="document(concat('upage://', @id))/udata//property[@name='ssylka_na_obekt']/value/page" mode="getSectionPage" >
        <xsl:with-param name="this_page" select="$this_page" />
        <xsl:with-param name="this_link" select="@link" />       
        <xsl:with-param name="this_name" select="document(concat('upage://', @id))/udata//property[@name='h1']/value" />       
    </xsl:apply-templates>
 
</xsl:template>
 
<xsl:template match="page" mode="getSectionPage">
    <xsl:param name="this_page" />
    <xsl:param name="this_name" />
    <xsl:param name="this_link" />
 
    <xsl:if test="$this_page = @id">
        <div class="list" name="list"> - <a href="{$this_link}"><b><xsl:value-of select="$this_name" /></b></a></div>
    </xsl:if>   
</xsl:template>

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
Пошел дальше.
Правки 3 шага:
В файле /xslt/modules/catalog/category-view.xsl
написал путь к шаблону
<xsl:call-template name="other-catalog" />

	<xsl:template match="udata[@method = 'getObjectsList'][total]">
<div class="catalog_sort" />
<div class="catalog  list_view">
            <xsl:call-template name="sorting" />
            <xsl:call-template name="other-catalog" />
<div class="objects" umi:element-id="{category_id}" umi:module="catalog" umi:method="getObjectsList" umi:sortable="sortable">
<xsl:apply-templates select="lines/item" mode="short-view">
<xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
</xsl:apply-templates>
<div class="clear" />
</div>
</div>
<div class="clear" />
<xsl:apply-templates select="total" />
</xsl:template>

И тот код из шага 3 разметил в самом низу
В файле /xslt/modules/catalog/common.xsl

В результате я вижу только надпись
"Этот товар отмечен в следующих разделах:" и больше ничего.

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
В статье и в ваших описаниях есть различия.

Статья предлагает в разделе создать поле "ссылка на дерево", в котором будут выбираться товары для вывода в данном разделе, а у вас идет создание поле типа "ссылка на дерево" в типе данных товара для указания разделов, в которых будет выводится данный товар.

Какой вопрос вы хотите решить примером из этой статьи?

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
Верно, начал собирать через товар, исправил
шаг 1: В разделе товара создал поле "ссылка на дерево".
шаг 2: в целом понятен, usel
шаг 3: в каких шаблонах прописывать? и нужно ли что-то дополнительно?

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
ок вы решили в товаре указывать разделы, в которых будете выводить данный товар, что вам дальше необходимо?

Вывести на странице товара список разделов? Если да, то просто выведите содержимое поля типа ссылка на дерево, без всяких usel запросов.

Если необходимо на странице раздела вывести все товары, у которых в поле типа ссылка на дерево указан данный раздело, то тогда уже делаете usel и ег овыводите.

Какой вопрос вы решаете?

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
Решаю вопрос, как на странице раздела вывести все товары, у которых в поле типа ссылка на дерево указан данный раздел, тут  не понимаю как это сделать.


*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
1. проверить правильность usel.
Судя по примеру выше, ваш usel (getSection.xml) выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
    <type id="207" />
</target>
<property name="ssylka_na_obekt">
  <page>{1}</page>
</property>
</selection>
207 - это видимо тип данных для товаров, у которых есть поле ssylka_na_obekt.
Проверяете ваш usel вызвав его через адресную строчку http://сайт/getSection/id_раздела_в_котором_вы_пытаетесь_вывести_товары .
P.S. Не забудьте включить доступ к вызову usel через http протокол в config.ini (если он еще не включен ).

Если все ок, там у вас появиться xml, с соответствующими товарами.

2. Вывести товары на странице каталога.
Нам нужно написать шаблон именно для такого каталога, в которм будут выводиться товары через usel выборку. Пусть для этого мы создадим тип данных "Usel каталог", дочерний  к типу данных "Каталог". пусть id типа данных "Usel каталог" равно 112. Тогда добавляем шаблоны в конец файла /xslt/modules/catalog/category-view.xsl
<xsl:template match="/result[@method = 'category' and page/@type-id = 112]">
       <xsl:apply-templates select="document(concat('usel://getSection/',@pageId))/udata"  mode="getSection">   
</xsl:template>

<xsl:template match="udata" mode="getSection">
       товаров нет
</xsl:template>

<xsl:template match="udata[page]" mode="getSection">
      <div class="catalog  list_view">
         <div class="objects">
            <xsl:apply-templates select="page" mode="short-view">
               <xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
            </xsl:apply-templates>
            <div class="clear" />
         </div>
      </div>
      <div class="clear" />
</xsl:template>

P.S. Писал все на лету, могут быть ошибки в синтаксисе.
Если товары появятся, то основное дело сделанно. Тогда можно думать над тем, что в данном примере не будет работать пагинация и сортировка, которая есть в обычном каталоге, да и с фильтром (если он должен применять на usel каталог) тоже что-то надо будет думать.

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
1. Проверил USEL http://сайт/getSection/id_193/
Выводит Страница не найдена.
включил доступ к вызову usel через http протокол в config.ini
добавил строчку usel.http.allow = "1"
Так же ничего.

2. Для чего создаём тип данных "Usel каталог", дочерний  к типу данных "Каталог"?
Мы же в нем группу или поля не создаем?
Может указать  id типа данных "каталога"
На странице выводит "товаров нет"

Поэкспериментировал - в этом же типе данных для товаров, у поля ssylka_na_obekt, выбрал типа кнопка флажок вместо ссылка на дерево
1. getSection.xml остался без изменений, кроме как <page>{1}</page> заменил на <page>1</page>, иначе не работал

2. Вместо
<xsl:template match="/result[@method = 'category' and page/@type-id = 112]">
       <xsl:apply-templates select="document(concat('usel://getSection/',@pageId))/udata"  mode="getSection" />   
</xsl:template>

Поставил
	<xsl:template match="/result[@method = 'category'][/result/parents/page/@id = '192' or /result/page/@id = '192']" priority="1">
   
        <xsl:apply-templates select="document('usel://getSection/?limit=&specials-limit;')" mode="getSection" />     

</xsl:template>
Начиная с корневого каталога, вывел все товары у которых стоит галочка.
« Последнее редактирование: 31 Мая 2015, 11:08:01 от john »

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Не совсем верно действовали:

1. Для проверки указываете http://сайт/getSection/193/
2. Дочерний тип данных создал, для того, чтобы вы могли создать шаблон который работал с определенным типом данных (для этого тип данных и создавал). Но по сути, вы могли написать шаблон, который по другому понимал, что на данной странице нужно выводить usel выборку, например проверяя id страницы или alt-name страницы, или еще что-то.

P.S. по поводу изменений типа поля и корректировки usel, после чего система вывела товары, то все классно, она и должна была вывести, но это не то, что вы хотели сделать изначально.
« Последнее редактирование: 08 Июня 2015, 15:10:03 от admin »

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
<xsl:apply-templates select="document(concat('usel://getsection/', /result/page/@id))" mode="getSection" /> использовал и все заработало.

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
<xsl:if test="?"><xsl:apply-templates select="document(concat('usel://getsection/', /result/page/@id))" mode="getSection" /></xsl:if> Подскажите как можно написать условие, если не один товар не выбран, то код не срабатывал бы.
Спасибо

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
<xsl:if test="?"><xsl:apply-templates select="document(concat('usel://getsection/', /result/page/@id))" mode="getSection" /></xsl:if> Подскажите как можно написать условие, если не один товар не выбран, то код не срабатывал бы.
Спасибо

Не понял вопроса, вы имеете в виду, если выборка usel вернула пустой результат?

*

john

  • ***
  • 202
  • +6/-0
    • Просмотр профиля
Да, если выборка usel вернула пустой результат, а то у меня внутри картинки подгружаются дополнительно и выводятся они всегда

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
вместо вызова
<xsl:apply-templates select="document('usel://getSection')/udata/page"  mode="getSection">

сделайте промежуточный вызов
<xsl:apply-templates select="document('usel://getSection')/udata"  mode="getSection">

и добавьте доп шаблоны
<xsl:template match="udata" mode="getSection">
       товаров нет
</xsl:template>

<xsl:template match="udata[page]" mode="getSection">
      <xsl:apply-templates select="page" mode="getSection">
</xsl:template>