Столкнулся с такой проблемой в некоторых проектах. Решал разными путями.
Способ 1.
Написали код который берет все разделы в которых есть товары, берет заполненные свойства этих товаров, и добавляет их к разделу в котором находится товар.
Пример:
Есть следующая структура каталога
1. Одежда и Обувь
1.1 Одежда
1.2 Обувь
На эту структуру есть ГЛОБАЛЬНЫЕ(т.е. они видны в каждом разделе) свойства
1. Пол
2. Размер одежды
3. Размер обуви
При условии что у товаров в разделах заполнены необходимые свойства, т.е. в разделе "Одежда" заполнено свойство "Размер одежды", и не заполнено свойство "Размер обуви", данные скрипт добавит в раздел "Одежда" свойства "Размер одежды" и "Пол".
По коду думаю все понятно.
Все заполненные свойства у товара, добавляются к разделу, в котором этот товар находится. Можно указать в массиве $arGlobalProperty коды свойств, которые нужно пропускать и не трогать.
Код |
---|
<?php
/**
* Обмен с 1С создает свойства но не привязывает их к разделам.
* Файл собирает свойства товаров, и добавляет их к разделу в котором находятся товары
*/
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
set_time_limit(0);
CModule::IncludeModule("iblock");
$IBLOCK_ID = 1; // ID Инфоблока каталога
// Список кодов свойств которые не должны привязываться НИ К ОДНОМУ разделу
$arGlobalProperty = array(
0 => "CML2_TAXES",
1 => "VYGRUZHAT_V_INTERNET_MAGAZIN",
2 => "CML2_TRAITS",
3 => "CML2_BASE_UNIT",
4 => "CML2_ARTICLE",
5 => "ANALOG",
6 => "SOPUT",
7 => "SOPUT_SECT",
8 => "ANALOG_SECT",
9 => "RATING",
10 => "QUANTITY_MOSCOW",
11 => "QUANTITY_VORONEG",
12 => "QUANTITY_BELGOROD",
13 => "DOSTUPNOST_BELGOROD",
14 => "DOSTUPNOST_VORONEZH",
15 => "DOSTUPNOST_MOSKVA",
16 => "DOSTUPNOST_BELGOROD_1",
17 => "DOSTUPNOST_VORONEZH_1",
18 => "DOSTUPNOST_MOSKVA_1",
19 => "FILES",
);
// Берем все активные разделы
$CIBlockResultSection = CIBlockSection::GetList(
Array("left_margin" => "ASC"), Array(
"IBLOCK_ID" => $IBLOCK_ID,
"ACTIVE" => "Y",
"ELEMENT_SUBSECTIONS" => "N"
),
true
);
$arSectionProperty = array();
while ($arSection = $CIBlockResultSection->Fetch()) {
// если в разделе есть свойства
if ($arSection["ELEMENT_CNT"] > 0) {
// беру товары этого раздела
$CIBlockResult = CIBlockElement::GetList(Array("SORT"=>"ASC"),Array(
"ACTIVE" => "Y",
"IBLOCK_ID" => $IBLOCK_ID,
"SECTION_ID" => $arSection["ID"],
"INCLUDE_SUBSECTIONS" => "N"
));
// для каждого товара собираю массив заполненных свойств
while ($objElement = $CIBlockResult->GetNextElement()) {
$arPropertyElement = $objElement->GetProperties();
foreach ($arPropertyElement as $arProp) {
if ($arProp["VALUE"] != null && !in_array($arProp["CODE"], $arGlobalProperty)) {
// сохраняю это свойство, его нужно добавить к разделу
$arSectionProperty[$arSection["ID"]] = $arSection;
$arSectionProperty[$arSection["ID"]]["PROPERTY"][$arProp["ID"]] = $arProp;
}
}
}
}
}
// Выставляем свойства для разделов
foreach ($arSectionProperty as $arSection) {
?><h5><?=$arSection["NAME"];?> #<?=$arSection["ID"]?></h5><?
foreach ($arSection["PROPERTY"] as $propID => $arProp) {
CIBlockSectionPropertyLink::Delete(0, $propID);
CIBlockSectionPropertyLink::Delete((int)$arSection["ID"], $propID);
$res = CIBlockSectionPropertyLink::Add($arSection["ID"], $propID, $arLink = array());
?><div>Добавленно свойство #<?=$propID?> - <?=$arProp["NAME"];?> </div><?
}
}
|
2. Другой способ полуавтоматический. Допустим на детальной странице товара, мы отображаем только НЕ ПУСТЫЕ свойства.
Так из примера выше у товара в разделе "Одежда", будет отображаться только свойство "Пол" и "Размер одежды".
Для администраторов мы выводили ссылку на файл
<a href="путь_до_файла?SECTION_ID=(Раздел товара)&PROPERTY_ID=(свойство которое хотим добавить в раздел)">Добавить свойство в раздел</a>
В файле был следующий код:
Код |
---|
<?php
// подключение служебной части пролога
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
$iblockCatalogID = 15;
$CIBlockResultSection = CIBlockSection::GetList(
Array("left_margin" => "ASC"),
Array("IBLOCK_ID" => $iblockCatalogID,"ACTIVE"=>"Y"),
false,
Array(),
false
);
$res = false;
if ($_REQUEST["SECTION_ID"] != 0 && $_REQUEST["PROPERTY_ID"] != 0) {
CIBlockSectionPropertyLink::Delete(0, $_REQUEST["PROPERTY_ID"]);
CIBlockSectionPropertyLink::Delete((int)$_REQUEST["SECTION_ID"], $_REQUEST["PROPERTY_ID"]);
$res = CIBlockSectionPropertyLink::Add($_REQUEST["SECTION_ID"], $_REQUEST["PROPERTY_ID"], $arLink = array());
echo '<pre>';
var_dump($res);
echo '</pre>';
}
?>
<fo rm style="">
<? if ($res) : ?>
<div>
<b>Свойство добавленно в раздел</b>
</div>
<? endif; ?>
<div>
<label>Раздел</label>
<select name="SECTION_ID">
<?php while ($arSection = $CIBlockResultSection->Fetch()) :
$space = "";
for($i = 0; $i < $arSection["DEPTH_LEVEL"]; $i++ ) {
$space .= " . ";
}
?>
<option value="<?=$arSection["ID"]?>"><?=$space . $arSection["NAME"]?></option>
<?php endwhile; ?>
</select>
<br />
<br />
<br />
</div>
<div>
<label>ID свойства</label>
<input type="text" name="PROPERTY_ID" value="" placeholder="ID свойства" />
</div>
<div>
<input type="submit" name="submit" value="Привязать свойство" />
</div>
</form>
|
,