Задать вопрос

Как установить ограничение по нескольким складам Битрикс?

Добавил ограничение по определенным складам.

<?

use Bitrix\Sale\Delivery\DeliveryLocationTable,
    Bitrix\Sale\Internals\CollectableEntity,
    Bitrix\Sale\Shipment;

class InCartPropCodeDeliveryRestriction extends \Bitrix\Sale\Delivery\Restrictions\Base
{
    public static function getClassTitle()
    {
        return 'По наличию в корзине товара на определенном складе';
    }

    public static function getClassDescription()
    {
        return 'Выбираем склад, для которого будет работать доставка';
    }

    public static function check($arData, array $restrictionParams, $deliveryId = 0)
    {
        $amountZero = false;
        foreach ($arData as $data) {
            $rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
                'filter' => array('=PRODUCT_ID' => $data, '=STORE_ID' => array(31, 33)),
                'select' => array('PRODUCT_ID', 'AMOUNT', 'STORE_ID', 'STORE_TITLE' => 'STORE.TITLE', 'PRODUCT_NAME' => 'PRODUCT.IBLOCK_ELEMENT.NAME'),
            ));

            while ($arStoreProduct = $rsStoreProduct->fetch()) {
                if ($arStoreProduct['AMOUNT'] == 0) {
                    $amountZero = true;
                }
            }
        }
        if ($amountZero == true) {
            return false;
        } else {
            return true;
        }
    }

    protected static function extractParams(CollectableEntity $shipment)
    {
        $mxResult = false;
        // Получаем товары в корзине:
        foreach ($shipment->getShipmentItemCollection() as $shipmentItem) {
            /** @var \Bitrix\Sale\BasketItem $basketItem - запись в корзине */
            $basketItem = $shipmentItem->getBasketItem();
            $productId = $basketItem->getProductId(); // Получим id товара

            // echo $productId;

            // Если товар ТП - получим данные элемента ИБ по ID ТП, в противном случае - по текущему ID
            $mxResult[] = $productId;
            /* if (!is_array($mxResult)) {
                 $mxResult[] = \CIBlockElement::GetByID($productId)->Fetch();
             }*/
        }
        /*   echo "<pre>";
           print_r($mxResult);
           echo "</pre>";*/

        return $mxResult;
    }

    public static function getParamsStructure($deliveryId = 0)
    {
        return array(
            "PARAM_VALUE" => array(
                'TYPE' => 'STRING',
                'LABEL' => 'ID склада',
            ),
        );
    }
}

?>


Затык в том что у меня в filter STORE_ID = array
'filter' => array('=PRODUCT_ID' => $data, '=STORE_ID' => array(31, 33)),


т.е. идут 2 склада, по которым нужно проверять, а работает только по одному, т.е. если сделать так:
'filter' => array('=PRODUCT_ID' => $data, '=STORE_ID' =>31),


Как исправить что бы ограничение работало по 2?

Я понимаю что функцию сheck наверно нужно вызвать 2 раза, но при этом по очереди передав ID склада что бы проверить, но не знаю как реализовать
  • Вопрос задан
  • 232 просмотра
Подписаться 1 Сложный 4 комментария
Решения вопроса 1
winer
@winer
занимаюсь разработкой сайтов на 1c-bitrix
<?
$productsAmount = [];

$rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
    'filter' => array('PRODUCT_ID' => $arData, 'STORE_ID' => array(31, 33)),
    'select' => array('PRODUCT_ID', 'AMOUNT', 'STORE_ID', 'STORE_TITLE' => 'STORE.TITLE', 'PRODUCT_NAME' => 'PRODUCT.IBLOCK_ELEMENT.NAME'),
));

while ($arStoreProduct = $rsStoreProduct->fetch()) {
    if (is_null($productsAmount[$arStoreProduct["PRODUCT_ID"]])) {
        $productsAmount[$arStoreProduct["PRODUCT_ID"]] = 0;
    }
    
    $productsAmount[$arStoreProduct["PRODUCT_ID"]] += $arStoreProduct["AMOUNT"]
}

return array_search(0, $productsAmount) === false;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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