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

#
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);
  
$oProperty = Core_Entity::factory('Property', 262); // Объект дополнительного свойства с идентификатором 262
$aPropertyValues = $oProperty->getValues($informationsystem_item_id); // Массив значений свойства 262 для информационного элемента $informationsystem_item_id
if (isset($aPropertyValues[0]) && trim($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', '=', $oProperty->id)
      ->where('property_value_strings.value', '=', $aPropertyValues[0]->value)
      ->groupBy('informationsystem_items.id')
      ;
   $Informationsystem_Controller_Show->show();
}
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
EugenyP, ругается на эту строчку:
$aPropertyValues = $oProperty->getValues($informationsystem_item_id);

Пишет
Цитата:
Замечание: Undefined variable: informationsystem_item_id в файле /home/.../hostcmsfiles/lib/lib_264/lib_264.php (строка 135)

т.е. $informationsystem_item_id неопределенная переменная.
Хотя всё происходит согласно документации https://www.hostcms.ru/documentation/modules/properties/introduction/
Как Вы думаете, в чём причина?...

И ещё вопросик. Ранее была строчка вот такая
if (isset($aPropertyValues[0]) && $aPropertyValues[0]->value != '')

а потом Вы заменили на вот такую
if (isset($aPropertyValues[0]) && trim($aPropertyValues[0]->value) != '')
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Dmitry K.,
вместо $informationsystem_item_id вам нужно туда подставить ID текущего отображаемого товара

trim($aPropertyValues[0]->value)
- обрезка лишних пробелов
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Ура! Заработало!
Вот часть, которую я чуть-чуть поменял:
...
$oProperty = Core_Entity::factory('Property', 262);
$aPropertyValues = $oProperty->getValues($iItem = intval(Core_Page::instance()->object->item));
if (isset($aPropertyValues[0]) && trim($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[0]->value)
...

Было б здорово, если б вот отсюда https://www.mebelib.ru/wood-tree/abrikos/ с таблицы Родственные виды древесины можно было бы убрать
Абрикос (Prunus armeniaca)

Он текущий элемент. То есть там должна быть вот такая конструкция:
   ->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[0]->value)
   ->setOr()
   ->where('informationsystem_item_properties.property_id', '=', 284)
   ->where('property_value_strings.value', '!=', $aPropertyValues[0]->value)
   ->groupBy('informationsystem_items.id')
   ->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 2);

чтобы на странице оставалось:

  1. Вишня (Prunus cerasus)
  2. Слива (Prunus domestica)
  3. Черёмуха поздняя (Prunus serotina)
  4. Черешня (Prunus avium)

Евгений, там надо ID доп. свойства прикрутить
$oProperty = Core_Entity::factory('Property', 262);
$aPropertyValues = $oProperty->getValues($iItem = intval(Core_Page::instance()->object->item));

Но не только 262, но и 284. А как?
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Добрый день!
Может кто-нибудь подскажет, как получить массив дополнительных свойств по значению информационной системы?
Как получить текущее значение одного дополнительного свойства типа "строка" за номером, например 262 - это я знаю:
$oProperty = Core_Entity::factory('Property', 262);
$aPropertyValues = $oProperty->getValues($iItem = strval(Core_Page::instance()->object->item));

А как мне получить значения не только 262-го, но и 284-го дополнительных свойств, например?
Или всех значений всех дополнительных свойств у 55-ой информационной системы?
$linkedObject = Core_Entity::factory('Informationsystem_Item_Property_List', 55);
$aProperties = $linkedObject->Properties->findAll();
...

А вот как написать сюда последнюю строчку - не додую...
Вот эта
$aPropertyValues = $oProperty->getValues($iItem = strval(Core_Page::instance()->object->item));

не подходит! И вот эта
$aPropertyValues = $oProperty->getPropertyValues($iItem = strval(Core_Page::instance()->object->item));

через getPropertyValues() не подходит (получение всех значений свойств объекта).
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
И вот так ничего не получается:
$linkedObject = Core_Entity::factory('Informationsystem_Item_Property_List', 55);
$aProperties = $linkedObject->Properties->findAll();
$aPropertyValues = $oProperty->getPropertyValues->findAll();

Ругается на строчку:
$aPropertyValues = $oProperty->getPropertyValues->findAll();

Цитата:
Замечание: Undefined variable: oProperty в файле /home/users/k/kamardindg/domains/detskaya-mebel.com/hostcmsfiles/lib/lib_264/lib_264.php (строка 146)
Замечание: Trying to get property of non-object в файле /home/users/k/kamardindg/domains/detskaya-mebel.com/hostcmsfiles/lib/lib_264/lib_264.php (строка 146)Exception: Call to a member function findAll() on null

Какая-то неопределенная переменная и попытка получить свойство не-объекта.
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
И вот так
$linkedObject = Core_Entity::factory('Informationsystem_Item_Property_List', 55);
$aProperties = $linkedObject->Properties->findAll();
$aProperty = $aProperties->getPropertyValues->findAll();

ничего не получается!
Цитата:
Замечание: Trying to get property of non-object в файле /home/users/k/kamardindg/domains/detskaya-mebel.com/hostcmsfiles/lib/lib_264/lib_264.php (строка 147)Exception: Call to a member function findAll() on null
Модератор
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Dmitry K.,
я же вам в чате отвечал, если getPropertyValues не подходит, то используете код получения значений свойств https://www.hostcms.ru/documentation/modules/properties/introduction/
Два пункта Получение значений дополнительных свойств и Получение всех значений свойств объекта через getPropertyValues()
Если вы знаете как получить значения одного свойства, то я вам говорил, чтобы получить аналогично значения другого свойства, то нужно скопировать код и поменять в нем идентификатор свойства, сложно сказать, что в этом совете может быть непонятным.
Как на основе приведенных примеров вы получили такие чудеса, как $aProperty = $aProperties->getPropertyValues->findAll(); - совершенно непонятно.
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
hostcms, добрый день!
А я правильно пишу, если мне надо получить все значения дополнительных свойств информационной системы 55?
$oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', 55);
$aPropertyValues = $oInformationsystem_Item->getPropertyValues();
foreach($aPropertyValues as $oPropertyValue)
   {
   echo '<br />Property ',
   htmlspecialchars($oPropertyValue->Property->name), ', value = ',
   htmlspecialchars($oPropertyValue->Property->type == 2
                           ? $oPropertyValue->file
                           : $oPropertyValue->value);
   }
Модератор
#
Re: Показ схожих информационных элементов на основе дополнительного свойства
Dmitry K.,
Сейчас да.

Ранее своем примере вы вместо метода getPropertyValues() писали getPropertyValues, а затем по цепочке у массива, который предполагается к возврату в методе getPropertyValues() применяете findAll(), что совершенно невозможно.
Авторизация