Вопрос по сортировке элементов группы

#
Вопрос по сортировке элементов группы
Есть группа элементов в Инфосистеме. У каждого элемента есть дополнительное поле a_TopView true\false
Нужно отсортировать элементы по наличию значения true переменной a_TopView

<?
/* Вывод информационных систем */
$InformationSystem = new InformationSystem();
$external_propertys=array();
$external_propertys['ОтображатьСсылкуНаАрхив']=1;
$external_propertys['ОтображатьСсылкиНаСледующиеСтраницы']=1;
$property = array();
$property['OrderField'] = '@a_TopView';
$property['Order'] = 'DESC';
$item_count = 50;
$InformationSystemId = 11;
$InformationGroupId = 0;  // false - из всех групп, 0 - из корневой группы
$InformationSystem->ShowInformationSystem($InformationSystemId, $InformationGroupId, 'СписокЭлементовИнфосистемы',$item_count,0,$external_propertys,$property);  
?>

Так не получается нужной сортировки.
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
#
Re: Вопрос по сортировке элементов группы
Это неверно - $property['OrderField'] = '@a_TopView'. PHP смешивать с XML нельзя. Если нужно, чтобы сначала шли инфоэлементы, у которых a_TopView =  true, а затем те у которых a_TopView = false, то делайте это в XSL-шаблоне(пример реализации приведен Вам в другой теме форума http://www.hostcms.ru/forums/22/865/).
#
Re: Вопрос по сортировке элементов группы
Я сделал вывод элементов по тому, как вы писали в шаблоне. Только при разбиении на страницы, у меня все элементы со значением true раскиданы по страницам. Конечно они отображаются первыми на каждой станице, но мне нужно вывести с первой страницы все элементы сначала со значением дополнительной переменной true. Эти элементы должны быть всегда первыми, а потом все остальные.

Если вывести на 1 страницу, то всё ок. Первыми идут те элементы, у которых есть значение true, затем все остальные.

Только когда происходит деление на страницы, все элементы расфасовываются по своим страницам и встают первыми со значением true.

Вот 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:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/document">

   <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
   <xsl:variable name="parent_group_id" select="blocks/parent_group_id" />


    <xsl:if test="blocks/parent_group_id!=0">
       <h1><xsl:value-of disable-output-escaping="yes" select=".//group[@id=$parent_group_id]/name" /></h1>
   </xsl:if>

   <table width="616" border="0" cellpadding="0" cellspacing="0">
      <tr>
         <xsl:apply-templates select="blocks/items/item" mode="top" />
      </tr>
   </table>


      <!-- Выводим элементы по 1 в строке с обычным оформлением -->
    <table width="616" border="0" cellpadding="0" cellspacing="0">
      <xsl:apply-templates select="blocks/items/item" mode="all" />
   </table>

<p>
   <!-- Строка ссылок на другие страницы информационного блока -->
   <xsl:if test="ОтображатьСсылкиНаСледующиеСтраницы=1">
      <xsl:call-template name="for">
        <xsl:with-param name="items_on_page" select="blocks/items/items_on_page" />
        <xsl:with-param name="current_page" select="blocks/items/current_page" />
        <xsl:with-param name="count_items" select="blocks/items/count_items" />
        <xsl:with-param name="visible_pages" select="6" />
      </xsl:call-template>
   </xsl:if>
   </p>


</xsl:template>

<!-- ======================== -->
<!-- Данные об инф. элементах -->
<!-- ======================== -->
<xsl:template match="blocks/items/item" mode="top">

   <xsl:if test="item_propertys/item_property[@xml_name='a_TopView']/value!=0">
   ЗДЕСЬ ВЫВОД ПЕРВЫХ ЭЛЕМЕНТОВ ГРУППЫ   
    </xsl:if>
</xsl:template>


<!--ТУТ ШАБЛОН ДЛЯ ВСЕХ ОСТАЛЬНЫХ ЭЛЕМЕНТОВ-->

<xsl:template match="blocks/items/item" mode="all">

<xsl:if test="item_propertys/item_property[@xml_name='a_TopView']/value=0">


      </xsl:if>
</xsl:template>


<!-- Цикл для вывода строк ссылок -->
<xsl:template name="for">
   <xsl:param name="i" select="0" />
   <xsl:param name="items_on_page" />
   <xsl:param name="current_page" />
   <xsl:param name="count_items" />
   <xsl:param name="visible_pages" />

   <xsl:variable name="n" select="$count_items div $items_on_page" />

   <!-- Считаем количество выводимых ссылок перед текущим элементом -->
      <xsl:variable name="pre_count_page">
         <xsl:choose>
            <xsl:when test="$current_page > ($n - (round($visible_pages div 2) - 1))">
               <xsl:value-of select="$visible_pages - ($n - $current_page)" />
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="round($visible_pages div 2) - 1" />
            </xsl:otherwise>
         </xsl:choose>
      </xsl:variable>

   <!-- Считаем количество выводимых ссылок после текущего элемента -->
      <xsl:variable name="post_count_page">
         <xsl:choose>
            <xsl:when test="0 > $current_page - (round($visible_pages div 2) - 1)">
               <xsl:value-of select="$visible_pages - $current_page - 1" />
            </xsl:when>
            <xsl:otherwise>
               <xsl:choose>
                  <xsl:when test="round($visible_pages div 2) = ($visible_pages div 2)">
                     <xsl:value-of select="$visible_pages div 2" />
                  </xsl:when>
                  <xsl:otherwise>
                     <xsl:value-of select="round($visible_pages div 2) - 1" />
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:otherwise>
         </xsl:choose>
      </xsl:variable>


      <xsl:if test="$count_items > $items_on_page and $n > $i">

      <!-- Ставим ссылку на страницу-->
      <xsl:if test="$i != $current_page">

         <!-- Заносим в переменную $parent_group_id идентификатор текущей группы -->
         <xsl:variable name="parent_group_id" select="/document/blocks/parent_group_id" />

         <!-- Определяем группу для формирования адреса ссылки -->
         <xsl:variable name="group_link"><xsl:choose>
            <!-- Если группа не корневая (!=0) -->
            <xsl:when test="$parent_group_id != 0"><xsl:value-of select="/document/blocks//group[@id = $parent_group_id]/fullpath" /></xsl:when>
            <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
            <xsl:otherwise></xsl:otherwise>
         </xsl:choose></xsl:variable>

         <!-- Определяем адрес ссылки -->
         <xsl:variable name="number_link"><xsl:choose>
            <!-- Если не нулевой уровень -->
            <xsl:when test="$i != 0">page-<xsl:value-of select="$i + 1" />/</xsl:when>
            <!-- Иначе если нулевой уровень - просто ссылка на страницу со списком элементов -->
            <xsl:otherwise></xsl:otherwise>
         </xsl:choose></xsl:variable>

         <!-- Выводим ссылку на первую страницу -->
         <xsl:if test="$current_page - $pre_count_page > 0 and $i = 0">
            <a href="{/document/blocks/url}{$group_link}" class="page_link" style="text-decoration: none;">&#8592;</a>
         </xsl:if>

         <xsl:choose>
            <xsl:when test="$i >= ($current_page - $pre_count_page) and ($current_page + $post_count_page) >= $i">

            <!-- Выводим ссылки на видимые страницы -->
               <a href="{/document/blocks/url}{$group_link}{$number_link}" class="page_link"><xsl:value-of select="$i + 1" /></a>
            </xsl:when>
            <xsl:otherwise>
            </xsl:otherwise>
         </xsl:choose>

         <!-- Выводим ссылку на последнюю страницу -->
         <xsl:if test="$i+1 >= $n and $n > ($current_page + 1 + $post_count_page)">
            <xsl:choose>
               <xsl:when test="$n > round($n)">
               <!-- Выводим ссылку на последнюю страницу -->
                     <a href="{/document/blocks/url}{$group_link}page-{round($n+1)}/" class="page_link" style="text-decoration: none;">&#8594;</a>
               </xsl:when>
               <xsl:otherwise>
                     <a href="{/document/blocks/url}{$group_link}page-{round($n)}/" class="page_link" style="text-decoration: none;">&#8594;</a>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:if>

      </xsl:if>

      <!-- Не ставим ссылку на страницу-->
      <xsl:if test="$i = $current_page">
         <span class="current"><xsl:value-of select="$i+1" /></span>
      </xsl:if>

      <!-- Рекурсивный вызов шаблона. НЕОБХОДИМО ПЕРЕДАВАТЬ ВСЕ НЕОБХОДИМЫЕ ПАРАМЕТРЫ! -->
      <xsl:call-template name="for">
         <xsl:with-param name="i" select="$i + 1" />
         <xsl:with-param name="items_on_page" select="$items_on_page" />
         <xsl:with-param name="current_page" select="$current_page" />
         <xsl:with-param name="count_items" select="$count_items" />
         <xsl:with-param name="visible_pages" select="$visible_pages" />
      </xsl:call-template>

   </xsl:if>
</xsl:template>

</xsl:stylesheet>
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
#
Re: Вопрос по сортировке элементов группы
Мы с другим программистом решили, что раз элементы распределены по страницам попалают для отрисовки в xsl, то их уже до вывода нужно отсортировать так, чтобы первыми шли все элементы со значением true у переменной. Тогда распределение по страницам будет корректное.

Как отсортировать не понятно по наличию доп. параметра?
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
#
Re: Вопрос по сортировке элементов группы
Да, Вы правы. В такой ситуации нужно, чтобы инфоэлементы были уже  отсортированы в XML-коде. Поэтому там, где у Вас идет показ инфосистемы(это может быть в макете, шаблоне страницы либо в тип. дин. странице) перед этим самым показом необходимо добавить:
$element['type']=1;
$element['prefix'] = 'and';
$element['property_id'] = 17;
$element['if'] = '>';
$element['value'] = '-1';
$element['sufix']='';
$property['select'][]=$element;
$property['OrderField'] = ' convert( `information_propertys_items_value` , UNSIGNED ) ';
$property['Order'] = 'DESC';
$InformationSystem->ShowInformationSystem($InformationSystemId, $InformationGroupId,'СписокЭлементовИнфосистемы',$item_count,0,$external_propertys, $property);

Естественно, в качестве $element['property_id'] вместо значения 17 нужно подствавить значение идентификатора Вашего доп. свойства(a_TopView).
#
Re: Вопрос по сортировке элементов группы
Спасибо. Заработала сортировка! Только теперь будет ветка форума по разделению по страницам.
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
#
Re: Вопрос по сортировке элементов группы
А как реализовать сортировку списка корневых групп по дополнительному параметру?
Есть инфосистема. В корне несколько групп. У групп есть дополнительное свойство - number.

Как отобразить названия групп в зависимости от значения number в обратном порядке и наоборот?
Спасибо.
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
Модератор
#
Re: Вопрос по сортировке элементов группы
3dkvadrat,
на XSL к вызову template-а добавьте сортировку, информация по сортировке на XSL есть в инструкции по интеграции.
#
Re: Вопрос по сортировке элементов группы
Не понятно как сортировать из документации...

Вставил код жирным:

<?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:template match="/">
<!-- Шаблон вывода категорий слева -->

    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/document">

   <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
   <xsl:variable name="parent_group_id" select="blocks/parent_group_id" />
   
<!-- Выбираем узлы structure -->
<xsl:apply-templates select="structure">
<xsl:sort select="@id" order="descending"/>
</xsl:apply-templates>
   

......

Добавил не понимаю для чего??? следующее...
Из документации...


<xsl:template match="structure">
<p>Значение: <xsl:value-of disable-output-escaping="yes" select="value"/></p>
</xsl:template>

Ничего не сортируется.

Id дополнительного свойства групп = 16
xml тэг - number (в этом параметре числа)
Нужно отсортировать группы при выводе по возрастанию / по убыванию значения number.
Группы из корня инфосистемы.
Интеграция дизайна, доработка кода системы, техническое обслуживание сайтов на HostCMS
#
Re: Вопрос по сортировке элементов группы
Сортировку по убыванию списка подгупп текущей группы по доп. свойству в XSL-шаблоне, например в "СписокЭлементовИнфосистемы", можно добавить след. образом:
<!-- Отображение подгрупп данной группы -->
   <ul>
      <xsl:apply-templates select=".//group[@parent_id=$parent_group_id]" mode="groups" >
<xsl:sort select="propertys/property[@xml_name='number']/value" order="descending" data-type="number"/>
</xsl:apply-templates>
   </ul>

Для сортировки по возрастанию значение параметра order="descending" следует заменить на order="ascending"
Авторизация