Проблема множественных полей в 1с битрикс
В базе есть товары вида "Ящик 2 - 12 ячеек". Вместо адекватного разбиения на 11 товаров сделали 1 товар с подписью. Пришел я и нужно как-то автоматизировать процесс подсчета. Для подсчета используются данные из базы, наиболее важными являются объем и вес. Я попробовал использовать множественные поля, как решение, ожидая, что в выводе информации я буду получать 2 массива. 1 - весов, 2й - объемов.
Однако на выход я лишь получил перемножение вариантов. То есть мне вывелось 11*11 комбинаций.
Покажу лишь часть
Для вывода из php использую такой код:
$arSort = array("SORT" => "ASC", "NAME" => "ASC");
$arFilter = array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y");
$arSelect = array("ID", "NAME", "PROPERTY_FILTER_PRICE", "PROPERTY_PR_VES","PROPERTY_PROD_VOLUME" , "DETAIL_PICTURE", "DETAIL_TEXT");
$obIBlockResult = CIBlockElement::GetList($arSort, $arFilter, false, false, $arSelect);
$data = array();
while ($arFields = $obIBlockResult->GetNext()) {
$data[] = $arFields;
}
if (isset($_GET['ELEMENT_ID'])) {
$elementId = intval($_GET["ELEMENT_ID"]);
$obIBlockResult = CIBlockElement::GetByID($elementId);
if ($obIBlockResult && $obIBlockResult->SelectedElement()) {
$result = [];
while ($ob = $obIBlockResult->GetNextElement()) {
$arFields = $ob->GetFields();
$arProps = $ob->GetProperties();
$result[] = $arProps;
}
echo json_encode($result);
} else {
http_response_code(404);
echo "Элемент не найден";
}
}
Вот js
$("#chooseProduct").on("change.select2", function (e) {
var selectedId = e.target.value;
var selectedElement = null;
var elements = <?= json_encode($data) ?>;
console.log(elements) // Именно на этом этапе мне выводит 121 элемент
$('#product-image').css('display', 'flex');
$('#product-image').html(' <div class="circle"></div> <div class="circle" style = "animation-delay: 0.5s;"> </div> <div class="circle" style="animation-delay: 1s;"></div>');
for (var i = 0; i < elements.length; i++) {
if (elements[i].ID === selectedId) {
selectedElement = elements[i];
break;
}
}
$.ajax({
url: "?DETAIL_IMAGE=" + selectedElement.DETAIL_PICTURE,
success: function (pictureUrl) {
if (pictureUrl) {
$('#product-image').html('');
$('#product-image').css('display', 'inline');
$('<img>').attr('src', pictureUrl).attr('width', '400').attr('height', '400').appendTo('#product-image');
$('<div class="production-description">')
.html(selectedElement.DETAIL_TEXT)
.appendTo('#product-image');
$("#window").show()
} else {
$('#product-image').html('');
}
}
});
$('.money-count').text(`${selectedElement.PROPERTY_FILTER_PRICE_VALUE} рублей`);
updateTotalPrice();
window.selectedElement = selectedElement
})
;
function setPriceFields(product) {
$(".money-count").textContent = product.price
$(".total-money-count").textContent = product.price * product.count
}
function addProductToList() {
let counter = $('#count')[0];
let product = {}
console.log(selectedElement)
product.name = selectedElement.NAME;
product.priceForOne = parseFloat(selectedElement.PROPERTY_FILTER_PRICE_VALUE)
product.params = []
product.params.push(["Вес", selectedElement.PROPERTY_PR_VES_VALUE])
product.weight = parseFloat(selectedElement.PROPERTY_PR_VES_VALUE) * counter.value;
product.volume = parseFloat(selectedElement.PROPERTY_PROD_VOLUME_VALUE) * counter.value;
product.count = parseInt(counter.value)
product.priceForAll = parseFloat(product.priceForOne * product.count)
console.log(product)
counter.value = 1
window.products.push(product)
$("#product-image").hide()
clearPriceFields()
clearFirstSelect()
$(".button-container").show();
$(".adding_info").show();
}
Ответы (1 шт):
Автор решения: Konstantin Likhachev
→ Ссылка
Как вариант делаете
$iblockClass = \Bitrix\Iblock\Iblock::wakeUp($IBLOCK_ID)->getEntityDataClass();
$items = $iblockClass::getList([
"order" => ["SORT" => "ASC", "NAME" => "ASC"],
"filter" => ["ACTIVE" => "Y"],
"select" => ["ID", "NAME", "FILTER_PRICE", "PR_VES","PROD_VOLUME" , "DETAIL_PICTURE", "DETAIL_TEXT"]
]);
Затем в цикле через fetchObject
получаете данные
$data = [];
while ($item = $items->fetchObject()) {
$data[] = [
"ID" => $item->getId(),
"NAME" => $item->getName(),
"DETAIL_PICTURE" => $item->getDetailPicture(),
"DETAIL_TEXT" => $item->getDetailText(),
"PR_VES" => array_map(static function ($value) {
return $value->getValue();
}, $item->get("PR_VES")?->getAll()),
"PROD_VOLUME" => array_map(static function ($value) {
return $value->getValue();
}, $item->get("PROD_VOLUME")?->getAll()),
];
}