Показ схожих информационных элементов на основе дополнительного свойства

#
Показ схожих информационных элементов на основе дополнительного свойства
Добрый день.
Есть тема «Показ схожих информационных элементов на основе меток».
Она подробно описана на https://www.hostcms.ru/forums/3/8463/#

А кто-нибудь задумывался как вывести схожие информационные элементы на основе дополнительного свойства? Например, имеем дополнительное свойство за номером 262
<xsl:apply-templates select="/informationsystem/informationsystem_item_properties//property[@id = 262]" />

Вот как сделать, чтобы по совпадающему значению (тип – строка) выводились все остальные.
К примеру, по совпадающему дополнительному свойству 262, выводились доп. свойства 262 и 284 с ссылочкой на них.

Афата – Cordia trichotoma
Бокоте – Cordia gerascanthus
Зирикоте – Cordia dodecandra
Лору-Прету – Cordia megalantha
Фрейхо – Cordia alliodora
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Пример запроса с отбором по доп свойству можете посмотреть здесь https://www.hostcms.ru/documentation/modules/properties/controllers/
Получаете в ТДС объекты инфо элементов и добавляете их в xml . За основу можете взять этот пример из документации https://www.hostcms.ru/documentation/modules/shop/frontend/similar-price-of-goods/
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
llirik, спасибо.
Пытаюсь подстроить эти примеры под свои задачи...
Вопрос:
А почему в ТДС
//->show()
закомментировано?
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Может кто-нибудь подскажет, что я делаю не так?
Вроде всё сделал по инструкции.
Вот часть кода ТДС:
/* Показ схожих инфоэлементов на основе доп. свойства */
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 55));
$Informationsystem_Controller_Show
   ->xsl(Core_Entity::factory('Xsl')->getByName('РодственныеВиды'))
   ->groupsMode('none')
   ->itemsForbiddenTags(array('text'))
   ->group(false)
   ->itemsProperties(true)
   ->limit(99)
   ->show()
   ;
$Informationsystem_Controller_Show // объединение с нужной таблицей свойств
   ->informationsystemItems()
   ->queryBuilder()
   ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
   ->leftJoin('property_value_strings', 'informationsystem_items.id', '=', 'property_value_strings.entity_id',
                  array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))))
   ->where('informationsystem_item_properties.property_id', '=', 262) // идентификатор дополнительного свойства
   ->where('property_value_strings.value', '=', 'Cordia') // значение дополнительного свойства
   ->groupBy('informationsystem_items.id')
   ->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 1) // количество свойств, если 1, то можно не указывать
   ;

А это 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:template match="/">
<p class="font-narrow h5">Родственные виды</p>
<ul><xsl:apply-templates select="/informationsystem/informationsystem_item" /></ul>
</xsl:template>

<xsl:template match="/informationsystem/informationsystem_item">
<xsl:choose>

<xsl:when test="/informationsystem/informationsystem_item_properties">
<li>
<a href="{url}"><xsl:value-of select="name" /></a>
<xsl:text> (</xsl:text>
<xsl:value-of select="property_value[tag_name='genus']/value" /><xsl:text>&#xa0;</xsl:text>
<xsl:value-of select="property_value[tag_name='species']/value" /><xsl:text>)</xsl:text>
</li>
</xsl:when>

<xsl:otherwise>
Родственных видов не обнаружено
</xsl:otherwise>

</xsl:choose>
</xsl:template>

</xsl:stylesheet>

Выводится всё подряд. Вот пример: https://www.mebelib.ru/wood-tree/afata/
А должно быть вот так:
Родственные виды
Афата (Cordia trichotoma), т.к. мы здесь уже находимся...
●  Бокоте (Cordia gerascanthus)
●  Зирикоте (Cordia dodecandra)
●  Лору-Прету (Cordia megalantha)
●  Фрейхо (Cordia alliodora)
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Добрый день.
Опять не получается!
Вот фрагмент кода ТДС:
/* 1 - Родственные виды древесины - показ схожих инфоэлементов на основе доп. свойства */
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 55));
$Informationsystem_Controller_Show
   ->xsl(Core_Entity::factory('Xsl')->getByName('РодственныеВидыДревесины'))
   ->groupsMode('none')
   ->itemsForbiddenTags(array('text'))
   ->group(false)
   ->itemsProperties(true)
   ->limit(99)
   ;
$Informationsystem_Controller_Show
   ->informationsystemItems()
   ->queryBuilder()
   ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
   ->leftJoin('property_value_strings', 'informationsystem_items.id', '=', 'property_value_strings.entity_id',
                  array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))))
   ->where('informationsystem_item_properties.property_id', '=', 262)
   ->where('property_value_strings.value', '=', $informationsystem_item_id)
   ->groupBy('informationsystem_items.id')
   ;
$Informationsystem_Controller_Show->show();

Если меняю строку
->where('property_value_strings.value', '=', $informationsystem_item_id)

на, например,
->where('property_value_strings.value', '=', 'Cordia')

то едёт выборка по значению информационного элемента Cordia, но выборка, естественно, отображается во всех информационных элементах.
А как сделать так, чтобы выборка была по доп. свойству с id=262, но текущего значения этого свойства?

Например, когда мы находимся на странице с инфоэлементом
Абрикос (Prunus armeniaca), то выводились бы значения:
1. Абрикос (Prunus armeniaca)
2. Вишня (Prunus cerasus)
3. Слива (Prunus domestica)
4. Черёмуха поздняя (Prunus serotina)
5. Черешня (Prunus avium)

...или на странице с инфоэлементом
Палисандр (Dalbergia spp.), то то выводились бы значения:
1. Кокоболо (Dalbergia retusa, D. hypoleuca, D. lineata, D. granadillo)
2. Палисандр (Dalbergia spp.)
3. Розовое дерево (Dalbergia decipularis)

Может кто-нибудь поможет? Знает как?
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Получаете значение нужного доп. свойства и подставляете его в выборку похожих товаров
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
EugenyP,
а как это на моём примере реализовать.
Чую решение где-то рядом, а что надо конкретно сделать - не пойму.
Уже всю голову сломал!
Как в моём случае получить это значение доп. свойства?
Помогите, пожалуйста!
#
Re: Показ схожих информационных элементов на основе дополнительного свойства

// Объект дополнительного свойства с идентификатором 262
$oProperty = Core_Entity::factory('Property', 262);
// Массив значений свойства 262 для информационного элемента $informationsystem_item_id
$aPropertyValues = $oProperty->getValues($informationsystem_item_id);
if (isset($aPropertyValues[0]) && $aPropertyValues[0]->value != '') {
}

https://www.hostcms.ru/documentation/modules/properties/introduction/
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
EugenyP, а вот это
if (isset($aPropertyValues[0]) && $aPropertyValues[0]->value != '') {
}

что за запись? Что она даёт?
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
EugenyP, написал всё как Вы рекомендовали.
А строку
->where('property_value_strings.value', '=', 'Cordia')

меняем на
->where('property_value_strings.value', '=', $propertyValue)

но ничего не получается. И так
->where('property_value_strings.value', '=', $aPropertyValues)

ничего не получается. Выдаёт вот такое -
Цитата:
Замечание: Undefined variable: aPropertyValues в файле /home/users/k/kamardindg/domains/detskaya-mebel.com/hostcmsfiles/lib/lib_264/lib_264.php (строка 145)

Не пойму где ошибка!
Вот мой код:
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 55));
$Informationsystem_Controller_Show
   ->xsl(Core_Entity::factory('Xsl')->getByName('РодственныеВидыДревесины'))
   ->groupsMode('none')
   ->itemsForbiddenTags(array('text'))
   ->group(false)
   ->itemsProperties(true)
   ->limit(99);
$oProperty = Core_Entity::factory('Property', 262); // Объект дополнительного свойства с идентификатором 262
//$aPropertyValues = $oProperty->getValues($informationsystem_item_id); // Массив значений свойства 262 для информационного элемента $informationsystem_item_id
if (isset($aPropertyValues[0]) && $aPropertyValues[0]->value != '') {
   }
$Informationsystem_Controller_Show
   ->informationsystemItems()
   ->queryBuilder()
   ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
   ->leftJoin('property_value_strings', 'informationsystem_items.id', '=', 'property_value_strings.entity_id',
                  array(array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))))
   ->where('informationsystem_item_properties.property_id', '=', 262)
   ->where('property_value_strings.value', '=', $aPropertyValues)
   //->setOr()
   //->where('informationsystem_item_properties.property_id', '=', 284)
   //->where('property_value_strings.value', '!=', 'trichotoma')
   ->groupBy('informationsystem_items.id')
   //->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 2)
   ;
$Informationsystem_Controller_Show->show();

Авторизация