Информация по кастомным ограничениям очень скудная. Попробуем разобрать класс ограничения на составляющие:
public static function getClassTitle() - задает Название (Титл) ограничения public static function getClassDescription() - задает текстовое описание ограничения public static function getParamsStructure() - формирует данные, которые будут показаны в окошке настройке ограничения public static function check() - выполняет непосредственно проверку на выполнение ограничения protected static function extractParams() - выдергивает параметры из корзины, которые потом будут проверятся в функции Chek()
Стоит задача подключить дополнительные пункты отгрузки товара. У нас есть центральный магазин (склад 1) и еще несколько магазинов (склад 2, склад 3, склад 4). Везде разные ИП. Необходимо чтобы при выборе определенного склада подставлялся эквайринг данного ИП. Например: отгрузка со "склада 2", прием средств на эквайринг "ИП 2"
Реализовать это все решил через ограничение платежных систем.
Надо создать ограничение: использовать эквайринг ИП 2 если выбран склад отгрузки 2, и т.п.
но при переделки под себя вылазят ошибки и не получается переделать нужна помощь
взял за основу ограничение для служб доставки проверяет наличие товара на определенном складе при оформлении корзины
вод код:
перехват событий в init.php пропустим, там все хорошо непосредственно
Код
use Bitrix\Sale\Payment;
use \Bitrix\Sale\Shipment;
\Bitrix\Main\Loader::includeModule('highloadblock');
/**
* Class checkDeliveryStore
* Проверка на наличие остатов на складе
*/
class checkDeliveryStorePay extends Restrictions\Base
{
public static $easeSort = 100;
public static function getClassTitle()
{
return 'по наличию на складе';
}
public static function getClassDescription()
{
return 'Будет произведена проверка оформляемой корзины на наличие товаров на выбранном складе.';
}
Ругается на аргументы функции extractParams()/ Ниже не полный тект ошибки
[TypeError] Argument 1 passed to checkDeliveryStorePay::extractParams() must be an instance of Bitrix\Sale\Shipment, instance of Bitrix\Sale\Payment given...
Игорь Долгополов написал: Примерно то, что вам нужно . Только как правильно подметили, событие правильно подберите. Либо onbeforeproductupdate в котором будут доступны данные товара (модуль catalog), либо onbeforeiblockelementupdate в котором будут доступны данные элемента ИБ (iblock)
Спасибо. На основе вашего поста сделал програмку и повесил на событие обновление элемента Рабочий вариант:
Код
//=============================================================
// Товары из нескольких сладов перекладываем в один склад
\Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog','\Bitrix\Catalog\Product::OnBeforeUpdate','onBeforeProductUpdate');
function onBeforeProductUpdate(\Bitrix\Main\Entity\Event $event){
$result = new \Bitrix\Main\Entity\EventResult();
/**
* получаем ID товара
*/
$ind = $event->getParameter('primary')['ID'];
//Контрольный вывод ID обрабатываемого товара
echo $ind";
// Перебираем склады со 136 по 149 и проверяем есть ли товар на этих складах
$rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
'filter' => array('=PRODUCT_ID'=>$ind,'>AMOUNT'=>0,'>=STORE_ID'=>136, '<=STORE_ID'=>149),//,'STORE.ACTIVE'=>'Y',),
'select' => array('ID','AMOUNT','STORE_ID'),
));
// Если товар есть, суммируем в переменную
$SUMamout=0;
while($arStoreProduct =$rsStoreProduct->fetch())
{
$SUMamout += $arStoreProduct['AMOUNT'];
}
// для контроля
echo "Итого в ТЦ - ".$SUMamout."/n/r";
// Если есть остатки, все складываем на склад 1
if ($SUMamout >0)
{
$rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
'filter' => array('=PRODUCT_ID'=>$ind,'=STORE_ID'=>1),
'select' => array('ID'),
));
if ($arStore = $rsStoreProduct->Fetch())
{
$arFieldss = Array(
"PRODUCT_ID" => $ind,
"STORE_ID" => 1,
"AMOUNT" => $SUMamout,
);
if(CCatalogStoreProduct::Update($arStore['ID'], $arFieldss))
{
echo "Такой уже есть, обновляем, ";
}else{
echo "Не получилось обновить";
}
}
else
{
$arFieldss = Array(
"PRODUCT_ID" => $ind,
"STORE_ID" => 1,
"AMOUNT" => $SUMamout,
);
if(CCatalogStoreProduct::Add($arFieldss))
{
echo "Добавляем новый ";
}else{
echo "Не получилось добавить товар - ".$arFieldss['PRODUCT_ID']." в склад - ".$arFieldss['STORE_ID']." в количестве - ".$arFieldss['AMOUNT'] ;
}
}
}
$result->modifyFields($arFields);
return $result;
}
//=============================================================
Когда наблюдал логи от загрузки данных из 1С на сайт, обнаружил, что программа вызывается несколько раз для каждого товара, событие onBeforeProductUpdate для каждого элемента срабатывает несколько раз. И каждый раз вызывается программа и делает одно и тоже. В результате время обмена увеличивается.
Вопрос: Как во время выгрузки товара из 1С на сайт вызывать событие только один раз?
хочу повесить обработчик на событие OnSuccessCatalogImport1C
Вопрос. Как обратиться только к импортируемым в данной выгрузке товарам а не ко всему каталогу?
из 1С передаются "только измененные" товары, например в каталоге 100 товаров а изменились только 10 товаров как выбрать именно эти 10 товаров и что то с ними сделать ?
Нужен специалист на изменение логики работы модуля ПОИСК надо изменить выдаваемый результат стандартный модуль выдает плохорелевантный ответ и много "мусора" в рзультате поиска
Стоит задача улучшить поиск на сайте выдавать только те товары которые ищет клиент
проблема в следующем при запросе "Болгарка" в запросе выдаются как сам инструмент УШМ(болгарка) так и оснастка к нему круги для ушм, диски для ушм, чашки для ушм
так и с подобными рубриками где к инструменту есть расходники
вопрос при запросе "Болгарка" показывать только инструмент , а не расходники к нему ?
Проверка системы показывает недоступные для записи файлы
Код
Недоступны для чтения или записи (показаны первые 10):
/bitrix/managed_cache/MYSQL/b_user_field/a6/a664360f4baf0bac32dc098b454218f6.php
/bitrix/managed_cache/MYSQL/b_user_field/9f/9f403e6003d8c4cccc49e07ee23686b3.php
/bitrix/managed_cache/MYSQL/b_user_field/ec/ec2980d78d7309e241f213f812101837.php
/bitrix/managed_cache/MYSQL/b_user_field/c2/c2c889fd7ef47552c1b8ba8d53a9dbf0.php
/bitrix/managed_cache/MYSQL/b_user_field/da/da71112413d2866dc746c38ea3ba4372.php
/bitrix/managed_cache/MYSQL/b_user_field/fe/fe3b9657e7bf1ad8fef4298dc3db66d9.php
/bitrix/managed_cache/MYSQL/b_user_field/78/7852db86860c64ce3389f8bc5fdc061f.php
Апач и Нгникс запущены под пользователем www-data всем папкам и файлам даны права для пользователя www-data
но регулярно в кеше появляюся файлы с владельцем root
$arNabor3 = Array(
"ITEM_ID"=>$arFields3[ID],
"QUANTITY"=>1,
"SORT"=>100);
if (!empty($arNabor3)) {
$arNabor4[] = $arNabor3; // Все найденные наборы для данного товара , собираем в большой
} // Набор4, который и будем добавлять
$arNabor3 = Null;
}