@ - значение поля находится в передаваемом в фильтр разделенном запятой списке значений; ~ - значение поля проверяется на соответствие передаваемому в фильтр шаблону; % - значение поля проверяется на соответствие передаваемой в фильтр строке в соответствии с языком
и что бы отфильтровались все года с числом активности 29 и месяцем 12? Ну или как то повлиять на формирования результатов $arResult, не трогая сам компонент, что бы он продолжал обновляться если будут обновления?
Тогда вопрос, не знаю может создать отдельную тему.
На сайте битрикс, ini_set("memory_limit","32M") то есть минимальные значения под битрикс, просто на них очень хорошо видна эта проблема, когда нужно среди элементов инфоблока, произвести сложный поиск, с которым Filter не справляется, приходится выгружать данные в массив, и там в цикле обрабатывать, но это нанимает столько памяти, сколько данных приходится загружать в массив, но их колличество растет постоянно, растет количество компонентов на страницах.
Язык SQL который как обходит такие места, не рекомендован, так как структура битрикс может изменится. Получается если использовать API и фильтр, нужно не только кустомизировать компонент, но еще и заботиться об очищении памяти, после каждого цикла? Позже если если получится приведу пример. Хотя нет это я погорячился, с очищением памяти, можно просто не добавлять данные в массив, ["ITEMS"]. Эх ладно.
Евгений Жуков пишет: Где сам вопрос-то? Пока вижу одни рассуждения на тему "медленный битрикс".
Вот вопрос В компоненте news.list Мне нужно отфильтровать, все записи по PROPERTY_topday и не выводить первые три, записи с PROPERTY_topday =x, то есть все остальные записи вывести скопом, но по странично, и не загружая все данные из инфоблока в массив, то есть циклом по отфильтрованному не пройтись.
if($bGetProperty)
$arItem["PROPERTIES"] = $obElement->GetProperties();
$arItem["DISPLAY_PROPERTIES"]=array();
foreach($arParams["PROPERTY_CODE"] as $pid) {
$prop = &$arItem["PROPERTIES"][$pid];echo $pid;
if((is_array($prop["VALUE"]) && count($prop["VALUE"])>0) ||
(!is_array($prop["VALUE"]) && strlen($prop["VALUE"])>0)) {
$arItem["DISPLAY_PROPERTIES"][$pid] = CIBlockFormatProperties::GetDisplayValue($arItem, $prop, "news_out");
}
}
$arResult["ITEMS"][]=$arItem; // вот тут можно сделать проверку и добавлять по условию, но тогда $rsElement->GetPageNavStringEx не будет знать по то что мы натворили.
В общем без фильтра который бы захватывал сразу и PROPERTY не обойтись, $obElement->GetProperties(); это не выход Помогло бы "PROPERTY_topday"=>"x"... Но как бы туда запихнуть Пока постил появились идеи, PROPERTY_<PROPERTY_CODE> но раньше у меня что то с ним не получалось, надо вспомнить.
Просто беда с инфой. 1) Рабочих примеров не, то есть что бы было "PROPERTY_CODE_VALUE"=>"х" в примерах. 2) Для экспериментов надо иметь битрикс 3) Никакой отладки, отфильтрует или нет.
По тестировал работает, но вот еще проблемка. Если я беру и создаю поле в инфоблоке типа Дата\Время, то могу производить по нему поиск используя % то есть
Код
for($i = 45; $i<=100;$i=$i+5) {
$arr11062010[]=(date("Y")-$i).date("-m-d")."%"; // ДОбавляем в массив через каждые 5 лет.
};
$arFilter=Array("PROPERTY_BDATE" => $arr11062010); // $arr11062010 Тут у нас массив с значениями для фильтра.
Так вот, с полем DATE_ACTIVE_FROM не срабатывает приблизительный поиск "01-01-%" это вывело бы для меня все года, например 01-01-1960,01-01-1980,... Или есть только вариант, когда нужно заполнять массив конкретными значениями по всем годам, будет около 200 значений. 01-01-1970, 01-01-1971, 01-01-1972, 01-01-1973,... 01-01-2(предел даты)?
В базе дата(значение свойства) хранится в формате "YYYY-MM-DD HH:MM:SS", так что попробуйте '%-01-01%'. Возможно, поможет. Хотя сразу хочу предупредить - такой запрос будет выполняться относительно медленно(зависит от объёма базы данных)
unnamed777 пишет: В базе дата(значение свойства) хранится в формате "YYYY-MM-DD HH:MM:SS",
Так то в базе. Не путайте sql-запросы и вызовы API.
Цитата
Алексей Савельев пишет: Так вот, с полем DATE_ACTIVE_FROM не срабатывает приблизительный поиск "01-01-%" это вывело бы для меня все года, например 01-01-1960,01-01-1980
И не должен сработать. Вы же дату подставляете не в формате сайта. Скорее уж тогда 01.01.%
Не надо сверлить зубы через задний проход дрелью от Сваровски
DATE_ACTIVE_FROM это не Дата/Время в обще, % в ней тоже не работало Да еще там дата раньше чем эпоха начинается, 1970 ... В общем генерирую массив из 400 значений, вроде хватает. А вот еще вопрос, как взять через фильтр XML_ID
Код
PROPERTY_<PROPERTY_CODE>.<FIELD> - фильтр по значениям полей связанных элементов. , где PROPERTY_CODE - ID или мнемонический код свойства привязки, а FIELD - поле указанного в привязке элемента. FIELD может принимать следующие значения: ACTIVE, DETAIL_TEXT_TYPE, PREVIEW_TEXT_TYPE, EXTERNAL_ID, NAME, XML_ID, TMP_ID, DETAIL_TEXT, SEARCHABLE_CONTENT, PREVIEW_TEXT, CODE, TAGS, WF_COMMENTS, ID, SHOW_COUNTER, WF_PARENT_ELEMENT_ID, WF_STATUS_ID, SORT, CREATED_BY, PREVIEW_PICTURE, DETAIL_PICTURE, IBLOCK_ID, TIMESTAMP_X, DATE_CREATE, SHOW_COUNTER_START, DATE_ACTIVE_FROM, DATE_ACTIVE_TO, ACTIVE_FROM, ACTIVE_TO, ACTIVE_DATE, DATE_MODIFY_FROM, DATE_MODIFY_TO, MODIFIED_USER_ID, MODIFIED_BY, CREATED_USER_ID, CREATED_BY. Правила фильтров идентичны тем, которые описаны выше.
это чудо не работает $filter["PROPERTY_TOPDAY.XML_ID"]="Y" $filter['PROPERTY_TOPDAY']=array("XML_ID"=>"Y"); тоже не работает.
Вот компонент фильтр ["PROPERTY"]=array("TOPDAY"=>"170"); TOPDAY это список, одно из полей TOPDAY получается с ID 170, а при переносе что с ним будет, ID поменяется?