49 self::TAB_GROUP =>
Loc::getMessage(
'BT_CAT_ADM_TOOLS_TAB_GROUP_MSGVER_1'),
67 self::TAB_PRODUCT => [
71 self::TAB_CATALOG => [
87 self::TAB_SERVICE => [
96 $tabList = array_fill_keys(self::getTabList(),
true);
103 $request = Context::getCurrent()->getRequest();
126 'ID' =>
'create_new_product_button_access_denied',
129 'ONCLICK' =>
'javascript:;',
155 if ($urlBuilder ===
null)
157 $urlBuilder = BuilderManager::getInstance()->getBuilder(BaseBuilder::TYPE_AUTODETECT);
159 if ($urlBuilder ===
null)
165 $urlBuilder->setUrlParams([]);
167 $productCardEnabled =
false;
168 $builderId = $urlBuilder->getId();
171 || $builderId === Catalog\Url\AdminPage\CatalogBuilder::TYPE_ID
176 if ($builderId ===
'CRM')
180 $productCardEnabled = \Bitrix\Crm\Settings\LayoutSettings::getCurrent()->isFullCatalogEnabled();
191 $sectionId =
$arParams[
'find_section_section'] ??
null;
192 if ($sectionId !==
null)
194 $sectionId = (int)$sectionId;
201 if (!empty($productLimits))
203 if (!empty($productLimits[
'HELP_MESSAGE']))
206 'ICON' =>
'btn_lock',
208 $productLimits[
'HELP_MESSAGE'][
'TYPE'] => $productLimits[
'HELP_MESSAGE'][
'LINK'],
215 $publicFlag = $productCardEnabled
223 $arCatalog[
'CATALOG_TYPE'] === CCatalogSku::TYPE_CATALOG
224 ||
$arCatalog[
'CATALOG_TYPE'] === CCatalogSku::TYPE_FULL
232 'PUBLIC' => $publicFlag,
234 if ($productCardEnabled)
236 $detailUrlParams = array_merge(
245 $detailUrlParams = self::getParamsWithTab(
$arParams, self::TAB_SERVICE);
247 $serviceItem[
'LINK'] = $urlBuilder->getElementDetailUrl(
251 unset($detailUrlParams);
256 if (!empty($helpLink))
259 'ICON' =>
'btn_lock',
261 $helpLink[
'TYPE'] => $helpLink[
'LINK'],
270 if ($productCardEnabled)
272 $additionalParams = [];
273 if (
$arCatalog[
'CATALOG_TYPE'] === CCatalogSku::TYPE_CATALOG)
275 $additionalParams = [
281 $additionalParams = [
285 $detailUrlParams = array_merge(
292 $detailUrlParams = self::getParamsWithTab(
$arParams, self::TAB_CATALOG);
299 'ID' =>
'create_new_product_button_' . $gridId,
300 'LINK' => $urlBuilder->getElementDetailUrl(
304 'PUBLIC' => $publicFlag,
309 'LINK' => $urlBuilder->getElementDetailUrl(
311 self::getParamsWithTab(
$arParams, self::TAB_CATALOG)
313 'PUBLIC' => $publicFlag,
321 'ID' =>
'create_new_product_button_' . $gridId,
322 'LINK' => $urlBuilder->getElementDetailUrl(
326 'PUBLIC' => $publicFlag,
330 if (!$productCardEnabled)
332 if (CCatalogSku::TYPE_FULL ==
$arCatalog[
'CATALOG_TYPE'])
336 'LINK' => $urlBuilder->getElementDetailUrl(
338 self::getParamsWithTab(
$arParams, self::TAB_SKU)
340 'PUBLIC' => $publicFlag,
343 if ($serviceItem !==
null)
345 $arItems[] = $serviceItem;
349 if (CCatalogSku::TYPE_OFFERS !=
$arCatalog[
'CATALOG_TYPE'])
353 'LINK' => $urlBuilder->getElementDetailUrl(
355 self::getParamsWithTab(
$arParams, self::TAB_SET)
357 'PUBLIC' => $publicFlag,
362 'LINK' => $urlBuilder->getElementDetailUrl(
364 self::getParamsWithTab(
$arParams, self::TAB_GROUP)
366 'PUBLIC' => $publicFlag,
372 if (!empty($helpLink))
374 if (CCatalogSku::TYPE_OFFERS !=
$arCatalog[
'CATALOG_TYPE'])
378 $helpLink[
'TYPE'] => $helpLink[
'LINK'],
379 'ICON' =>
'btn_lock',
384 $helpLink[
'TYPE'] => $helpLink[
'LINK'],
385 'ICON' =>
'btn_lock',
392 if ($serviceItem !==
null)
394 $arItems[] = $serviceItem;
403 'ID' =>
'create_new_product_button_' . $gridId,
404 'LINK' => $urlBuilder->getElementDetailUrl(
406 self::getParamsWithTab(
$arParams, self::TAB_SKU)
408 'PUBLIC' => $publicFlag,
413 unset($productLimits);
415 if (!empty($arItems))
425 $params[self::$strMainPrefix . self::TAB_KEY] = $tab;
448 $intID = (int)$intID;
461 if ($urlBuilder ===
null)
463 $urlBuilder = BuilderManager::getInstance()->getBuilder(BaseBuilder::TYPE_AUTODETECT);
465 if ($urlBuilder ===
null)
470 $urlBuilder->setUrlParams([]);
472 $allowedProductTypes = static::getIblockProductTypeList(
$intIBlockID,
true);
476 $intProductID = CIBlockElement::GetRealElement($intID);
478 $currentTab = self::getCurrentTabFromRequest();
480 $productType = self::getProductTypeForNewProduct(
$arCatalog);
481 $boolExistSet =
false;
482 $boolExistGroup =
false;
491 '=ID' => $intProductID,
494 if ($product !==
null)
496 $productType = (int)$product[
'TYPE'];
519 && $currentTab ===
null
522 $row[
'ACTION'] =
"if(confirm('"
523 . CUtil::JSEscape(
Loc::getMessage(
'BT_CAT_SET_PRODUCT_TYPE_SET_DELETE_CONFIRM'))
525 .
"window.location='"
526 . $urlBuilder->getElementDetailUrl(
528 self::getParamsWithTab(
529 self::getDeleteAction(
$arParams, self::DELETE_SET),
539 && $currentTab ===
null
542 $row[
'TITLE'] =
Loc::getMessage(
'BT_CAT_SET_PRODUCT_TYPE_CATALOG_FROM_SKU');
543 $row[
'SHOW_TITLE'] =
true;
544 $row[
'DISABLED'] =
true;
549 && $currentTab ===
null
551 || $currentTab === self::TAB_CATALOG
554 $row[
'CHECKED'] =
true;
558 $row[
'LINK'] = $urlBuilder->getElementDetailUrl(
560 self::getParamsWithTab(
$arParams, self::TAB_CATALOG)
580 || $currentTab === self::TAB_SKU
583 $row[
'CHECKED'] =
true;
587 $row[
'LINK'] = $urlBuilder->getElementDetailUrl(
589 self::getParamsWithTab(
$arParams, self::TAB_SKU)
602 && $currentTab ===
null
604 || $currentTab === self::TAB_CATALOG
605 || $currentTab === self::TAB_SET
608 $row[
'LINK'] = $urlBuilder->getElementDetailUrl(
610 self::getParamsWithTab(
$arParams, self::TAB_SKU)
615 && $currentTab ===
null
618 $row[
'ACTION'] =
"if(confirm('"
619 . CUtil::JSEscape(
Loc::getMessage(
'BT_CAT_SET_PRODUCT_TYPE_SET_DELETE_CONFIRM'))
621 .
"window.location='"
622 . $urlBuilder->getElementDetailUrl(
624 self::getParamsWithTab(
625 self::getDeleteAction(
$arParams, self::DELETE_SET),
635 || $currentTab === self::TAB_SKU
638 $row[
'CHECKED'] =
true;
654 && $currentTab ===
null
656 || $currentTab === self::TAB_CATALOG
659 $row[
'LINK'] = $urlBuilder->getElementDetailUrl(
661 self::getParamsWithTab(
$arParams, self::TAB_SERVICE)
666 && $currentTab ===
null
669 $row[
'ACTION'] =
"if(confirm('"
670 . CUtil::JSEscape(
Loc::getMessage(
'BT_CAT_SET_PRODUCT_TYPE_SET_DELETE_CONFIRM'))
672 .
"window.location='"
673 . $urlBuilder->getElementDetailUrl(
675 self::getParamsWithTab(
676 self::getDeleteAction(
$arParams, self::DELETE_SET),
686 && $currentTab ===
null
689 $row[
'TITLE'] =
Loc::getMessage(
'BT_CAT_SET_PRODUCT_TYPE_SERVICE_FROM_SKU');
690 $row[
'SHOW_TITLE'] =
true;
691 $row[
'DISABLED'] =
true;
696 && $currentTab ===
null
698 || $currentTab === self::TAB_SERVICE
701 $row[
'CHECKED'] =
true;
705 $row[
'LINK'] = $urlBuilder->getElementDetailUrl(
707 self::getParamsWithTab(
$arParams, self::TAB_SERVICE)
725 && $currentTab ===
null
727 || $currentTab === self::TAB_CATALOG
730 $row[
'LINK'] = $urlBuilder->getElementDetailUrl(
732 self::getParamsWithTab(
$arParams, self::TAB_SET)
737 && $currentTab ===
null
740 $row[
'TITLE'] =
Loc::getMessage(
'BT_CAT_SET_PRODUCT_TYPE_SET_FROM_SKU');
741 $row[
'SHOW_TITLE'] =
true;
742 $row[
'DISABLED'] =
true;
746 || $currentTab === self::TAB_SET
749 $row[
'CHECKED'] =
true;
753 $row[
'LINK'] = $urlBuilder->getElementDetailUrl(
755 self::getParamsWithTab(
$arParams, self::TAB_SET)
763 if (!$boolFeatureSet && CCatalogSku::TYPE_FULL !==
$arCatalog[
'CATALOG_TYPE'])
768 if ($boolFeatureSet && $currentTab !== self::TAB_GROUP)
775 if (!empty($arItems))
777 $arItems[] = [
'SEPARATOR' =>
'Y'];
780 if ($currentTab ===
null)
782 if (!$boolExistGroup)
787 'LINK' => $urlBuilder->getElementDetailUrl(
789 self::getParamsWithTab(
$arParams, self::TAB_GROUP)
798 'ACTION' =>
"if(confirm('"
799 . CUtil::JSEscape(
Loc::getMessage(
'BT_CAT_SET_PRODUCT_TYPE_GROUP_DELETE_CONFIRM'))
800 .
"'))window.location='"
801 . $urlBuilder->getElementDetailUrl(
803 self::getDeleteAction(
$arParams, self::DELETE_GROUP),
818 'SHOW_TITLE' =>
true,
826 if (!empty($arItems))
849 $arResult = array_fill_keys(self::getTabList(),
false);
850 $currentTab = self::getCurrentTabFromRequest();
854 $intProductID = CIBlockElement::GetRealElement($intID);
864 '=ID' => $intProductID,
867 if ($product !==
null)
869 $productType = (int)$product[
'TYPE'];
870 $haveBundle = $product[
'BUNDLE'] ===
'Y';
873 CCatalogSku::TYPE_CATALOG ==
$arCatalog[
'CATALOG_TYPE']
874 || CCatalogSku::TYPE_FULL ==
$arCatalog[
'CATALOG_TYPE']
875 || CCatalogSku::TYPE_OFFERS ==
$arCatalog[
'CATALOG_TYPE']
882 CCatalogSku::TYPE_PRODUCT ==
$arCatalog[
'CATALOG_TYPE']
883 || CCatalogSku::TYPE_FULL ==
$arCatalog[
'CATALOG_TYPE']
885 if (CCatalogSku::TYPE_FULL ==
$arCatalog[
'CATALOG_TYPE'])
889 || $currentTab === self::TAB_SKU
905 if (CCatalogSku::TYPE_PRODUCT !=
$arCatalog[
'CATALOG_TYPE'])
909 if (CCatalogSku::TYPE_OFFERS !=
$arCatalog[
'CATALOG_TYPE'])
913 || $currentTab === self::TAB_SET
918 || $currentTab === self::TAB_GROUP
930 if ($currentTab !==
null)
932 if (CCatalogSku::TYPE_OFFERS ==
$arCatalog[
'CATALOG_TYPE'])
935 $currentTab === self::TAB_SET
936 || $currentTab === self::TAB_SKU
937 || $currentTab === self::TAB_SERVICE
944 if ($currentTab !==
null)
947 if ($currentTab === self::TAB_GROUP || $currentTab === self::TAB_SET)
952 $currentTab === self::TAB_SKU
959 if ($currentTab === self::TAB_SERVICE)
968 CCatalogSku::TYPE_CATALOG ==
$arCatalog[
'CATALOG_TYPE']
969 || CCatalogSku::TYPE_FULL ==
$arCatalog[
'CATALOG_TYPE']
970 || CCatalogSku::TYPE_OFFERS ==
$arCatalog[
'CATALOG_TYPE']
973 CCatalogSku::TYPE_PRODUCT ==
$arCatalog[
'CATALOG_TYPE']
979 $fieldsList = Catalog\Product\SystemField::getFieldNamesByRestrictions([
983 if (!empty($fieldsList))
994 $currentTab = self::getCurrentTabFromRequest();
997 case CCatalogSku::TYPE_CATALOG:
1003 case self::TAB_SERVICE:
1011 case CCatalogSku::TYPE_FULL:
1012 switch ($currentTab)
1017 case self::TAB_SERVICE:
1028 case CCatalogSku::TYPE_PRODUCT:
1031 case CCatalogSku::TYPE_OFFERS:
1046 case self::TAB_CATALOG:
1055 case self::TAB_SERVICE:
1070 $id = CIBlockElement::GetRealElement($id);
1087 $tabType = self::getProductTypeByTab(self::getCurrentTabFromRequest());
1088 if ($tabType !==
null)
1111 static::addTabParams(
$params);
1118 $params = self::getFormParams();
1123 ?><input type=
"hidden" name=
"<? echo htmlspecialcharsbx($key); ?>" value=
"<? echo htmlspecialcharsbx($value); ?>"><?
1125 unset(
$key, $value);
1139 if (empty($windowParams) || !is_array($windowParams))
1140 $windowParams =
array(
'width' => 700,
'height' => 400,
'resize' =>
false);
1142 if (isset($catalogButtons[
'add_product']))
1144 $params[self::$strMainPrefix.self::TAB_KEY] = self::TAB_CATALOG;
1149 "PARAMS" => $windowParams,
1152 $productButton =
array(
1155 'ACTION' =>
'javascript:'.
$action,
1156 'ACTION_URL' =>
$url,
1158 'ICON' =>
'bx-context-toolbar-create-icon',
1159 'ID' =>
'bx-context-toolbar-add-element',
1162 $buttons[
'edit'][
'add_element'] = $productButton;
1163 $buttons[
'configure'][
'add_element'] = $productButton;
1164 $buttons[
'intranet'][] =
array(
1165 'TEXT' => $productButton[
'TEXT'],
1166 'TITLE' => $productButton[
'TITLE'],
1168 'ONCLICK' => $productButton[
'ACTION'],
1172 $url = str_replace(
'&bxpublic=Y&from_module=iblock',
'',
$url);
1173 $productButton[
'ACTION'] =
"javascript:jsUtils.Redirect([], '".CUtil::JSEscape(
$url).
"')";
1174 unset($productButton[
'ONCLICK']);
1175 $buttons[
'submenu'][
'add_element'] = $productButton;
1176 unset($productButton);
1179 if (isset($catalogButtons[
'add_sku']))
1181 $params[self::$strMainPrefix.self::TAB_KEY] = self::TAB_SKU;
1186 "PARAMS" => $windowParams,
1192 'ACTION' =>
'javascript:'.
$action,
1193 'ACTION_URL' =>
$url,
1195 'ICON' =>
'bx-context-toolbar-create-icon',
1196 'ID' =>
'bx-context-toolbar-add-sku',
1199 $buttons[
'edit'][
'add_sku'] = $skuButton;
1200 $buttons[
'configure'][
'add_sku'] = $skuButton;
1201 $buttons[
'intranet'][] =
array(
1202 'TEXT' => $skuButton[
'TEXT'],
1203 'TITLE' => $skuButton[
'TITLE'],
1205 'ONCLICK' => $skuButton[
'ACTION'],
1209 $url = str_replace(
'&bxpublic=Y&from_module=iblock',
'',
$url);
1210 $skuButton[
'ACTION'] =
"javascript:jsUtils.Redirect([], '".CUtil::JSEscape(
$url).
"')";
1211 unset($skuButton[
'ONCLICK']);
1212 $buttons[
'submenu'][
'add_sku'] = $skuButton;
1219 self::$strMainPrefix = (string)$strPrefix;
1224 return self::$strMainPrefix;
1229 self::setMainPrefix(
'');
1234 self::setMainPrefix(
'SUB');
1239 return self::$arErrors;
1245 $intID = (int)$intID;
1256 $intProductID = CIBlockElement::GetRealElement($intID);
1261 if ($boolFeatureSet)
1263 $request = Context::getCurrent()->getRequest();
1264 if (
$request->get(self::DELETE_GROUP) ===
'Y')
1284 $currentTab = self::getCurrentTabFromRequest();
1285 if ($currentTab !==
null)
1298 if (array_key_exists(self::$strMainPrefix.self::TAB_KEY,
$_REQUEST))
1299 unset(
$_REQUEST[self::$strMainPrefix.self::TAB_KEY]);
1300 if (array_key_exists(self::$strMainPrefix.self::TAB_KEY, $_POST))
1301 unset($_POST[self::$strMainPrefix.self::TAB_KEY]);
1318 $withDescr = ($withDescr ===
true);
1320 $iblockData = CCatalogSku::GetInfoByIBlock(
$iblockId);
1321 if (empty($iblockData))
1327 CCatalogSku::TYPE_CATALOG => [
1330 CCatalogSku::TYPE_PRODUCT => [
1334 CCatalogSku::TYPE_FULL => [
1339 CCatalogSku::TYPE_OFFERS => [
1354 if (!isset(
$data[$iblockData[
'CATALOG_TYPE']]))
1370 unset($extResult, $productList);
1384 $withDescr = ($withDescr ===
true);
1399 $extResult =
array();
1404 unset($extResult, $productList);
1412 $config[
'SYSTEM_UF_FIELDS'] =
'Y';
1420 $config[
'SYSTEM_UF_FIELDS'] =
'Y';
1421 $config[
'CUSTOM_UF_FIELDS'] =
'Y';
1435 if (!isset($product[
'ID']) || !isset($product[
'IBLOCK_ID']))
1439 $product[
'IBLOCK_ID'] = (int)$product[
'IBLOCK_ID'];
1440 if ($product[
'IBLOCK_ID'] <= 0)
1444 $product[
'PRODUCT_ID'] = (int)($product[
'PRODUCT_ID'] ?? CIBlockElement::GetRealElement($product[
'ID']));
1452 '=ID' => $product[
'PRODUCT_ID'],
1461 $systemFields = Catalog\Product\SystemField::getFieldNamesByRestrictions([
1462 'TYPE' => (
int)$row[
'TYPE'],
1463 'IBLOCK_ID' => $product[
'IBLOCK_ID'],
1465 if (empty($systemFields))
1474 unset($userFieldManager);
1481 $fields = array_intersect_key(
$fields, array_fill_keys($systemFields,
true));
1488 $product[
'PRODUCT_ID'],
1491 'external_fields' => [
1492 'IBLOCK_ID' => $product[
'IBLOCK_ID'],
1512 $useNewCard = (bool)(
$options[
'USE_NEW_CARD'] ??
false);
1514 $baseClearSkuFields = [
1516 'CATALOG_QUANTITY_RESERVED',
1517 'CATALOG_QUANTITY_TRACE',
1519 'CATALOG_PURCHASING_PRICE',
1520 'CATALOG_PURCHASING_CURRENCY',
1522 'CATALOG_VAT_INCLUDED',
1530 if (!$useNewCard && !$useCatalogTab)
1534 if (!$useCatalogTab)
1539 'CATALOG_QUANTITY_RESERVED',
1545 'CATALOG_QUANTITY_RESERVED',
1546 'CATALOG_QUANTITY_TRACE',
1563 $useNewCard = (bool)(
$options[
'USE_NEW_CARD'] ??
false);
1566 'CATALOG_QUANTITY' => $useInventoryManagment ?
false: [],
1567 'CATALOG_QUANTITY_RESERVED' => $useInventoryManagment ?
false : [],
1568 'CATALOG_AVAILABLE' =>
false,
1569 'CATALOG_QUANTITY_TRACE' => $useInventoryManagment ?
false : [],
1570 'CAN_BUY_ZERO' => $useInventoryManagment ?
false : [],
1571 'CATALOG_PURCHASING_PRICE' => $useInventoryManagment ?
false : [],
1572 'CATALOG_MEASURE_RATIO' => [],
1573 'CATALOG_MEASURE' => [],
1574 'CATALOG_VAT_INCLUDED' => [],
1576 'CATALOG_WEIGHT' => [],
1577 'CATALOG_WIDTH' => [],
1578 'CATALOG_LENGTH' => [],
1579 'CATALOG_HEIGHT' => [],
1580 'CATALOG_BAR_CODE' =>
false,
1584 'CATALOG_QUANTITY' =>
false,
1585 'CATALOG_QUANTITY_RESERVED' =>
false,
1586 'CATALOG_AVAILABLE' =>
false,
1587 'CATALOG_QUANTITY_TRACE' =>
false,
1588 'CAN_BUY_ZERO' =>
false,
1589 'CATALOG_PURCHASING_PRICE' => [],
1590 'CATALOG_MEASURE_RATIO' =>
false,
1591 'CATALOG_MEASURE' =>
false,
1592 'CATALOG_VAT_INCLUDED' => [],
1594 'CATALOG_WEIGHT' =>
false,
1595 'CATALOG_WIDTH' => [],
1596 'CATALOG_LENGTH' => [],
1597 'CATALOG_HEIGHT' => [],
1598 'CATALOG_BAR_CODE' =>
false,
1601 $baseLockedSkuFields = [
1602 'CATALOG_QUANTITY' => $showCatalog && !$useInventoryManagment ? [] :
false,
1603 'CATALOG_QUANTITY_RESERVED' => $showCatalog && !$useInventoryManagment ? [] :
false,
1604 'CATALOG_AVAILABLE' =>
false,
1605 'CATALOG_QUANTITY_TRACE' => $showCatalog && !$useInventoryManagment ? [] :
false,
1606 'CAN_BUY_ZERO' => $showCatalog && !$useInventoryManagment ? [] :
false,
1607 'CATALOG_PURCHASING_PRICE' => $showCatalog ? [] :
false,
1608 'CATALOG_MEASURE_RATIO' => $showCatalog && !$useInventoryManagment ? [] :
false,
1609 'CATALOG_MEASURE' => $showCatalog ? [] :
false,
1610 'CATALOG_VAT_INCLUDED' => $showCatalog ? [] :
false,
1611 'VAT_ID' => $showCatalog ? [] :
false,
1612 'CATALOG_WEIGHT' => $showCatalog ? [] :
false,
1613 'CATALOG_WIDTH' => $showCatalog ? [] :
false,
1614 'CATALOG_LENGTH' => $showCatalog ? [] :
false,
1615 'CATALOG_HEIGHT' => $showCatalog ? [] :
false,
1616 'CATALOG_BAR_CODE' =>
false,
1623 $skuUnlock = $showCatalog || $useNewCard;
1626 'CATALOG_QUANTITY' => $skuUnlock && !$useInventoryManagment ? [] :
false,
1627 'CATALOG_QUANTITY_RESERVED' => $skuUnlock && !$useInventoryManagment ? [] :
false,
1628 'CATALOG_AVAILABLE' =>
false,
1629 'CATALOG_QUANTITY_TRACE' => $skuUnlock && !$useInventoryManagment ? [] :
false,
1630 'CAN_BUY_ZERO' => $skuUnlock && !$useInventoryManagment ? [] :
false,
1631 'CATALOG_PURCHASING_PRICE' => $skuUnlock ? [] :
false,
1632 'CATALOG_MEASURE_RATIO' => $skuUnlock && !$useInventoryManagment ? [] :
false,
1633 'CATALOG_MEASURE' => $skuUnlock ? [] :
false,
1634 'CATALOG_VAT_INCLUDED' => $skuUnlock ? [] :
false,
1635 'VAT_ID' => $skuUnlock ? [] :
false,
1636 'CATALOG_WEIGHT' => $skuUnlock ? [] :
false,
1637 'CATALOG_WIDTH' => $skuUnlock ? [] :
false,
1638 'CATALOG_LENGTH' => $skuUnlock ? [] :
false,
1639 'CATALOG_HEIGHT' => $skuUnlock ? [] :
false,
1640 'CATALOG_BAR_CODE' =>
false,
1649 'CATALOG_QUANTITY' =>
false,
1650 'CATALOG_QUANTITY_RESERVED' =>
false,
1651 'CATALOG_AVAILABLE' => [],
1652 'CATALOG_QUANTITY_TRACE' =>
false,
1653 'CAN_BUY_ZERO' =>
false,
1654 'CATALOG_PURCHASING_PRICE' => [],
1655 'CATALOG_MEASURE_RATIO' =>
false,
1656 'CATALOG_MEASURE' => [],
1657 'CATALOG_VAT_INCLUDED' => [],
1659 'CATALOG_WEIGHT' =>
false,
1660 'CATALOG_WIDTH' =>
false,
1661 'CATALOG_LENGTH' =>
false,
1662 'CATALOG_HEIGHT' =>
false,
1663 'CATALOG_BAR_CODE' =>
false,
1671 if (!isset($product[
'ID']) || !isset($product[
'IBLOCK_ID']) || !isset($product[
'TYPE']))
1675 $product[
'IBLOCK_ID'] = (int)$product[
'IBLOCK_ID'];
1676 if ($product[
'IBLOCK_ID'] <= 0)
1680 $product[
'PRODUCT_ID'] = (int)($product[
'PRODUCT_ID'] ?? CIBlockElement::GetRealElement($product[
'ID']));
1681 $product[
'TYPE'] = (int)$product[
'TYPE'];
1688 $userFieldManager = Main\UserField\Internal\UserFieldHelper::getInstance()->getManager();
1689 $productUserFields = $userFieldManager->GetUserFields(
1690 Catalog\ProductTable::getUfId(),
1691 $product[
'PRODUCT_ID'],
1694 if (empty($productUserFields))
1701 foreach (array_keys($productUserFields) as $fieldName)
1703 $productUserFields[$fieldName][
'VALUE_ID'] = $product[
'PRODUCT_ID'];
1704 $productUserFields[$fieldName][
'EDIT_FORM_LABEL'] = $productUserFields[$fieldName][
'EDIT_FORM_LABEL']
1706 $productUserFields[$fieldName][
'FIELD_NAME']
1710 $productUserFields[$fieldName][
'EDIT_IN_LIST'] =
'N';
1716 $showSystemFields = (
$config[
'SYSTEM_UF_FIELDS'] ??
'N') ===
'Y';
1717 $showCustomFields = (
$config[
'CUSTOM_UF_FIELDS'] ??
'N') ===
'Y';
1719 if (!$showSystemFields && !$showCustomFields)
1724 $request = Main\Context::getCurrent()->getRequest();
1726 if ($showSystemFields)
1728 $html = Catalog\Product\SystemField::renderAdminEditForm(
1738 $allSystemFields = Catalog\Product\SystemField::getFieldNamesByRestrictions([]);
1739 if (!empty($allSystemFields))
1741 $productUserFields = array_diff_key(
1743 array_fill_keys($allSystemFields,
true)
1746 unset($allSystemFields);
1750 && !empty($productUserFields)
1753 foreach ($productUserFields as $fieldName => $row)
1755 $result[1] .= $userFieldManager->GetEditFormHTML(
1757 $request->getPost($fieldName) ??
'',
1799 if (empty($productIds))
1808 if (empty($allowedStores))
1814 Catalog\StoreProductTable::class
1822 'QUANTITY_RESERVED' => 0,
1832 'SUM_QUANTITY_RESERVED',
1834 'filter' => array_merge(
1836 '@PRODUCT_ID' => $pageIds,
1837 '=STORE.ACTIVE' =>
'Y',
1851 $id = (int)$row[
'PRODUCT_ID'];
1853 'QUANTITY' => (float)$row[
'SUM_QUANTITY'],
1854 'QUANTITY_RESERVED' => (
float)$row[
'SUM_QUANTITY_RESERVED'],
1879 self::$strMainPrefix = (string)$strPrefix;
1884 return self::$strMainPrefix;
1897 return self::$intTypeID;
1925 $strPrefix =
'SUB'.(CCatalogProductSet::TYPE_SET ==
$intTypeID ? self::PREFIX_SET : self::PREFIX_GROUP);
1937 'ITEM_ID' => $intProductID,
1940 'ITEMS' => self::getEmptyItem(0),
1941 'NEW_ITEM_COUNT' => self::NEW_ITEM_COUNT
1958 switch(self::$intTypeID)
1966 'DISCOUNT_PERCENT' =>
'',
1969 'EMPTY_ITEM' =>
true,
1982 'EMPTY_ITEM' =>
true,
1997 if (empty($arSets) || !is_array($arSets))
2001 if (!$boolFeatureSet)
2004 if (!isset(self::$arSrcValues[self::$strMainPrefix]) || empty(self::$arSrcValues[self::$strMainPrefix]))
2007 foreach (self::$arSrcValues[self::$strMainPrefix] as $setKey => $setData)
2009 if (empty($setData[
'ITEMS']))
2011 if (array_key_exists($setKey, $arSets))
2012 unset($arSets[$setKey]);
2015 $newSetData = $setData;
2016 unset($newSetData[
'ITEMS']);
2018 $setItems =
array();
2020 foreach ($setData[
'ITEMS'] as $itemKey => $item)
2022 if (empty($item[
'ITEM_ID']) || trim($item[
'ITEM_ID'] ==
''))
2024 $itemKey = (int)$itemKey;
2027 $setItems[$itemKey] = $item;
2031 $setItems[
'n'.$newItemCount] = $item;
2035 unset($itemKey, $item);
2037 $newSetData[
'ITEMS'] = $setItems;
2038 $newSetData[
'NEW_ITEM_COUNT'] = $newItemCount;
2040 if (isset($arSets[$setKey]))
2042 $arSets[$setKey] = array_merge($newSetData, $arSets[$setKey]);
2043 $arSets[$setKey][
'ITEMS'] = $newSetData[
'ITEMS'];
2044 $arSets[$setKey][
'NEW_ITEM_COUNT'] = $newSetData[
'NEW_ITEM_COUNT'];
2048 $arSets[$setKey] = $newSetData;
2050 unset($newSetData, $newItemCount, $setItems);
2052 unset($setKey, $setData);
2057 if (empty($arSets) || !is_array($arSets))
2060 foreach ($arSets as $setKey => $setData)
2062 $start = $setData[
'NEW_ITEM_COUNT'] ?? 0;
2063 foreach (self::getEmptyItem(
$start) as $rowKey => $row)
2064 $arSets[$setKey][
'ITEMS'][$rowKey] = $row;
2065 $arSets[$setKey][
'NEW_ITEM_COUNT'] =
$start + self::NEW_ITEM_COUNT;
2066 unset($rowKey, $row,
$start);
2068 unset($setKey, $setData);
2073 $itemList =
array();
2075 if (empty($arSets) || !is_array($arSets))
2077 foreach ($arSets as
$key => $arOneSet)
2079 foreach ($arOneSet[
'ITEMS'] as $keyItem => $arItem)
2081 if (
'' == $arItem[
'ITEM_ID'])
2083 $intItemID = (int)$arItem[
'ITEM_ID'];
2084 if (0 >= $intItemID)
2086 if (!isset($itemList[$intItemID]))
2088 $itemList[$intItemID] =
array();
2089 $itemIds[] = $intItemID;
2091 $itemList[$intItemID][] = &$arSets[
$key][
'ITEMS'][$keyItem];
2094 if (!empty($itemList))
2097 'select' =>
array(
'ID',
'NAME'),
2098 'filter' =>
array(
'@ID' => $itemIds)
2100 while ($product = $productIterator->fetch())
2102 $product[
'ID'] = (int)$product[
'ID'];
2103 if (!isset($itemList[$product[
'ID']]))
2105 foreach ($itemList[$product[
'ID']] as &$setItem)
2106 $setItem[
'ITEM_NAME'] = $product[
'NAME'];
2109 unset($product, $productIterator);
2111 if (!empty($productRatio))
2113 foreach ($productRatio as $productId => $productData)
2115 if (!isset($itemList[$productId]))
2117 foreach ($itemList[$productId] as &$setItem)
2119 $setItem[
'RATIO'] = $productData[
'RATIO'];
2120 $setItem[
'MEASURE'] = $productData[
'MEASURE'];
2124 unset($productId, $productData);
2126 unset($productRatio);
2128 unset($itemIds, $itemList);
2133 if (empty($arSets) || !is_array($arSets))
2137 foreach ($arSets as $oneSet)
2141 foreach ($oneSet[
'ITEMS'] as $oneItem)
2143 $items[
'n'.$itemIndex] = $oneItem;
2148 'ACTIVE' => $oneSet[
'ACTIVE'],
2149 'SORT' => $oneSet[
'SORT'],
2151 'NEW_ITEM_COUNT' => $itemIndex
2163 if (empty($arSets) || !is_array($arSets))
2167 if (!$boolFeatureSet)
2170 Main\Page\Asset::getInstance()->addJs(
'/bitrix/js/catalog/tbl_edit.js');
2174 foreach ($arSets as
$key => $arOneSet)
2176 $blockName = self::$strMainPrefix.
'_'.$arOneSet[
'ITEM_ID'];
2177 $blockName .=
'_'.Main\Security\Random::getString(8,
true);
2179 $strNamePrefix = self::$strMainPrefix.
'['.
$key.
']';
2180 $strIDPrefix = $blockName.
'_'.
$key;
2181 ?><table
id=
"<? echo $strIDPrefix; ?>_TBL" class=
"internal" style=
"margin: 0 auto;">
2182 <tr
class=
"heading">
2183 <td
class=
"align-left"><? echo
Loc::getMessage(
'BT_CAT_SET_ITEM_NAME'); ?></td>
2184 <td
class=
"align-right"><? echo
Loc::getMessage(
'BT_CAT_SET_ITEM_QUANTITY'); ?></td>
2185 <td
class=
"align-left">&
nbsp;</td><?
2188 ?><td
class=
"align-right"><? echo
Loc::getMessage(
'BT_CAT_SET_ITEM_DISCOUNT_PERCENT_EXT'); ?></td><?
2191 <td
class=
"align-right"><? echo
Loc::getMessage(
'BT_CAT_SET_ITEM_SORT'); ?></td><?
2203 'NEW_ITEM' => SORT_ASC,
2204 'EMPTY_ITEM' => SORT_ASC,
2205 'SORT' =>
array(SORT_NUMERIC, SORT_ASC),
2206 'ITEM_ID' =>
array(SORT_NUMERIC, SORT_ASC)
2209 'NEW_ITEM' =>
function($value)
2211 return !is_null($value);
2213 'EMPTY_ITEM' =>
function($value)
2215 return !is_null($value);
2221 foreach ($arOneSet[
'ITEMS'] as $keyItem => $arOneItem)
2223 $arItemParams =
array(
2226 'NAME_PREFIX' => $strNamePrefix.
'[ITEMS]['.$keyItem.
']',
2227 'ID_PREFIX' => $strIDPrefix.
'_ITEMS_'.$keyItem
2233 <div
style=
"margin: 10px auto; text-align: center;">
2234 <input
class=
"adm-btn-big" type=
"button" id=
"<? echo $strIDPrefix; ?>_ITEMS_ADD" value=
"<? echo Loc::getMessage('BT_CAT_SET_ITEM_ADD'); ?>" title=
"<? echo Loc::getMessage('BT_CAT_SET_ITEM_ADD_TITLE'); ?>">
2236 <input type=
"hidden" id=
"<? echo $strIDPrefix; ?>_ITEMS_CNT" value=
"<? echo (int)$arOneSet['NEW_ITEM_COUNT']; ?>"><?
2237 $arNewParams =
array(
2240 'NAME_PREFIX' => $strNamePrefix.
'[ITEMS][ntmp_xxx]',
2241 'ID_PREFIX' => $strIDPrefix.
'_ITEMS_ntmp_xxx'
2246 $arJSParams =
array(
2247 'PREFIX' => $strIDPrefix.
'_ITEMS_',
2248 'PREFIX_NAME' => $strNamePrefix.
'[ITEMS]',
2249 'TABLE_PROP_ID' => $strIDPrefix.
'_TBL',
2250 'PROP_COUNT_ID' => $strIDPrefix.
'_ITEMS_CNT',
2251 'BTN_ID' => $strIDPrefix.
'_ITEMS_ADD',
2252 'CELLS' => $arCellInfo[
'CELLS'],
2253 'CELL_PARAMS' => $arCellInfo[
'CELL_PARAMS'],
2255 'SEARCH_PAGE' => (defined(
'SELF_FOLDER_URL') ?
'/shop/settings/' :
'/bitrix/admin/').
'cat_product_search_dialog.php',
2259if (!window.ob<?=$blockName; ?>)
2261 window.ob<?=$blockName; ?> =
new JCCatTblEditExt(<? echo CUtil::PhpToJSObject($arJSParams); ?>);
2274 $strNamePrefix =
$arParams[
'NAME_PREFIX'];
2278 <td
class=
"align-left">
2279 <input name=
"<? echo $strNamePrefix; ?>[ITEM_ID]" id=
"<? echo $strIDPrefix; ?>_ITEM_ID" value=
"<? echo htmlspecialcharsbx($arRow['ITEM_ID']); ?>" size=
"5" type=
"text">
2280 <input type=
"button" value=
"..." id=
"<? echo $strIDPrefix; ?>_BTN" data-row-
id=
"<? echo $strIDPrefix; ?>">
2281 &
nbsp;<span
id=
"<? echo $strIDPrefix; ?>_ITEM_ID_link"><? echo
htmlspecialcharsEx($arRow[
'ITEM_NAME']); ?></span>
2283 <td
class=
"align-right">
2284 <input type=
"text" size=
"5" name=
"<? echo $strNamePrefix; ?>[QUANTITY]" id=
"<? echo $strIDPrefix; ?>_QUANTITY" value=
"<? echo htmlspecialcharsbx($arRow['QUANTITY']) ?>">
2286 <td
class=
"align-left"><?
2288 if (isset($arRow[
'RATIO']) && isset($arRow[
'MEASURE']))
2290 $measure =
' * '.$arRow[
'RATIO'].
' '.$arRow[
'MEASURE'][
'SYMBOL_RUS'];
2292 ?><span
id=
"<? echo $strIDPrefix; ?>_MEASURE"><? echo $measure; ?></span></td><?
2295 ?><td
class=
"align-right">
2296 <input type=
"text" size=
"3" name=
"<? echo $strNamePrefix; ?>[DISCOUNT_PERCENT]" id=
"<? echo $strIDPrefix; ?>_DISCOUNT_PERCENT" value=
"<? echo htmlspecialcharsbx($arRow['DISCOUNT_PERCENT']) ?>">
2300 <td
class=
"align-right">
2301 <input type=
"text" size=
"3" name=
"<? echo $strNamePrefix; ?>[SORT]" id=
"<? echo $strIDPrefix; ?>_SORT" value=
"<? echo htmlspecialcharsbx($arRow['SORT']) ?>">
2307 <input type=
"hidden" name=
"<? echo $strNamePrefix; ?>[DEL]" id=
"<? echo $strIDPrefix; ?>_DEL_N" value=
"N">
2309 if (0 < (
int)$strKey)
2311 ?><input type=
"checkbox" name=
"<? echo $strNamePrefix; ?>[DEL]" id=
"<? echo $strIDPrefix; ?>_DEL" value=
"Y"><?
2327 $strNamePrefix =
$arParams[
'NAME_PREFIX'];
2332 $arCellParams =
array();
2333 $arCells[] =
'<input name="'.$strNamePrefix.
'[ITEM_ID]" id="'.$strIDPrefix.
'_ITEM_ID" value="" size="5" type="text">'.
2334 ' <input type="button" value="..." id="'.$strIDPrefix.
'_BTN" data-row-id="'.$strIDPrefix.
'">'.
2335 ' <span id="'.$strIDPrefix.
'_ITEM_ID_link"></span>';
2336 $arCellParams[] =
array(
2338 'className' =>
'align-left'
2341 $arCells[] =
'<input type="text" size="5" name="'.$strNamePrefix.
'[QUANTITY]" id="'.$strIDPrefix.
'_QUANTITY" value="">';
2342 $arCellParams[] =
array(
2344 'className' =>
'align-right'
2347 $arCells[] =
'<span id="'.$strIDPrefix.
'_MEASURE"></span>';
2348 $arCellParams[] =
array(
2350 'className' =>
'align-left'
2355 $arCells[] =
'<input type="text" size="3" name="'.$strNamePrefix.
'[DISCOUNT_PERCENT]" id="'.$strIDPrefix.
'_DISCOUNT_PERCENT" value="">';
2356 $arCellParams[] =
array(
2358 'className' =>
'align-right'
2362 $arCells[] =
'<input type="text" size="3" name="'.$strNamePrefix.
'[SORT]" id="'.$strIDPrefix.
'_SORT" value="100">';
2363 $arCellParams[] =
array(
2365 'className' =>
'align-right'
2370 $arCells[] =
'<input type="hidden" name="'.$strNamePrefix.
'[DEL]" id="'.$strIDPrefix.
'_DEL_N" value="N">'.
2372 ?
'<input type="checkbox" name="'.$strNamePrefix.
'[DEL]" id="'.$strIDPrefix.
'_DEL" value="Y">'
2375 $arCellParams[] =
'';
2380 'CELL_PARAMS' => $arCellParams
2386 self::$arErrors =
array();
2389 if (!$boolFeatureSet)
2392 self::$arSrcValues[self::$strMainPrefix] =
array();
2393 self::$arCheckValues[self::$strMainPrefix] =
array();
2395 if (isset($_POST[self::$strMainPrefix]) && is_array($_POST[self::$strMainPrefix]))
2398 self::$arSrcValues[self::$strMainPrefix] = $_POST[self::$strMainPrefix];
2400 foreach (self::$arSrcValues[self::$strMainPrefix] as
$key => $arOneSet)
2402 $boolNew = (0 >= (int)
$key);
2404 'TYPE' => self::$intTypeID,
2405 'ITEM_ID' => $arItem[
'PRODUCT_ID'],
2413 foreach ($arOneSet[
'ITEMS'] as $keyItem => $arOneItem)
2415 if (
'Y' == $arOneItem[
'DEL'])
2417 $itemId = (isset($arOneItem[
'ITEM_ID']) ? (int)$arOneItem[
'ITEM_ID'] : 0);
2421 $arOneItem[
'DISCOUNT_PERCENT'] = trim($arOneItem[
'DISCOUNT_PERCENT']);
2422 $arSaveItem =
array(
2423 'ITEM_ID' => $itemId,
2424 'QUANTITY' => $arOneItem[
'QUANTITY'],
2425 'DISCOUNT_PERCENT' => (
'' == $arOneItem[
'DISCOUNT_PERCENT'] ?
false : $arOneItem[
'DISCOUNT_PERCENT']),
2426 'SORT' => $arOneItem[
'SORT']
2428 if ((
int)$keyItem <= 0)
2429 self::$arSrcValues[self::$strMainPrefix][
$key][
'ITEMS'][$keyItem][
'NEW_ITEM'] =
true;
2431 $arSaveSet[
'ITEMS'][] = $arSaveItem;
2433 unset($keyItem, $arOneItem);
2437 foreach ($arOneSet[
'ITEMS'] as $keyItem => $arOneItem)
2439 if (
'Y' == $arOneItem[
'DEL'])
2441 $itemId = (isset($arOneItem[
'ITEM_ID']) ? (int)$arOneItem[
'ITEM_ID'] : 0);
2445 $arSaveItem =
array(
2446 'ITEM_ID' => $itemId,
2447 'QUANTITY' => $arOneItem[
'QUANTITY'],
2448 'SORT' => $arOneItem[
'SORT']
2450 if ($arSaveItem[
'QUANTITY'] ==
'')
2451 $arSaveItem[
'QUANTITY'] = 1;
2452 if ((
int)$keyItem <= 0)
2453 self::$arSrcValues[self::$strMainPrefix][
$key][
'ITEMS'][$keyItem][
'NEW_ITEM'] =
true;
2455 $arSaveSet[
'ITEMS'][] = $arSaveItem;
2457 unset($keyItem, $arOneItem);
2462 $arSaveSet[
'DEL'] =
'Y';
2466 $arTestSet = $arSaveSet;
2478 self::$arErrors[
$key] = $ex->GetString();
2482 self::$arCheckValues[self::$strMainPrefix][
$key] = $arSaveSet;
2488 return (empty(self::$arErrors));
2496 if (!$boolFeatureSet)
2499 if (0 >= $arItem[
'PRODUCT_ID'])
2502 if (!empty(self::$arCheckValues[self::$strMainPrefix]))
2504 foreach (self::$arCheckValues[self::$strMainPrefix] as
$key => $arSaveSet)
2507 if (0 >= $arSaveSet[
'ITEM_ID'])
2508 $arSaveSet[
'ITEM_ID'] = $arItem[
'PRODUCT_ID'];
2509 $boolNew = (0 >= (int)
$key);
2512 if (!isset($arSaveSet[
'DEL']) || $arSaveSet[
'DEL'] !=
'Y')
2517 if (isset($arSaveSet[
'DEL']) && $arSaveSet[
'DEL'] ==
'Y')
2524 unset(
$key, $arSaveSet);
2530 return self::$arErrors;
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
static getCatalogServicesHelpLink()
static getProductSetsHelpLink()
static isProductSetsEnabled()
static isProductCardSliderEnabled()
static isUsedInventoryManagement()
static getExceedingProductLimit(int $iblockId, ?int $sectionId=null)
static needSummaryStoreAmountByPermissions()
static allowedShowQuantityColumns()
static update($id, array $data)
static getList(array $parameters)
static getCurrentRatioWithMeasure($product)
static getProductTypes($descr=false)
static get($moduleId, $name, $default="", $siteId=false)
static includeModule($moduleName)
static getMessage($code, $replace=null, $language=null)
static getRow(array $parameters)
static getList(array $parameters=array())
static normalizeArrayValuesByInt(&$map, $sorted=true)
static sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
static showEditForm($arSets)
static setSkuFormParams($arParams)
static showItemRow($arRow, $arParams)
static setMainPrefix($strPrefix)
static addEmptyValues(&$arSets)
static setProductFormParams($arParams)
static getItemsInfo(&$arSets)
static checkFormValues($arItem)
static getEmptyItem($arParams)
static getFormValues(&$arSets)
static getJSRow($arParams)
static setTypeID($intTypeID)
static saveFormValues($arItem)
static clearOwnerSet(&$arSets)
static getEmptySet($intProductID)
static deleteAllSetsByProduct($intProductID, $intSetType)
static checkFields($strAction, &$arFields, $intID=0)
static disableShowErrors()
static enableShowErrors()
static update($intID, $arFields)
static isProductInSet($intProductID, $intSetType=0)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(! $catalogEdit->isSuccess()) $iblock
bitrix_sessid_get($varname='sessid')
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
<? endif;?> window document title
if(empty($signedUserToken)) $key
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_CATALOG_EXPORT_EDIT)) if((!isset($_REQUEST['IBLOCK_ID']))||($_REQUEST['IBLOCK_ID']=='')) $intIBlockID