Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"

#
Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
Добрый день.

В процессе создания фильтра по ИС, наткнулся на ранее мне не встречавшуюся странность.

Вот есть элемент:

<item_property type="List" xml_name="location" parent_id="7" id="50">
<property_id>134</property_id>
<property_xml_name>location</property_xml_name>
<property_name>Расположение</property_name>
<property_order>0</property_order>
<location>Ларнака</location>
<value>Ларнака</value>
<description></description>
<value_id>107</value_id>

Если я пишу в фильтре

$element['value'] = '107';  где 107 - это ID элемента списка (т.е. по сути - не value, а value_id), то фильтр работает. Если пишу value - "Ларнака", как вроде бы и нужно, судя по XML - то фильтрация не срабатывает.  Это жутко неудобно, так как списков у меня много, и большинство из них числовые. Помнить кучу соответствий реальных чисел соответствующим ID неудобно. Как можно решить эту проблему?

Буду признателен за совет.
Модератор
#
Re: Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
а при чем тут XML и фильтрация? В таблице хранится ID, вот по нему и фильтруйте.
#
Re: Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
Возможно я где-то ошибаюсь, но:
Согласно API, для описания доп. условий фильтрации элементов ИС в числе прочих нужно определить следующие элементы массива:

$element['property_id'] идентификатор дополнительногого свойства информационных элементов
$element['value'] значение поля (или параметра)

Если доп. свойство ИС - это строка, число или чекбокс, то пишем в $element['value'] требуемое значение отбора и фильтруем по нему. А если доп. свойство ИС - это список, то выставив в $element['value'] значение , которое РАВНО тому, что прописано в наименовании ЭЛЕМЕНТА списка - мы фильтрации не получим. В этом случае нужно прописать ID элемента списка.

А хотелось бы писать сюда не ID, а значение элемента списка. Хотя бы потому, что это неудобно. В том числе потому, что у меня например есть списки на сотню элементов, где значения - числа. И эти списки используются часто в режиме один на несколько разных доп. свойств.

Меня просто запутало то, что для работы фильтра нужно в $element['value'] задания параметров фильтра заносить не значение value элемента списка, а value_id. Логики не никакой.

Меня устроит в принципе ответ плана "фильтровать по значению элемента списка нельзя, можно только по id", если нельзя обойти это.

Спасибо за внимание к моему вопросу.
#
Re: Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
Я извиняюсь,что вмешиваюсь,я думал можно по значению фильтровать. То есть если я правильно понимаю, вы например в доп свойства товара добавляете значение 1-2-3 и в категории фильтрации по значению нет? Так?
#
Re: Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
Именно так, насколько я понимаю ситуацию. Пусть меня поправят модераторы, если я не прав
#
Re: Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
Yukimura, avtozakup
Первое.
Для доп.свойств типа "список" в качестве значения в БД сохраняется именно _идентификатор_ строки списка.
И это - единственно технически верное решение. Потому что оно обеспечивает единое место хранения элементов списка. Мы можем переименовать элемент списка один раз в админке списков, и он автоматически переименуется на всем сайте для всех элементов, в доп.свойстве которых использован этот список.
Если сохранять в базу _значение_ строки списка вместо идентификатора, то мы получим то же самое доп.свойство типа "Строка" со всеми его недостатками и неудобствами.

Второе.
Если вы хотите подставлять в фильтр значение а не идентификатор, то вам нужно написать дополнительную функцию, которая будет возвращать вам идентификатор строки списка по его значению и идентификатору самого списка, и вызывать эту функцию.
Например

// сама функция
getListItemIdByValue = function($sListItemName, $iListId) {
   $lists = & singleton('lists');
   $row = $lists->GetListItemIfIssetValue($iListId, $sListItemName);
   if($row && isset($row['lists_items_id']))
   {
      return $row['lists_items_id'];
   }
   return -1;
}

...


// и ее использование
$element['value'] = getListItemIdByValue('Ларнака', '123');


В третьих.
Зачем вам вообще понадобилось задавать значение словом?
Если вы реализуете фильтр через некую форму на сайте, то передавать на сервер в качестве значения (то есть в value для input или option) нужно не название элемента списка, а его @id и ваша проблема просто не будет существовать!
Заказов не беру. Консультирую редко.
#
Re: Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
Спасибо за ответ.
Уже понял, что лучше и не сделать было при проектировании системы.

Я примерно такую функцию и написал для себя.
А понадобилось мне, так как много предустановленных фильтров нужно настраивать было в текущем проекте со значениями из списков, где значения не из select берутся, сгенеренного согласно тому же списку, а заранее вставлены (например выбрать только дома сдающиеся в аренду). И на этапе настройки, задолбало лазить в списки для просмотра соответствующего ID.

#
Re: Фильтр по дополнительным свойствам в ИС - проблема доп. свойства типа "список"
Kotoff,
Как всегда спасибо все доходчиво .
Авторизация