Добрый день, в элементе инфоблока я использую сложное свойство, которое хранит значение сериализованной строкой, например
Код |
---|
a:6:{s:9:"sportsman";s:2:"22";s:4:"team";s:2:"43";s:5:"try_1";s:6:"765756";s:5:"try_2";s:6:"678678";s:9:"semifinal";s:8:"34534543";s:5:"final";s:8:"65756756";}
|
Когда я хочу получить все результаты определенного спортсмена я передаю в CIBlockElement::GetList фильтр
Код |
---|
array('IBLOCK_ID' =>9,'?PROPERTY_RESULTS'=>$sportsman_db_value) |
где
Код |
---|
$sportsman_db_value='s:9:"sportsman";s:'.strlen($arResult['ID']).':"'.$arResult['ID'].'"'; |
тоесть строка в сериализованном формате, полностью идентичная части строки в базе, проблема в том что в ней содержатся кавычки и getlist разбивает её по ним, в итоге запрос вместо
Код |
---|
(upper(FPV0.VALUE) like upper('%s:9:"sportsman";s:2:"46"%') and FPV0.VALUE is not null) |
составляется как
Код |
---|
(upper(FPV0.VALUE) like upper('%s:9:%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%sportsman%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%;s:2:%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%46%') and FPV0.VALUE is not null)) |
которое находит лишние значения. Я проследил исполнение метода до метода который проводит разбиение, CAllFilterQuery::CutKav и вот собственно код который проводит разбиение:
Код |
---|
while (preg_match("/\"([^\"]*)\"/",$query,$pt))
{
$res = $pt[1];
if(strlen(trim($pt[1]))>0)
{
$trimpt = $bdcnt."cut5";
$this->m_kav[$trimpt] = $res;
$query = str_replace("\"".$pt[1]."\"", " ".$trimpt." ", $query);
}
else
{
$query = str_replace("\"".$pt[1]."\"", " ", $query);
}
$bdcnt++;
if($bdcnt>100) break;
} |
я не вижу никакого способа его обойти без редактирования системных файлов, может кто-то сталкивался с подобным и знает обходной путь? Все что я придумал пока что, только послать запрос в базу непосредственно к `b_iblock_element_property` с правильным where, выбрать id элементов, и уже их передать GetList-у.