Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (22)

Лучшие ответы пользователя

Все ответы (217)
  • Существует ли товар в корзине Bitrix?

    @PetrPo
    Ждал красивого решения от битрикса? )) А вот и хрен. Чтобы получить твой \Bitrix\Sale\BasketItem $obItem придется передать все его $properties в 3-ий параметр getExistsItem, типа
    $obItem = $obBasket->getExistsItem('catalog', $productId, [
    	0 => ['CODE' => 'PROP1', 'VALUE' => 'electron'],
    	//......
    ]);

    вообще не понятно зачем этот метод public, если им хрен воспользуешься, надо знать все свойства товара в корзине, у меня это выглядело так
    $obItem = $obBasket->getExistsItem('catalog', $productId, [
    	0 => ['CODE' => 'ARTNUMBER', 'VALUE' => '235-81-03'],
    	1 => ['CODE' => 'COLOR_REF', 'VALUE' => 'Черный'],
    	2 => ['CODE' => 'SIZES_CLOTHES', 'VALUE' => 'XS'],
    	3 => ['CODE' => 'CATALOG.XML_ID', 'VALUE' => 'clothes_offers_s1'],
    	4 => ['CODE' => 'PRODUCT.XML_ID', 'VALUE' => '332#337'],
    ]);


    Вообщем решение конечно будет не таким красивым, как просто методом воспользоваться, но если метод getExistsItem посмотреть, там тоже самое делается, только еще кое-что
    \Bitrix\Main\Loader::includeModule('sale');
    
    $siteId = 's1';
    $fUserId = \Bitrix\Sale\FUser::getId();
    $productId = 139;
    $productByBasketItem = null;
    $bProductInBasket = false;
    
    $basket = \Bitrix\Sale\Basket::loadItemsForFUser($fUserId, $siteId);
    $basketItems = $basket->getBasketItems();
    
    if($basketItems) {
    	foreach($basketItems as $basketItem) {
    		if($basketItem->getField('PRODUCT_ID') == $productId) {
    			$productByBasketItem = $basketItem;
    			$bProductInBasket = true;
    			break;
    		}
    	}
    }
    
    var_dump($bProductInBasket);
    var_dump($productByBasketItem);

    В примере написал булево $bProductInBasket и записал сам объект \Bitrix\Sale\BasketItem в $productByBasketItem, там сам по ситуации выбирай как надо
    Ответ написан
    6 комментариев
  • Почему в Bitrix smart.filter начинает игнорировать PREFILTER_NAME, если выбираются фильтры, относящиеся к торговым предложениям?

    @PetrPo
    В catalog.section используется класс Bitrix\Iblock\Component\ElementList и вот в нем для гетлиста мерджится массив глобального фильтра и массив с внутренним фильтром array_merge($globalFilter, $filterFields) и вот в $filterFields тоже есть ключ =ID и при мердже он затирает твой =ID

    То есть в $prefilterCustom перед ID надо убрать =
    $prefilterCustom = array(
      "ID" => $arElements,
    );
    Ответ написан
    Комментировать
  • Почему обработчик события не вызывается?

    @PetrPo
    Пришлось потупить немного...

    Если зарегистрируешь так событие, твой вариант будет ок работать
    $eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->registerEventHandler('sale', 'OnSaleOrderSaved', $this->MODULE_ID, '\\Yolo\\Bonus\\EventHandler', 'myFunction');

    5e3d6ad0da8ad239350040.jpeg

    P.S. не забудь удалить свое событие из базы и почистить кеш

    P.P.S. в доках на счет объекта \Bitrix\Main\Event $event все верно написано, просто замес старого и нового апи получился)) Таже херня получится между AddEventHandler и $eventManager->addEventHandler
    Ответ написан
    1 комментарий
  • Как убрать дубликаты при выводе свойств элементов на сайте битрикс?

    @PetrPo
    В result_modifier.php
    if($arResult['ITEMS']) {
    	$arResult['FILE_TYPES'] = $filmTypes = [];
    	
    	foreach($arResult['ITEMS'] as $key => $arItem) {
    		$filmTypesProp = isset($arItem['DISPLAY_PROPERTIES']['FILM_TYPES']) ? $arItem['DISPLAY_PROPERTIES']['FILM_TYPES'] : false;
    		$value = $filmTypesProp && $filmTypesProp['VALUE'] ? $filmTypesProp['VALUE'] : false;
    		$displayValue = $filmTypesProp && $filmTypesProp['DISPLAY_VALUE'] ? $filmTypesProp['DISPLAY_VALUE'] : false;
    		
    		if($value && $displayValue) {
    			$filmTypes['VALUE'][] = $value;
    			$filmTypes['DISPLAY_VALUE'][] = $displayValue;
    		}
    	}
    	
    	$arResult['FILE_TYPES'] = [
    		'VALUE' => array_values(array_unique($filmTypes['VALUE'])),
    		'DISPLAY_VALUE' => array_values(array_unique($filmTypes['DISPLAY_VALUE'])),
    	];
    }


    Где сам select выводишь
    <?if(isset($arResult['FILE_TYPES']) && $arResult['FILE_TYPES']):?>
    	<select class="drop" id="regionDropdown">
    		<option value="All">Показать все</option>
    		<?foreach($arResult['FILE_TYPES']['DISPLAY_VALUE'] as $value):?>
    			<option value="<?=$value;?>"><?=$value;?></option>
    		<?endforeach;?>
    	 </select>
    <?endif;?>
    Ответ написан
  • Почему вылетает ошибка агента битрикс?

    @PetrPo
    Предположу, что вызывается $USER->GetID(), в документации указано, что Переменная $USER в агентах отсутствует.. По всей видимости, в этом модуле есть событие на добавление элемента инфоблока, в котором вызывается $USER->GetID() и т.к. $USER=null, а не объект класса CUser получаешь ошибку.
    Ответ написан
    Комментировать