@IgorRastarov

Как вывести только заполненные свойства?

Всем привет. У меня такой вопрос. У меня очень много свойств товаров в инфоблоке. К сожалению, создавать отдельный инфоблок со свойствами товаров не получится. И мне надо выводить все 500 свойств полностью. Возможно они будут дополняться. Хочу вывести только заполненные свойства.
Я использую API
foreach($arResult as $key => $props){
	$arSelectNew = Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM", "ACTIVE"=>"Y", "PROPERTY_*");
	$arFilterNew = Array("IBLOCK_ID" => 3,"ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "!PROPERTY_*"=> false);
	$resNew = CIBlockElement::GetList(Array(),$arFilterNew,false,Array(),$arSelectNew);
	
	while($obNew = $resNew->GetNextElement()){ 
		$arPropsNew = $obNew->GetProperties();
		$props['ALL_PROPS'] = $arPropsNew;	
	}
	
$arResult["NEW_PROPERTIES"]["ALL_PROPS"] = $props;
}

Но, условие "!PROPERTY_*"=> false - работать не хочет. Оно работает, только с конкретным указанием Названия свойства. Например так "!PROPERTY_ARTNUMBER"=> false.
Я уже второй день гуглю и не могу найти ответ.
Помогите, пожалуйста.
  • Вопрос задан
  • 47 просмотров
Решения вопроса 1
xzdshr
@xzdshr
Использовать только за пределами циклов $arResult['ITEMS']. Иначе огребете N+1. Судя по комментарию вы находитесь на странице товара, а не списка, поэтому N+1 не будет.

$dbProps = CIBlockElement::GetProperty(
    IBLOCK_ID,
    ELEMENT_ID,
    array('ID' => 'ASC'),
    array('EMPTY' => 'N')
);

while ($arProp = $dbProps->GetNext()) {
	// some code
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
serginhold
@serginhold
php гинеколог-разведчик
только через проверку значения на выводе. Через api GetList() никак не запросить. У тебя в любом случае 1 товар например имеет 2 свойства, второй товар 3 других свойства, итого нужны данные по 5 свойствам для двух товаров. И т.д. и т.п. Проще все сразу запросить. А если прям хочется оптимизировать как-то, допустим не тянуть за собой 300 точно незаполненных свойств, то сначала выбираем товары без свойств, потом берём их ID, потом прямой запрос к базе, получить список свойств для товаров, потом опять getList, в который передаешь набор полученных свойств. Короче это битрикс, тут с этим все плохо. Ещё сразу напишу, что метод getProperties() делает запрос к базе при каждом вызове, т.е. если на странице 50 товаров, то будет 50 лишних запросов.. в общем сиди, страдай и думай что в твоем случае оптимальнее =)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы