Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Очень вредный вопрос про arFilter

00 голосов
8
Во тут есть пример
http://dev.1c-bitrix.ru/community/forums/messages/forum7/topic3411/message21677/?sphrase_id=95209#message21677

Этот пример лучше чем фильтр без условий, но этого мало :D
Что то никак не соображу, может фильтр умеет искать по регулярным выражениям?
Код
<? $arrFilter = Array(
"DATE_ACTIVE_FROM" => "29.12"
);?>

Цитата
@ - значение поля находится в передаваемом в фильтр разделенном запятой списке значений;
~ - значение поля проверяется на соответствие передаваемому в фильтр шаблону;
% - значение поля проверяется на соответствие передаваемой в фильтр строке в соответствии с языком

и что бы отфильтровались все года с числом активности 29 и месяцем 12?
Ну или как то повлиять на формирования результатов $arResult, не трогая сам компонент, что бы он продолжал обновляться если будут обновления?
спросил 02 Июль, 13 от GIN1 (200 баллов)

8 Ответы

00 голосов
Не может.
ответил 02 Июль, 13 от Pomnep (13,960 баллов)
00 голосов
Цитата
Евгений Жуков пишет:
Не может.

Спасибо за ответ.

Тогда вопрос, не знаю может создать отдельную тему.

На сайте битрикс, ini_set("memory_limit","32M") то есть минимальные значения под битрикс, просто на них очень хорошо видна эта проблема, когда нужно среди элементов инфоблока, произвести сложный поиск, с которым Filter не справляется, приходится выгружать данные в массив, и там в цикле обрабатывать, но это нанимает столько памяти, сколько данных приходится загружать в массив, но их колличество растет постоянно, растет количество компонентов на страницах.

Язык SQL который как обходит такие места, не рекомендован, так как структура битрикс может изменится.
Получается если использовать API и фильтр, нужно не только кустомизировать компонент, но еще и заботиться об очищении памяти, после каждого цикла?
Позже если если получится приведу пример.
Хотя нет это я погорячился, с очищением памяти, можно просто не добавлять данные в массив, ["ITEMS"].
Эх ладно.
ответил 07 Авг, 13 от GIN1 (200 баллов)
00 голосов
Где сам вопрос-то? Пока вижу одни рассуждения на тему "медленный битрикс".
ответил 07 Ноя, 13 от Pomnep (13,960 баллов)
00 голосов
Цитата
Евгений Жуков пишет:
Где сам вопрос-то? Пока вижу одни рассуждения на тему "медленный битрикс".

Вот вопрос :) В компоненте news.list
Мне нужно отфильтровать, все записи по PROPERTY_topday и не выводить первые три, записи с PROPERTY_topday =x, то есть все остальные записи вывести скопом, но по странично, и не загружая все данные из инфоблока в массив, то есть циклом по отфильтрованному не пройтись.

Фильтр
Код
 $rsElement = CIBlockElement::GetList($arSort, array_merge($arFilter, $arrFilter), false, $arNavParams, $arSelect);

Не работает с PROPERTY, а в цикле
Код
 while($obElement = $rsElement->GetNextElement()) {

вызывает такой код
Код
      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> но раньше у меня что то с ним не получалось, надо вспомнить.
ответил 14 Фев, 14 от GIN1 (200 баллов)
00 голосов
Воткните перед вызовом компонента:
Код
global $arrFilter;
$arrFilter['PROPERTY_TOPDAY'] = 'x';

ну и в настройках компонета должно быть указано имя фильтра.
ответил 04 Июнь, 14 от Pomnep (13,960 баллов)
00 голосов
Цитата
Евгений Жуков пишет:
Воткните перед вызовом компонента:

Код

global $arrFilter;

$arrFilter['PROPERTY_TOPDAY'] = 'x';



ну и в настройках компонета должно быть указано имя фильтра.

Спасибо завтра буду тестировать.
Щас вот что путем перебора вариантов накрутил
Код
<?
if(CModule::IncludeModule('iblock')) {
$arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM","PROPERTY_topday"); 
$arFilter = Array("IBLOCK_ID"=>28
,"PROPERTY_topday_VALUE"=>"x"
); 
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>10000), $arSelect); 
while($ob = $res->GetNextElement()){ 
$arFields = $ob->GetFields();   
print_r($arFields); 
//$arProps = $ob->GetProperties(); 
//print_r($arProps); 
};
};
?>

Просто беда с инфой.
1) Рабочих примеров не, то есть что бы было "PROPERTY_CODE_VALUE"=>"х" в примерах.
2) Для экспериментов надо иметь битрикс :)
3) Никакой отладки, отфильтрует или нет.
ответил 02 Окт, 14 от GIN1 (200 баллов)
00 голосов
Цитата
Алексей Савельев пишет:
,"PROPERTY_topday_VALUE"=>"x"

Ошибка. Такой ключ будет в результатах. Правильный - PROPERTY_TOPDAY. И еще - создавайте символьные коды заглавными буквами - избежите ряда проблем.
ответил 03 Фев, 15 от Pomnep (13,960 баллов)
00 голосов
По тестировал работает, но вот еще проблемка.
Если я беру и создаю поле в инфоблоке типа Дата\Время, то могу производить по нему поиск используя % то есть
Код
 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(предел даты)?
ответил 17 Май, 15 от GIN1 (200 баллов)

Похожие вопросы

0 голосов
2 ответов
спросил 11 Март, 14 от Jimbox (100 баллов)
0 голосов
3 ответов
спросил 28 Фев, 14 от EDKA (980 баллов)
0 голосов
3 ответов
спросил 26 Фев, 14 от Wildest (500 баллов)
0 голосов
4 ответов
спросил 24 Дек, 13 от FOOLKS (520 баллов)
0 голосов
5 ответов