Отображение последних комментариев из интернет-магазина

Модератор
#
Отображение последних комментариев из интернет-магазина
Для отображения последних комментариев интернет-магазина используйте следующий код

<?php
$shop = new shop();
$xsl = new xsl();

$xslName = 'ОтображениеПоследнихКомментариевИзМагазина';

$shop_id = 1;
$param = array();

$shop_items_catalog_item_id  = false;
  
$param['shop_comment_active'] = 1;
$param['shop_id'] = $shop_id;
$param['comments_begin'] = 0;
$param['comments_count'] = 5;

// Массив комментариев
$mas_comments = $shop->GetAllComments($shop_items_catalog_item_id, $param);

$xmlData = '<?xml version="1.0" encoding="' . SITE_CODING . '"?>' . "\n";

$xmlData .= '<shop>' . "\n";

// Формируем XML с информацией о магазине
$xmlData .= $shop->GenXml4Shop($shop_id);

// Массив для хранения идентификаторов товаров
$mas_catalog_items = array();

$xmlData .= '<comments>' ."\n";

foreach ($mas_comments as $key => $value)
{
   $xmlData .= $shop->GenXml4Comment($value['shop_comment_id'], $value);
   
   // Формируем массив товаров, для которых отображаем комментарии
   if(!in_array($value['shop_items_catalog_item_id'], $mas_catalog_items))
   {
      $mas_catalog_items[] = $value['shop_items_catalog_item_id'];
   }    
}

$xmlData .= '</comments>' ."\n";

$xmlData .= '<items>' . "\n";

$param = array();
$param['xml_show_tying_products']= false;
$param['xml_show_modification'] = false;
$param['xml_show_comments'] = false;

// Цикл по массиву идентификаторов товаров
foreach ($mas_catalog_items as $key => $value)
{
   // Получаем информацию о товаре
    $item_info = $shop->GetItem($value);
    
    // Формируем XML для товара
   $xmlData .= $shop->GenXml4Item(0, $item_info, 0, $param);
}

$xmlData .= '</items>' . "\n";

$xmlData .= '</shop>' . "\n";

//echo nl2br(htmlspecialchars($xmlData));
echo $xsl->build($xmlData, $xslName);
?>


Создайте XSL-шаблон с названием "ОтображениеПоследнихКомментариевИзМагазина", содержащий следующий код:

<?xml version="1.0" encoding="windows-1251"?>
<!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="Windows-1251" 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">
      
      <SCRIPT>
         <xsl:comment>
            <xsl:text disable-output-escaping="yes">
               <![CDATA[
               
               // массив для хранения текущих рейтингов звезд
               var curr_rate = new Array();
               
               // функция работы со звездами рейтинга
               function set_rate(id, new_rate)
               {
               // устанавливаем атрибуты
               curr_star = document.getElementById(id);
               parent_id = parseInt(curr_star.parentNode.id);
               
               // при первом пересчете ставим рейтинг для группы звезд в 0
               if (!curr_rate[parent_id])
               {
               curr_rate[parent_id] = 0;
               }
               
               // устанавливаем новый рейтинг в массив рейтингов и значение скрытого поля
               if (new_rate != curr_rate[parent_id] && parseInt(new_rate) > 0)
               {
               curr_rate[parent_id] = new_rate;
               
               curr_form = document.getElementById('comment_form_0' + (parent_id != 0 ? parent_id : ''));
               curr_form.shop_comment_grade.value = curr_rate[parent_id].charAt(curr_rate[parent_id].length - 1);
               }
               
               // пересчет стилей для звезд
               for (i = 1; i < 6; i++)
                  {
                  if (parent_id != 0)
                  {
                  j = parent_id + '' + i + '_star_' + i;
                  }
                  else
                  {
                  j = i + '_star_' + i;
                  }
                  
                  temp_obj = document.getElementById(j);
                  
                  if (new_rate == 0)
                  {
                  id = curr_rate[parent_id];
                  }
                  
                  if (parseInt(j) > parseInt(id))
                  {
                  temp_obj.className = '';
                  }
                  else
                  {
                  temp_obj.className = 'curr';
                  }
                  }
                  }
                  ]]>
               </xsl:text>
            </xsl:comment>
         </SCRIPT>
                  
         <!-- Отзывы о товаре -->
         <xsl:if test="count(comments/comment) &gt; 0">            
            <xsl:apply-templates select="comments/comment" />
         </xsl:if>         
      </xsl:template>      
      
      <!-- Вывод рейтинга товара -->
      <xsl:template name="show_average_grade">
         <xsl:param name="grade" select="0"/>
         <xsl:param name="const_grade" select="0"/>
         
         <!-- Чтобы избежать зацикливания -->
         <xsl:variable name="current_grade" select="$grade * 1"/>
         
         <xsl:choose>
            <!-- Если число целое -->
            <xsl:when test="floor($current_grade) = $current_grade and not($const_grade &gt; ceiling($current_grade))">
               
               <xsl:if test="$current_grade - 1 &gt; 0">
                  <xsl:call-template name="show_average_grade">
                     <xsl:with-param name="grade" select="$current_grade - 1"/>
                     <xsl:with-param name="const_grade" select="$const_grade - 1"/>
                  </xsl:call-template>
               </xsl:if>
               
               <xsl:if test="$current_grade != 0">
                  <img src="/hostcmsfiles/images/stars_single.gif"/>
               </xsl:if>
            </xsl:when>
            <xsl:when test="$current_grade != 0 and not($const_grade &gt; ceiling($current_grade))">
               
               <xsl:if test="$current_grade - 0.5 &gt; 0">
                  <xsl:call-template name="show_average_grade">
                     <xsl:with-param name="grade" select="$current_grade - 0.5"/>
                     <xsl:with-param name="const_grade" select="$const_grade - 1"/>
                  </xsl:call-template>
               </xsl:if>
               
               <img src="/hostcmsfiles/images/stars_half.gif"/>
            </xsl:when>
            
            <!-- Выводим серые звездочки, пока текущая позиция не дойдет то значения, увеличенного до целого -->
            <xsl:otherwise>
               <xsl:call-template name="show_average_grade">
                  <xsl:with-param name="grade" select="$current_grade"/>
                  <xsl:with-param name="const_grade" select="$const_grade - 1"/>
               </xsl:call-template>
               <img src="/hostcmsfiles/images/stars_gray.gif"/>
            </xsl:otherwise>
         </xsl:choose>
      </xsl:template>
      
      <!-- Шаблон для вывода звездочек (оценки) -->
      <xsl:template name="for">
         <xsl:param name="i" select="0"/>
         <xsl:param name="n"/>
         
         <input type="radio" name="shop_comment_grade" value="{$i}" id="id_shop_comment_grade_{$i}">
            <xsl:if test="/shop/shop_comment_grade = $i">
               <xsl:attribute name="checked">
               </xsl:attribute>
            </xsl:if>
         </input>&#xA0;
         <label for="id_shop_comment_grade_{$i}">
            <xsl:call-template name="show_average_grade">
               <xsl:with-param name="grade" select="$i"/>
               <xsl:with-param name="const_grade" select="5"/>
            </xsl:call-template>
         </label>
         <br/>
         <xsl:if test="$n &gt; $i and $n &gt; 1">
            <xsl:call-template name="for">
               <xsl:with-param name="i" select="$i + 1"/>
               <xsl:with-param name="n" select="$n"/>
            </xsl:call-template>
         </xsl:if>
      </xsl:template>
      
      <!-- Шаблон для отзывов -->
      <xsl:template match="comments/comment">
         <a name="comment{@id}"></a>
         <div class="comment">
            <xsl:variable name="item_id" select="comment_shop_item_id" />
            <a href="{/shop/path}{//item[@id = $item_id]/fullpath}{//item[@id = $item_id]/path}/" title="ссылка"><xsl:value-of select="//item[@id = $item_id]/name"/></a>
            <div class="tl"></div>
            <div class="tr"></div>
            <div class="bl"></div>
            <div class="br"></div>
            
            <xsl:if test="subject != ''">
               <div>
                  <strong>
                     <xsl:value-of select="subject"/>
                  </strong>
               </div>
            </xsl:if>

            <xsl:value-of select="text" disable-output-escaping="yes"/>

            <!-- Оценка комментария -->
            <xsl:if test="grade != 0">
               <div>Оценка:
                  <xsl:call-template name="show_average_grade">
                     <xsl:with-param name="grade" select="grade"/>
                     <xsl:with-param name="const_grade" select="5"/>
                  </xsl:call-template>
               </div>
            </xsl:if>
         </div>
                           
         <div class="comment_desc">
            <xsl:choose>
               <xsl:when test="user_name">
                  <xsl:value-of select="user_name"/>
               </xsl:when>
               <xsl:otherwise>
                  <img src="/hostcmsfiles/images/user.gif"  style="margin: 0px 5px -4px 0px" />
                  <b>
                     <a href="/users/info/{site_user_login}/"  class="c_u_l" ><xsl:value-of select="site_user_login"/></a>
                  </b>
               </xsl:otherwise>
            </xsl:choose>&#xA0;·&#xA0;<xsl:value-of select="date_time"/>
         </div>
      </xsl:template>      
   </xsl:stylesheet>
Модератор
#
Re: Отображение последних комментариев из интернет-магазина
Примечание: решение будет работать только с версии 5.4.7.
#
Re: Отображение последних комментариев из интернет-магазина
Можно ли переложить выше изложенное для Информационной системы?
Тогда мало будет вопросов по работе этой реализации.
Пожалуйста.
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
Модератор
#
Re: Отображение последних комментариев из интернет-магазина
#
Re: Отображение последних комментариев из интернет-магазина
вставила данный код, создала шаблон
сайт не грузится - выдает ошибку:
Parse error: syntax error, unexpected $end in /public_html/templates/template1/template.htm on line 458
я посмотрела - 458 - это последняя строка в макете (</html>
и почему не работает ?
версия системы последняя Малый Бизнес
Email: golden-puma@yandex.ru; Telegram: @GoldenPuma; Сайт: https://goldenpuma.ru
#
Re: Отображение последних комментариев из интернет-магазина
у меня с кодировкой что-то...? квадратики вместо букв...
#
Re: Отображение последних комментариев из интернет-магазина
вопрос снимается. В xsl надо кодировку поменять
#
Re: Отображение последних комментариев из интернет-магазина

Вставил выше указанный код: ругается:
Invalid argument supplied for foreach() в файле /home/advis/www/site9/public_html/hostcmsfiles/structure/Structure115.php (строка 32)

Строка:
foreach ($mas_comments as $key => $value)
#
Re: Отображение последних комментариев из интернет-магазина
индефикатор магазина верный стоит?

$shop_id = 1;
разработка сайтов, фирменных стилей, интерфейсов
Авторизация