Как вывести все товары группы при нахождении в каждом элементе этой группы

#
Как вывести все товары группы при нахождении в каждом элементе этой группы
Помогите решить проблему плиз!
Нужно отобразить все товары той группы в случае,когда мы находимся в любом товаре данной группы. Т.е. слева у меня сам товар с его описанием, а правее на страничке весь список товаров, с которыми соседствует товар, который в это время просматривается.
Пытался ковырять xls шаблон "МагазинТовар", но ничего не получилось
Сам только недавно начал пробовать разбираться в hostcms...
Модератор
#
Re: Как вывести все товары группы при нахождении в каждом элементе этой группы
kronos2003,
Воспользоваться поиском.
#
Re: Как вывести все товары группы при нахождении в каждом элементе этой группы
В том то дело, что пользовался.. вот то, что нужно http://www.hostcms.ru/forums/17/2648/
Но смотрю вопрос остался открытым
#
Re: Как вывести все товары группы при нахождении в каждом элементе этой группы
тот же вопрос интересует, поиск не помог
#
Re: Как вывести все товары группы при нахождении в каждом элементе этой группы
r2d2, проще всего, отредактировать ТДС Интернет-магазин, и заменить вызов метода ShowItem() на вызов метода ShowShop()
Перед этим, в метод надо через external_propertys передать id текущего товара, чтобы в xsl-шаблоне можно было  как-то его отличить от остальных товаров.

Затем редактируем xsl-шаблон.
За основу берем шаблон МагазинКаталогТоваров (а не МагазинТовар!) копируем темплейт для обработки узлов item, копии назначаем любой mode и редактируем ее так, чтобы вывод соответствовал карточке товара, а исходный темплейт item редактируем так, чтобы его вывод соответствовал списку остальных товаров группы.
Затем находим в корневом теплейте вызов темплейта item, дублируем его, у копии указываем тот же самый mode а в атрибуте select дописываем условие отбора узлов item - в квадратных скобках @id = /shop/значение_id_товара_переданное_из_тдс - это будет отображение карточки товара,
а у исходного вызова добавляем такое же условие, только вместо равно там будет неравно, и это будет отображение списка товаров группы.
Заказов не беру. Консультирую редко.
#
Re: Как вывести все товары группы при нахождении в каждом элементе этой группы
вот второй абзац запутал млй мозг ))

что именно под "корневым темплейтом" подразумевается ?
#
Re: Как вывести все товары группы при нахождении в каждом элементе этой группы
r2d2, рассмотрите внимательно структуру XSL-документа. Она в общих чертах такая:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
   
   <xsl:template match="/">
      <xsl:apply-templates select="/shop"/>
   </xsl:template>
   
   <!-- Шаблон для магазина -->
   <xsl:template match="/shop">
      
      тут чего-то много написано - выводится название группы, фильтры и прочая лабуда

      <xsl:apply-templates select="item" />

      тут тоже чего-то понаписано - про вывод пагинации в том числе...
   
   </xsl:template>



   Тут много разных <xsl:template match=""> ... </xsl:template>
   

   <!-- Шаблон для товара -->
   <xsl:template match="item">
      
      а здесь формируется вывод собственно товара
   
   </xsl:template>


   Тут тоже много разных <xsl:template match=""> ... </xsl:template>
   

</xsl:stylesheet>

Строго говоря, корневой темплейт это <xsl:template match="/">, потому что он соответствует единственному в XML-документе корневому узлу "/".
Но я данном случае я подразумевал под корневым следующий темплейт - <xsl:template match="/shop">
Потому что первый темплейт не содержит никаких действий кроме вызова темплейта shop, и в данном случае фрагмент
<xsl:template match="/">
   <xsl:apply-templates select="/shop"/>
</xsl:template>
вообще можно удалить из шаблона, от этого ничего не изменится.

Так вот, ваша задача - во1х, скопировать темплейт item и задать для копии какой-нибудь mode. Получится так:
   <!-- Шаблон для товара -->
   <xsl:template match="item">
      
      а здесь будет вывод списка остальных товаров группы
   
   </xsl:template>

   <!-- Шаблон для товара -->
   <xsl:template match="item" mode="mymode">
      
      а здесь будет вывод карточки товара
   
   </xsl:template>


Ну и теперь вам останется найти в корневом темплейте (а мы договорились, что корневым мы считаем темплейт shop) то место, откуда у нас вызывается темплейт item. Вызывается он вот этой строкой
<xsl:apply-templates select="item" />
Эту строку мы дублируем, вписываем в вызов условие и в нужном случае добавляем mode.
Например, из ТДС мы передаем id текущего товара как элемент массива external_propertys с индексом this_item_id:
$external_propertys['this_item_id'] = $item_id;

Тогда в XML-документе в узле /shop у нас появится дочерний узел с названием this_item_id, и XPath-путь к нему будет /shop/this_item_id а значит мы сможем в корневом темплейте прописать следующие два вызова с условиями:
      <!--Покажем карточку текущего товара-->
      <xsl:apply-templates select="item[@id = /shop/this_item_id]" mode="mymode" />

      <!--Покажем остальные товары-->
      <xsl:apply-templates select="item[@id != /shop/this_item_id]" />
В итоге у нас получится шаблон такой структуры:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>

   <xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>

   <!-- Шаблон для магазина -->
   <xsl:template match="/shop">
      тут чего-то много написано - выводится название группы, фильтры и прочая лабуда

      то что лишнее можно будет просто удалить

      <!--Покажем карточку текущего товара-->
      <xsl:apply-templates select="item[@id = /shop/this_item_id]" mode="mymode"/>

      <!--Покажем остальные товары-->
      <xsl:apply-templates select="item[@id != /shop/this_item_id]"/>
      
      тут тоже чего-то понаписано - про вывод пагинации в том числе...

      тут тоже можно удалять все что лишнее
   </xsl:template>

      
   Тут много разных
   <xsl:template match="...">

   </xsl:template>


   <!-- Шаблон для товара -->
   <xsl:template match="item">
      а здесь будет вывод списка остальных товаров группы
   </xsl:template>

   <!-- Шаблон для товара -->
   <xsl:template match="item" mode="mymode">
      а здесь будет вывод карточки товара
   </xsl:template>



   Тут тоже много разных
   <xsl:template match="...">

   </xsl:template>

</xsl:stylesheet>
Заказов не беру. Консультирую редко.
Авторизация