Список всех значений дополнительного свойства по id

#
Re: Список всех значений дополнительного свойства по id
Dmitry K.,
есть такой параметр в контроллере
* - filterStrictMode(TRUE|FALSE|array()) фильтровать только по существующим значениям (кроме списков и checkbox), отсутствие значения считать неверным значением. Если указан массив с идентификаторами свойств, то только для них будет использоваться строгий режим, по умолчанию FALSE
www.morozovpimnev.ru - создание, поддержка и продвижение сайтов | Наш канал https://asmp.su/channel
#
Re: Список всех значений дополнительного свойства по id
Dmitry K.,
Какой у вас порядок действий?
1) Вывести все товары у которых по определенным доп.св-вам значение не пустые  NOT NULL and > 0?
2) По поводу min/max значений не очень понятно, ведь для каждого товара, в системе можно назначить только одно число(значение) для определенного св-ва?
3) Либо вы хотите налету при выводе товаров по пункту (1) вычислять цифры по каким то св-вам?
В чем ваша задача если по конкретнее?
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
#
Re: Список всех значений дополнительного свойства по id
А вот, что мне нужно было:
<?php
$Shop_Controller_Show = new Shop_Controller_Extend_Show(Core_Entity::factory('Shop', 37));

$Shop_Controller_Show
->xsl(Core_Entity::factory('Xsl')->getByName('ТаблицаВидовДревесиныПоПрочности'))
->itemsPropertiesList(array(367,368,371,372,373,374))
->itemsProperties(array(367,368,371,372,373,374))
->filterStrictMode(TRUE)
->addFilter('property', 371, '!=', NULL)
->addFilter('property', 372, '!=', NULL)
->addFilter('property', 373, '!=', NULL)
->addFilter('property', 374, '!=', NULL)
->addMinMaxProperty(array(371,372,373,374))
->limit(9999)
->calculateCounts(TRUE);

$Shop_Controller_Show
->show();
?>
И в XML для XSL-шаблона “ТаблицаВидовДревесиныПоПрочности” выводится следующий код (фрагмент):
   <items_count>557</items_count>
   <items_total_count>557</items_total_count>
   …
   <minPropertyValue id="371">0.3</minPropertyValue>
   <maxPropertyValue id="371">20.6</maxPropertyValue>
   <minPropertyValue id="372">19.6</minPropertyValue>
   <maxPropertyValue id="372">213.6</maxPropertyValue>
   <minPropertyValue id="373">3.71</minPropertyValue>
   <maxPropertyValue id="373">31.15</maxPropertyValue>
   <minPropertyValue id="374">4.44</minPropertyValue>
   <maxPropertyValue id="374">119</maxPropertyValue>
   …
   <limit>9999</limit>
   <property_371 condition="!=">0</property_371>
   <property_372 condition="!=">0</property_372>
   <property_373 condition="!=">0</property_373>
   <property_374 condition="!=">0</property_374>
   <filter_path></filter_path>
   <total>451</total>
Вообщем то, что нужно…
#
Re: Список всех значений дополнительного свойства по id
Единственное что я не понял, так это как в XSL записать теперь…
Потому что вот так, не знаю - правильно ли?
<xsl:variable name="min_value371" select="/shop/minPropertyValue[@id = 371]" />
<xsl:variable name="max_value371" select="/shop/maxPropertyValue[@id = 371]" />
<xsl:variable name="min_value372" select="/shop/minPropertyValue[@id = 372]" />
<xsl:variable name="max_value372" select="/shop/maxPropertyValue[@id = 372]" />
У меня таких 4 доп.свойства с id 371, 372, 373, 374.
И для всех четырёх нужно вывести min и max значения.
Модератор
#
Re: Список всех значений дополнительного свойства по id
Dmitry K. писал(а):
Потому что вот так, не знаю - правильно ли?

На вид правильно
#
Re: Список всех значений дополнительного свойства по id
Цитата:
На вид правильно
Цитата:
Потому что вот так, не знаю – правильно ли?

Да, это верные выражения – всё выводится корректно.
Видимо в прошлый раз что-то неправильно делал… или Интернет глючил.
#
Re: Список всех значений дополнительного свойства по id
Добрый день!
Может кто знает как изначально отсортировать таблицу по вычисляем значениям в последнем столбце?
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" xmlns:hostcms="http://www.hostcms.ru/" exclude-result-prefixes="hostcms">
<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">
<h1 class="d-flex justify-content-between fs-2 text-blue-700 font-family-narrow mb-4">Динамическая таблица видов древесины по прочности
<div><span class="text-muted"><xsl:value-of disable-output-escaping="yes" select="count(shop_item)" /></span>
                             из <xsl:value-of disable-output-escaping="yes" select="items_total_count" /></div>
</h1>

<div class="table-responsive">
  <table class="table table-xs table-bordered table-border-radius table-hover align-middle d-block table_sort">
    <thead class="sticky-top bg-white font-family-narrow">
      <tr>
        <th class="fw-normal col-auto">№</th>
        <th class="fw-normal col col_sort">Название</th>
        <th class="fw-normal col-auto col_sort">Ботаническое название</th>
        <th class="fw-normal col-1 col_sort">Индекс твёрдости Янка</th>
        <th class="fw-normal col-1 col_sort">Индекс предела прочности при изгибе</th>
        <th class="fw-normal col-1 col_sort">Индекс модуля упругости при изгибе</th>
        <th class="fw-normal col-1 col_sort">Индекс предела прочности при сжатии</th>
        <th class="fw-normal col-1 col_sort">Индекс прочности</th>
      </tr>
    </thead>
    <tbody class="table-group-divider">
        <xsl:apply-templates select="shop_item" />
    </tbody>
  </table>
</div>
</xsl:template>

<!-- Шаблон вывода элемента по убыванию (max → min) дополнительного свойства 371 (твёрдость Янка) -->
<xsl:template match="shop_item">
    <xsl:if test="not(preceding-sibling::shop_item)">
        <xsl:for-each select="//shop_item">
            <tr>
                    <xsl:variable name="value371" select="property_value[property_id = 371]/value" />
                <xsl:variable name="min_value371" select="/shop/minPropertyValue[@id = 371]" />
                <xsl:variable name="max_value371" select="/shop/maxPropertyValue[@id = 371]" />
            <xsl:variable name="average_value371" select="($value371 - $min_value371) div ($max_value371 - $min_value371) * 100" />
                    <xsl:variable name="value372" select="property_value[property_id = 372]/value" />
                <xsl:variable name="min_value372" select="/shop/minPropertyValue[@id = 372]" />
                <xsl:variable name="max_value372" select="/shop/maxPropertyValue[@id = 372]" />
            <xsl:variable name="average_value372" select="($value372 - $min_value372) div ($max_value372 - $min_value372) * 100" />
                    <xsl:variable name="value373" select="property_value[property_id = 373]/value" />
                <xsl:variable name="min_value373" select="/shop/minPropertyValue[@id = 373]" />
                <xsl:variable name="max_value373" select="/shop/maxPropertyValue[@id = 373]" />
            <xsl:variable name="average_value373" select="($value373 - $min_value373) div ($max_value373 - $min_value373) * 100" />
                    <xsl:variable name="value374" select="property_value[property_id = 374]/value" />
                <xsl:variable name="min_value374" select="/shop/minPropertyValue[@id = 374]" />
                <xsl:variable name="max_value374" select="/shop/maxPropertyValue[@id = 374]" />
            <xsl:variable name="average_value374" select="($value374 - $min_value374) div ($max_value374 - $min_value374) * 100" />
                <td><xsl:value-of select="position()" /></td>
                <td><a class="alert-link" href="{url}" target="_blank" rel="noopener"><xsl:value-of select="name" /></a></td>
                <td><xsl:apply-templates select="property_value[property_id = 367]/value" /><xsl:text> </xsl:text>
                    <xsl:apply-templates select="property_value[property_id = 368]/value" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value371, '0,0', 'my')" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value372, '0,0', 'my')" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value373, '0,0', 'my')" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value374, '0,0', 'my')" /></td>
                <td class="text-end pe-3">
                    <xsl:variable name="average_value" select="($average_value371 + $average_value372 + $average_value373 + $average_value374) div 4" />
                    <xsl:value-of select="format-number($average_value, '0,0', 'my')" />
                </td>
            </tr>
        </xsl:for-each>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

Не понимаю как применить информацию со страницы Сортировка xsl:sort https://www.hostcms.ru/documentation/step-by-step/xslt/xsl%3Asort/
#
Re: Список всех значений дополнительного свойства по id
...И всё-таки никак я не пойму, как мне отсортировать товары по значениям в последнем столбце таблицы (max → min).
Значение вычисляемое.
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:hostcms="http://www.hostcms.ru/" exclude-result-prefixes="hostcms">
<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">
<h1 class="d-flex justify-content-between fs-2 text-blue-700 font-family-narrow mb-4">Динамическая таблица видов древесины по прочности
<div><span class="text-muted"><xsl:value-of disable-output-escaping="yes" select="count(shop_item)" /></span>
                             из <xsl:value-of disable-output-escaping="yes" select="items_total_count" /></div>
</h1>

<div class="table-responsive">
  <table class="table table-xs table-bordered table-border-radius table-hover table_sort">
    <thead class="sticky-top bg-white font-family-narrow">
      <tr>
        <th class="fw-normal col-auto">№</th>
        <th class="fw-normal col col_sort">Название</th>
        <th class="fw-normal col-auto col_sort">Ботаническое название</th>
        <th class="fw-normal col-1 col_sort">Индекс твёрдости Янка</th>
        <th class="fw-normal col-1 col_sort">Индекс предела прочности при изгибе</th>
        <th class="fw-normal col-1 col_sort">Индекс модуля упругости при изгибе</th>
        <th class="fw-normal col-1 col_sort">Индекс предела прочности при сжатии</th>
        <th class="fw-normal col-1 col_sort">Индекс прочности</th>
      </tr>
    </thead>
    <tbody class="table-group-divider">
        <xsl:apply-templates select="shop_item" />
    </tbody>
  </table>
</div>
</xsl:template>

<xsl:template match="shop_item">
    <xsl:if test="not(preceding-sibling::shop_item)">
        <xsl:for-each select="//shop_item">
                    <xsl:variable name="value371" select="property_value[property_id = 371]/value" />
                <xsl:variable name="min_value371" select="/shop/minPropertyValue[@id = 371]" />
                <xsl:variable name="max_value371" select="/shop/maxPropertyValue[@id = 371]" />
            <xsl:variable name="average_value371" select="($value371 - $min_value371) div ($max_value371 - $min_value371) * 100" />
                    <xsl:variable name="value372" select="property_value[property_id = 372]/value" />
                <xsl:variable name="min_value372" select="/shop/minPropertyValue[@id = 372]" />
                <xsl:variable name="max_value372" select="/shop/maxPropertyValue[@id = 372]" />
            <xsl:variable name="average_value372" select="($value372 - $min_value372) div ($max_value372 - $min_value372) * 100" />
                    <xsl:variable name="value373" select="property_value[property_id = 373]/value" />
                <xsl:variable name="min_value373" select="/shop/minPropertyValue[@id = 373]" />
                <xsl:variable name="max_value373" select="/shop/maxPropertyValue[@id = 373]" />
            <xsl:variable name="average_value373" select="($value373 - $min_value373) div ($max_value373 - $min_value373) * 100" />
                    <xsl:variable name="value374" select="property_value[property_id = 374]/value" />
                <xsl:variable name="min_value374" select="/shop/minPropertyValue[@id = 374]" />
                <xsl:variable name="max_value374" select="/shop/maxPropertyValue[@id = 374]" />
            <xsl:variable name="average_value374" select="($value374 - $min_value374) div ($max_value374 - $min_value374) * 100" />
            <xsl:variable name="average_value" select="($average_value371 + $average_value372 + $average_value373 + $average_value374) div 4" />
              
            <tr>
                <td class="text-end"><xsl:value-of select="position()" /></td>
                <td><a class="alert-link" href="{url}" target="_blank" rel="noopener"><xsl:value-of select="name" /></a></td>
                <td><i><xsl:apply-templates select="property_value[property_id = 367]/value" /><xsl:text> </xsl:text>
                    <xsl:apply-templates select="property_value[property_id = 368]/value" /></i></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value371, '0,0', 'my')" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value372, '0,0', 'my')" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value373, '0,0', 'my')" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value374, '0,0', 'my')" /></td>
                <td class="text-end pe-3"><xsl:value-of select="format-number($average_value, '0,0', 'my')" /></td>
            </tr>
        </xsl:for-each>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

Сейчас сортируется не так, как надо - не по значениям в последнему столбце:
https://wood-base.ru/articles/0/
Модератор
#
Re: Список всех значений дополнительного свойства по id
К сожалению в рамках форума выполнять отладку вашего XSL нет возможности.
Рекомендуем воспользоваться нейросетями, которые могут дать вам полезные подсказки.
#
Re: Список всех значений дополнительного свойства по id
Да мне особо ничего отлаживать и не надо. Мне надо было посоветовать, как правильно код записать.
Вот он:
<?xml version="1.0" encoding="utf-8"?>
<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:strip-space elements="*"/>
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>

<xsl:variable name="min371" select="/shop/minPropertyValue[@id=371]"/>
<xsl:variable name="max371" select="/shop/maxPropertyValue[@id=371]"/>
<xsl:variable name="den371" select="$max371 - $min371"/>
<xsl:variable name="min372" select="/shop/minPropertyValue[@id=372]"/>
<xsl:variable name="max372" select="/shop/maxPropertyValue[@id=372]"/>
<xsl:variable name="den372" select="$max372 - $min372"/>
<xsl:variable name="min373" select="/shop/minPropertyValue[@id=373]"/>
<xsl:variable name="max373" select="/shop/maxPropertyValue[@id=373]"/>
<xsl:variable name="den373" select="$max373 - $min373"/>
<xsl:variable name="min374" select="/shop/minPropertyValue[@id=374]"/>
<xsl:variable name="max374" select="/shop/maxPropertyValue[@id=374]"/>
<xsl:variable name="den374" select="$max374 - $min374"/>

<xsl:template match="/shop">
    <div class="d-flex justify-content-between fs-2 text-blue-700 font-family-narrow mb-4">
        <h1 class="fs-2 text-blue-700 font-family-narrow me-auto">Динамическая таблица видов древесины по прочности</h1>
        <span class="text-muted"><xsl:value-of select="count(shop_item)"/></span><xsl:text>&#0160;из&#0160;</xsl:text><xsl:value-of select="items_total_count"/>
    </div>
    
    <div class="table-responsive-lg">
        <table class="table table-xs table-bordered table-border-radius table-hover d-block table_sort">
            <thead class="sticky-top bg-white font-family-narrow">
                <tr>
                    <th class="fw-normal col-auto">№</th>
                    <th class="fw-normal col col_sort">Название</th>
                    <th class="fw-normal col-auto col_sort">Ботаническое название</th>
                    <th class="fw-normal col-1 col_sort">Индекс твёрдости Янка</th>
                    <th class="fw-normal col-1 col_sort">Индекс предела прочности при изгибе</th>
                    <th class="fw-normal col-1 col_sort">Индекс модуля упругости при изгибе</th>
                    <th class="fw-normal col-1 col_sort">Индекс предела прочности при сжатии</th>
                    <th class="fw-normal col-1 col_sort">Общий индекс прочности</th>
                </tr>
            </thead>
            
            <tbody class="table-group-divider">
                <!-- Сортировка по убыванию (descending) значения avgAll -->
                <xsl:apply-templates select="shop_item">
                    <xsl:sort select="(
                    ((property_value[property_id=371]/value - $min371) div $den371) * 100 +
                    ((property_value[property_id=372]/value - $min372) div $den372) * 100 +
                    ((property_value[property_id=373]/value - $min373) div $den373) * 100 +
                    ((property_value[property_id=374]/value - $min374) div $den374) * 100
                    ) div 4"
                    data-type="number"
                    order="descending"/>
                </xsl:apply-templates>
            </tbody>
        </table>
    </div>
</xsl:template>

<xsl:template match="shop_item">
    <xsl:variable name="val371" select="property_value[property_id=371]/value"/>
    <xsl:variable name="val372" select="property_value[property_id=372]/value"/>
    <xsl:variable name="val373" select="property_value[property_id=373]/value"/>
    <xsl:variable name="val374" select="property_value[property_id=374]/value"/>
    <xsl:variable name="avg371" select="(($val371 - $min371) div $den371) * 100"/>
    <xsl:variable name="avg372" select="(($val372 - $min372) div $den372) * 100"/>
    <xsl:variable name="avg373" select="(($val373 - $min373) div $den373) * 100"/>
    <xsl:variable name="avg374" select="(($val374 - $min374) div $den374) * 100"/>
    <xsl:variable name="avgAll" select="($avg371 + $avg372 + $avg373 + $avg374) div 4"/>
    
    <tr>
        <td class="text-end"><xsl:value-of select="position()"/></td>
        <td><a class="alert-link" href="{url}"><xsl:value-of select="name"/></a></td>
        <td><i><xsl:value-of select="property_value[property_id = 367]/value"/><xsl:text> </xsl:text><xsl:value-of select="property_value[property_id = 368]/value"/></i></td>
        <td class="text-end pe-3"><xsl:value-of select="format-number($avg371, '0,0', 'my')"/></td>
        <td class="text-end pe-3"><xsl:value-of select="format-number($avg372, '0,0', 'my')"/></td>
        <td class="text-end pe-3"><xsl:value-of select="format-number($avg373, '0,0', 'my')"/></td>
        <td class="text-end pe-3"><xsl:value-of select="format-number($avg374, '0,0', 'my')"/></td>
        <td class="text-end pe-3 fw-bold"><xsl:value-of select="format-number($avgAll, '0,0', 'my')"/></td>
    </tr>
</xsl:template>
</xsl:stylesheet>

Теперь в таблице сортируется всё как надо – по значениям в последнем столбце (от большего к меньшему).
https://wood-base.ru/articles/vidy-drevesiny-po-prochnosti/
Авторизация